Recommanded Free YOUTUBE Lecture: Learning and Hacking VPC

Docker-compose

소개

Docker를 이용하면 애플리케이션 개발과 배포를 단순화 할 수 있다. Docker는 어떻게 보면 가상 머신과 유사하지만 프로세스 기반으로 더 가볍고 더 빠르게 사용 할 수 있다.

하지만 여러 서비스로 구성된 애플리케이션의 경우 여러 컨테이너를 실행하고, 통신하고 종료하도록 관리하는 것은 복잡한 작업이 될 수 있다. Docker compose를 이용하면 YAML 파일을 이용해서 다중 컨테이너 환경을 쉽게 실행할 수 있다.

이 문서는 docker-compose의 설치와 실행을 취한 최소한의 정보만 포함하고 있다.

사전 조건

이 문서의 내용은 아래와 같은 환경을 기반으로 하고 있다.

Docker compose 설치

docker-compose 실행파일을 다운로드 한다.

$ curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

docker-compose 파일에 실행권한을 준다.

$ chmod +x /usr/local/bin/docker-compose
-rwxr-xr-x 1 root root 12737304  930 16:59 /usr/local/bin/docker-compose
$ ls -al /usr/local/bin/docker-compose

설치 성공했는지 확인해 보자.

$ docker-compose version
docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

docker-compose.yml 설정 파일

작업용 디렉토리를 하나 만들어서 거기에 작업을 진행한다.

$ mkdir nginx_compose
$ cd nginx_compose

docker-compose의 기본 설정파일은 docker-compose.yml 이다. 먼저 NginX 웹 서버를 실행하는 간단한 docker-compose.yml 을 만들어보자.

version: '3.7'
services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html

networks:
  srv_net:
    driver: bridge

docker-compose 파일은 version으로 시작된다. 이를 통해서 이 docker-compose의 실행 버전을 확인 할 수 있다.

docker-compose가 실행하는 각 컨테이너는 services 블록에 정의한다. 여기에서 Docker 이미지, Port, 볼륨과 같은 컨테이너를 실행하기 위한 정보들을 설정할 수 있다.

volumes 을 ./html:/user/share/nginx/html로 설정했는데, 로컬 PC의 html 디렉토리를 컨테이너의 /usr/share/nginx/html로 덮어쓴다. 테스트를 위해서 ./html 디렉토리 밑에 index.html 파일을 만들었다.

$ mkdir ./html

index.html의 파일 내용이다.

<h1>Hello World!</h1>

networks로 하나 이상의 네트워크를 설정할 수 있다. 여기에서는 bridge 타입의 srv_net를 정의했다. 그리고 "web" service가 srv_net를 이용하도록 했다. networks를 설정하지 않을 경우 default 네트워크가 설정된다.

docker-compose 실행

docker-compose.yml 파일이 준비되면 Docker compose를 실행해서, 컨테이너들 실행할 수 있다. docker-compose up 명령을 실행하면, nginx 이미지를 다운로드해서 새로운 컨테이너를 실행한다. -d 옵션으로 백그라운드 모드로 실행 할 수 있다.

docker-compose up -d

nginx 이미지가 없을 경우 아래와 같이 이미지를 다운로드한다.

Creating network "nginx_srv_net" with driver "bridge"
Pulling web (nginx:alpine)...

alpine: Pulling from library/nginx
96526aa774ef: Pull complete
f2004135e416: Pull complete
fbf1cf5026c4: Pull complete
38966af6931d: Pull complete
c3ee70732c61: Pull complete
7e2fd992447a: Pull complete
76cbc9ea6abf: Pull complete
37f8bcf34db7: Pull complete
Digest: sha256:4c93a3bd8bf95412889dd84213570102176b6052d88bb828eaf449c56aca55ef
Status: Downloaded newer image for nginx:alpine
Creating nginx_web_1 ... done

Docker compose가 성공적으로 실행됐는지 확인해보자.

docker-compose ps

명령을 실행하면, 실행중인 모든 컨테이너들의 정보가 출력된다.

   Name         Command                        State          Ports
---------------------------------------------------------------------
nginx_web_1   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:8080->80/tcp,:::8080->80/tcp

이제 웹 브라우저 혹은 curl로 테스트해보자.

$ curl localhost:8080
<h1>Hello World</h1>

모든 테스트가 긑났다면 "down"명령으로 컨테이너들을 삭제한다.

$ docker-compose down

docker compose 기본 명령

  • docker compose up: 컨테이너를 새로 시작한다.

  • docker compose down: 컨테이너를 삭제한다.

  • docker compose stop: 컨테이너의 실행을 잠시 중단한다.

  • docker compose start: (stop 으로)중단된 컨테이너를 다시 시작한다.

  • docker compose log: compose 로그를 확인한다.

  • docker compose ps : 컨테이너 실행 상태를 확인한다.