docker compose

728x90

Docker Compose

공식 문서 : https://docs.docker.com/compose/compose-file/compose-file-v3/

쿠버네티스를 사용하게 될 경우 도커 컴포즈를 사용할 일은 거의 없다.

도커 컴포즈는 도커 IaC 라고 보면 된다.

도커 컴포즈의 버전은 도커 엔진에 따라 다르므로 공식 문서를 확인하고 필요한 도커 컴포즈 버전을 사용하면 된다.

docker compose <커맨드> 로 실행한다.

docker-compose.yml 또는 docker-compose.yaml 에 코드를 작성해야 한다.

예제 1

version: '3'

services:
  web:
    image: httpd

version: ‘3’ 은 3의 가장 최신 버전을 사용, service 는 컨테이너이다.

docker compose run 과 up 은 다르다. up 은 도커 컴포즈를 생성할 때 사용하고 run 은 이미 띄워진 녀석을 다시 실행할 때 사용한다.

실행

docker compose up -d

프로젝트 목록 확인

docker compose ls

서비스 목록(컨테이너 목록)

docker compose ps

종료

docker compose down

예제 2

version: '3'

services:
  web:
    image: httpd
    restart: always
    ports:
      - 80:80
    environment:
      MSG: hello world
    volumes:
      - web-contents:/var/www/html
    networks:
      - web-net
  web2:
    image: nginx
    networks:
      - web-net

volumes:
  web-contents:

networks:
  web-net:

서비스 내부에 작성되는 networks 는 네트워크를 만드는 것이 아니라 이 컨테이너의 네트워크를 어디에 연결할 것인지 작성하는 곳이고 가장 바깥에 있는 networks 가 docker compose 가 사용할 네트워크의 이름을 지정하는 곳이다.

$ docker compose up
$ docker compose exec web bash
# apt update; apt install curl
# curl web2 

위 방식처럼 web 컨테이너에 접속을 한 후 curl 로 web2 에 바로 접근이 가능하다. 즉, link 를 해줄 필요가 없다.

도커 컴포즈에서는 컨테이너들끼리는 아이피를 알 필요 없이 이름으로 통신이 서로 가능하다.

예제 3

version: '3'

services:  
  myflask:    
    build: ./hello-flask  
  mydjango:    
    build: ./hello-django

hello-flask 와 hello-django 디렉토리에 도커 파일이 있고 build 에 의해 자동으로 도커 파일을 빌드하여 컨테이너를 띄운다.

/Users/csw/tmp/docker/jenkins_home/workspace

주로 예제 2의 방법을 많이 사용하고 현업에서는 도커 컴포즈 방식을 사용하지 않는다.

도커 컴포즈로 워드프레스 띄우기

도커 컴포즈로 컨테이너를 띄울 경우 어떤 녀석이 먼저 생성될지 모르기 때문에 depends_on 키워드를 사용해서 db 컨테이너가 생성된 후에 워드프레스 컨테이너가 생성되도록 했다.

나머지 환경 변수들은 도커 공식 이미지에 나와있는 환경 변수들이다.

version: '3'

services:
   db:
     image: mysql:5.7
     volumes:
       - ./mysql:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: 1234
       MYSQL_DATABASE: wordpress
       MYSQL_USER: admin
       MYSQL_PASSWORD: 1234
   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: admin
       WORDPRESS_DB_PASSWORD: 1234
       WORDPRESS_DB_NAME: wordpress
     volumes:
       - ./html:/var/www/html
728x90