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