본문 바로가기

클라우드/도커

도커 컴포즈로 여러 컨테이너 실행하기

반응형

시스템은 일반적으로 단일 애플리케이션이나 미들웨어만으로 구성되는 것이 아니다. 웹 애플리케이션은 리버스 프록시 역할을 하는 웹 서버를 프론트엔드에 배치하고 그 뒤로 비즈니스 로직이 담긴 애플리케이션 서버가 위치해 데이터 스토어 등과 통신하는 구조로 완성된다. 여러 애플리케이션 간의 연동 및 통신, 그리고 이들 간의 의존관계를 통해 하나의 시스템이 구성된다.

도커는 애플리케이션 배포에 특화된 컨테이너다. 또한, 도커 컨테이너 = 단일 애플리케이션 이라고 봐도 무방하다. 애플리케이션 간의 연동 없이는 실용적 수준의 시스템을 구축할 수 없다. 다시 말하면, 도커 컨테이너로 시스템을 구축하면 하나 이상의 컨테이너가 서로 통신하며, 그 사이에 의존관계가 생긴다. 이런 방식으로 시스템을 구축하게 되면 단일 컨테이너를 다룰 때는 문제가 되지 않던 부분에도 주의가 필요해진다.

docker-compose 명령으로 컨테이너 실행하기

compose는 yaml 포맷으로 기술된 설정 파일로, 여러 컨테이너의 실행을 한 번에 관리할 수 있게 해준다.

예를 들어, 컨테이너 하나를 CLI환경에서 실행해 보면 아래와 같은 명령어가 필요하다.

docker container run -d -p 9000:8000 example/echo:latest

위 작업을 docker-composer 를 사용해 다시 수행할 것이다.


version: "3"
services:
  echo:
    image: example/echo:latest
    ports:
      - 9000:8000
  • services: echo는 컨테이너 이름
  • image: 도커 이미지
  • port: 포트 포워딩

이 정의에 따라 여러 컨테이너를 한꺼번에 시작하려면 docker-compose up 명령을 사용하면 된다.

아래와 같이 컨테이너가 생성되었는지 확인할 수 있다.

docker-compose down 명령어를 사용하면 docker-compose.yml파일에 정의된 모든 컨테이너가 정지 혹은 삭제된다. 정지할 컨테이너의 ID를 일일이 정해야 하는 docker container stop 명령어보다 훨씬 간편하다.

컴포즈를 사용하면 이미 존재하는 도커 이미지뿐만 아니라 docker-compose up 명령을 실행하면서 이미지를 함께 빌드해 새로 생성한 이미지를 실행할 수도 있다. docker-compose.yml파일에서 image 속성을 지정하는 대신, build 속성에 dockerfile이 위치한 상대 경로를 지정했다.


version: "3"
services:
  echo:
    build: .
    ports:
      - 9000:8000

개발과정에서 이미지가 자주 수정되는 경우에는 --build 옵션을 사용하는 것이 좋다.

컴포즈로 여러 컨테이너 실행하기

젠킨스 컨테이너 실행하기

젠킨스 이미지는 도커 허브에 올라와 있는 것을 이용했다.


version: "3"
services:
  master:
    container_name: master
    image: 2.249.3-lts-slim
    ports:
      - 8080:8080
    volumes:
      - ./jenkins_home:/var/jenkins_home
  • volumes: 호스트와 컨테이너 사이에 파일을 복사하는 것이 아니라 파일을 공유할 수 있는 매커니즘

컴포즈 실행하면 초기 설정에서 패스워드가 생성된다.


master    | Jenkins initial setup is required. An admin user has been created and a password generated.
master    | Please use the following password to proceed to installation:
master    |
master    | {PASSWORD}
master    |
master    | This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

http://localhost:8080으로 접속하면 다음과 같이 비밀번호를 입력하는 창에 위의 비밀번호를 입력 후에 'install suggested plugins' 선택한다.

젠킨스 공식 이미지에서는 /var/jenkins_home아래에 데이터가 저장된다.

마스터 젠킨스 용 SSH 키 생성

젠킨스를 운영할 때 단일 서버로 운영하는 경우는 흔치 않다. 관리 기능이나 작업 실행 지시 등은 마스터 인스턴스가 맡고, 작업을 실제로 진행하는 것은 슬레이브 인스턴스가 담당한다. 이러한 구성을 컴포즈로 만들어본다.

먼저 준비 작업으로 마스터가 슬레이브에 접속할 수 있도록 마스터 컨테이너에서 SSH키를 생성한다. 나중에 마스터가 슬레이브와 소통할 수 있으려면 이 키가 반드시 필요하므로 꼭 필요하다.


version: "3"
services:
  master:
    container_name: master
    image: jenkins/jenkins:2.249.3-lts-slim
    ports:
      - 8080:8080
    volumes:
      - ./jenkins_home:/var/jenkins_home
    links:
      - slave01

  slave01:
    container_name: slave01
    image: jenkinsci/ssh-slave
    environment:
      - JENKINS_SLAVE_SSH_PUBKEY=ssh-rsa AAAAB3NzaC1y....

JENKINS_SLAVE_SSH_PUBKEY 에는 호스트 시스템의 ./jenkins_home/.ssh/id_rsa.pub 의 내용을 그대로 붙여 넣으면 된다.

SSH 접속 대상 설정

슬레이브 컨테이너의 기본 준비는 끝났다. 그러나 아직 마스터 컨테이너가 어떻게 슬레이브 컨테이너를 찾아 추가할 것인가 하는 문제가 남아있다. links요소를 사용해 다른 services 그룹에 해당하는 다른 컨테이너와 통신하면 된다. 여기서는 master에 slaves01에 대한 links를 설정했다.

이후에, jenkins에 접속하여 아래와 같이 설정 한다.

credentials 는 아래와 같이 설정한다.

아래와 같은 에러가 발생하여, 환경변수를 추가하여 해결하였다.


Couldn't figure out the Java version of /usr/local/java/bin/java

참고로 docker 컨테이너에 접속하는 방법은 'docker exec -it ${docker_container_id} /bin/bash' 명령어를 사용하면 된다

정상적으로 구축되었다면 아래와 같이 오류없는 페이지가 나타난다.

반응형

'클라우드 > 도커' 카테고리의 다른 글

서비스와 스택  (0) 2021.11.29
도커 스웜  (0) 2021.11.28
컨테이너 실전 구축 및 배포  (0) 2021.10.31
도커 컨테이너  (0) 2021.10.17
도커 이미지와 컨테이너 기본 개념과 실행  (0) 2021.10.17