기존에는 jenkins를 통해 빌드된 war 파일을 local의 tomcat 서버에 복사했었다.
이번에는 jenkins를 통해 빌드된 war 파일을 SSH를 통하여 다른 서버에 복사해보자.
도커 컨테이너 형태로 실행할 수 있는 SSH 서버를 설치해보자. 여기서는 edowon0623/docker 이미지를 다운받겠다. 이 이미지는 리눅스 기반의 docker와 SSH server가 설치되어있다.
docker hub 에서 이미지 다운
docker pull edowon0623/docker
이미지 실행(windows)
docker run --privileged --name docker-server -itd -p 10022:22 -p 8081:8080 -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup edowon0623/docker:latest /usr/sbin/init
10022:22 : 이 포트 매핑은 호스트의 10022 포트를 컨테이너의 22 포트로 매핑한다. 즉, 호스트에서 10022 포트를 통해 컨테이너 내부의 SSH 서비스(포트 22)에 접근할 수 있다. SSH를 통해 컨테이너를 원격으로 제어하고 관리할 수 있다.
8081:8080 : 이 포트 매핑은 호스트의 8081 포트를 컨테이너의 8080 포트로 매핑한다. 이는 호스트에서 8081 포트를 통해 컨테이너 내부의 웹 애플리케이션 또는 서비스(포트 8080)에 접근할 수 있도록 한다. 예를 들어, 웹 브라우저에서 http://localhost:8081
을 열면 컨테이너 내부의 웹 애플리케이션에 연결할 수 있다.
컨테이너에 SSH로 접속
ssh root@localhost -p 10022
Password: P@ssw0rd
docker 컨테이너 기동
systemctl start docker
😱 컨테이너에 ssh로 접속은 가능하나 docker 컨테이너가 기동이 안되는 오류가 발생했다(systemctl start docker
명령어 입력시 오류가 남). 강의를 보면 windwos 환경에서는 위 방식 DinD(Docker in Docker)보다 DooD(Docker out of Docker)를 사용하도록 추천해서 DooD 방식으로 우회하였다.
DooD 특징
DooD(Docker out of Docker) : 실행하고자 하는 docker 내부에 있는 docker socket을 window pc에 있는 docker daemon의 소켓을 공유해서 실행
이미지 실행(windows)
docker run -itd --name docker-server -p 10022:22 -e container=docker --tmpfs /run --tmpfs /tmp -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /var/run/docker.sock:/var/run/docker.sock edowon0623/docker:latest /usr/sbin/init
컨테이너에 SSH로 접속
ssh root@localhost -p 10022
Password: P@ssw0rd
이제부터 windows의 도커 엔진을 공유해서 쓰기 때문에 systemctl start docker
명령어는 필요 없다. ssh 서버에서와 host pc에서 docker ps
를 통해 출력값을 비교해보자.
DooD 방식을 사용하여 성공적으로 ssh 서버가 windows 도커 엔진을 공유함을 확인할 수 있다.
Jenkins 관리 탭에서 Plugins 다운
Publish Over SSH 다운
Jenkins 관리의 System 설정 탭의 Publish over SSH 항목 추가
Item 생성
생성한 item을 build 하면 ssh 서버에 war 파일이 정상적으로 복사된다.
컨테이너 생성 및 실행
4-1. 필요시 Dockerfile 내용 수정(by vi 에디터) + Dockerfile 내에 tomcat 서버 들어가 있음.
4-2. image build : docker build -t docker-server -f Dockerfile .
4-3. 컨테이너 생성 및 실행 : docker run -p 8081:8080 --name mytomcat docker-server:latest
8081 쓰는 이유 : 현재 8080 port는 jenkins에 할당되어 있어서.
빌드후조치 탭에서 Exec command 추가
docker build -t docker-server -f Dockerfile .;
docker run -p 8081:8080 --name mytomcat docker-server:latest
첫 빌드시에는 빌드 success, 두번째 빌드부터는 Unstable이 뜬다. 해당 docker image와 컨테이너를 모두 삭제하고 다시 빌드하면 success가 뜬다. 왜냐하면 컨테이너가 이미 작동 중인데 다시 한번 실행한다는 의미라서 에러가 뜨는 것이다. 이를 Iac로 해결할 수 있다.