SSH + Docker가 설치되어 있는VM(컨테이너) 사용하기

이상훈·2023년 6월 13일
0

CICD

목록 보기
5/10

 기존에는 jenkins를 통해 빌드된 war 파일을 local의 tomcat 서버에 복사했었다.

참고 : [docker] Jenkins를 이용하여 local tomcat 서버에 배포하기

이번에는 jenkins를 통해 빌드된 war 파일을 SSH를 통하여 다른 서버에 복사해보자.

SSH 서버 접속

 도커 컨테이너 형태로 실행할 수 있는 SSH 서버를 설치해보자. 여기서는 edowon0623/docker 이미지를 다운받겠다. 이 이미지는 리눅스 기반의 docker와 SSH server가 설치되어있다.

docker hub 에서 이미지 다운

docker pull edowon0623/docker

DinD 방식

  1. 이미지 실행(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을 열면 컨테이너 내부의 웹 애플리케이션에 연결할 수 있다.

  1. 컨테이너에 SSH로 접속

    ssh root@localhost -p 10022
    Password: P@ssw0rd

  2. docker 컨테이너 기동

    systemctl start docker

😱 컨테이너에 ssh로 접속은 가능하나 docker 컨테이너가 기동이 안되는 오류가 발생했다(systemctl start docker 명령어 입력시 오류가 남). 강의를 보면 windwos 환경에서는 위 방식 DinD(Docker in Docker)보다 DooD(Docker out of Docker)를 사용하도록 추천해서 DooD 방식으로 우회하였다.


DooD 방식

DooD 특징

  • Host PC docker daemon이 사용하는 socket을 이용하여 docker client에서 컨테이너 실행.
  • docker client의 환경과 Host PC docker daemon 환경이 동일
    • docker images 및 컨테이너 목록이 동일
  • 컨테이너 내에서 docker daemon을 실행하기 위한 명령어 사용 불가
    • systemctl start docker 등
  • --privileged 옵션 사용하지 않음
  • Host PC Docker daemon이 사용하는 리소스 명과 충돌하지 않도록 설정 주의
    • container, volume mount, port 등

DooD(Docker out of Docker) : 실행하고자 하는 docker 내부에 있는 docker socket을 window pc에 있는 docker daemon의 소켓을 공유해서 실행

  1. 이미지 실행(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

  2. 컨테이너에 SSH로 접속

    ssh root@localhost -p 10022
    Password: P@ssw0rd

이제부터 windows의 도커 엔진을 공유해서 쓰기 때문에 systemctl start docker 명령어는 필요 없다. ssh 서버에서와 host pc에서 docker ps 를 통해 출력값을 비교해보자.

DooD 방식을 사용하여 성공적으로 ssh 서버가 windows 도커 엔진을 공유함을 확인할 수 있다.


SSH 서버에 파일 복사하기

  1. Jenkins 관리 탭에서 Plugins 다운

    Publish Over SSH 다운

  2. Jenkins 관리의 System 설정 탭의 Publish over SSH 항목 추가

    • Name : docker-server
    • Hostname : host IP 주소
      • IP 주소에 localhost 입력하면 안됨. localhost는 Jenkins 자체를 의미함.
    • Username : root
    • Password : P@ssw0rd
    • Port : 10022
  3. Item 생성

    • Post-build Actions의 Send build artifacts over SSH 선택
      • SSH Server
        • Name : [Publish over SSH에서 설정한 이름] ex) docker-server
        • Transfer set
          • Sources files : target/*.war
          • Remove prefix : target
          • Remote directory : .

생성한 item을 build 하면 ssh 서버에 war 파일이 정상적으로 복사된다.

  1. 컨테이너 생성 및 실행
    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에 할당되어 있어서.

  1. 8081 port로 접속하면 정상적으로 페이지에 접속할 수 있다.

Jenkins 이용해서 자동화

 빌드후조치 탭에서 Exec command 추가

docker build -t docker-server -f Dockerfile .;
docker run -p 8081:8080 --name mytomcat docker-server:latest

Iac의 필요성

 첫 빌드시에는 빌드 success, 두번째 빌드부터는 Unstable이 뜬다. 해당 docker image와 컨테이너를 모두 삭제하고 다시 빌드하면 success가 뜬다. 왜냐하면 컨테이너가 이미 작동 중인데 다시 한번 실행한다는 의미라서 에러가 뜨는 것이다. 이를 Iac로 해결할 수 있다.

profile
Problem Solving과 기술적 의사결정을 중요시합니다.

0개의 댓글