Docker-compose
어떤 환경에서 어플리케이션을 실행할때 해당 어플리케이션은 여러개의 또 다른 어플리케이션에 종속적일수 있다.
예를들어 웹서버 어플리케이션 컨테이너가 있는데, 이 웹서버는 정보를 저장하는 db가 필요할수 있다.
이럴때 docker run 을 통해 웹서버 컨테이너를 만들고, 그 후 db 컨테이너를 만들어야 한다.
run 명령에 옵션으로 포트번호 환경변수등도 다 지정해줘야 한다.
docker network 생성
docker network create wordpress_net
mysql 컨테이너 생성
docker \
run \
--name "db" \
-v "$(pwd)/db_data:/var/lib/mysql" \
-e "MYSQL_ROOT_PASSWORD=123456" \
-e "MYSQL_DATABASE=wordpress" \
-e "MYSQL_USER=wordpress_user" \
-e "MYSQL_PASSWORD=123456" \
--network wordpress_net \
mysql:5.7
wordpress 컨테이너 생성
docker \
run \
--name app \
-v "$(pwd)/app_data:/var/www/html" \
-e "WORDPRESS_DB_HOST=db" \
-e "WORDPRESS_DB_USER=wordpress_user" \
-e "WORDPRESS_DB_NAME=wordpress" \
-e "WORDPRESS_DB_PASSWORD=123456" \
-e "WORDPRESS_DEBUG=1" \
-p 8080:80 \
--network wordpress_net \
wordpress:latest
새로운 환경에서 이렇게 컨테이너를 일일히 옵션까지 주면서 순서대로 만드는 것은 너무 불편하다!
docker network
위에서 wordpress_net 이라는 docker network 를 생성하고 db( mysql ), app( wordpress ) 컨테이너들을 --network wordpress_net 옵션으로 두 컨테이너를 하나의 네트워크로 묶어줬다.
이렇게 하나의 네트워크로 묶어줬기 때문에 wordpress 컨테이너를 실행할때 -e "WORDPRESS_DB_HOST=db" 처럼 db 라는 이름으로 db 컨테이너와 app 컨테이너를 연결시켜줄수 있던것이다.
docker-compose.yml
docker compose 는 이런 기나긴 명령어를 yml 파일에 미리 정의해 놓고 'docker compose up' 이라는 명령어로 긴 명령어들을 자동으로 실행해준다.
version: "3.7"
# docker network create wordpress_net
# docker-compose 에서는 자동으로 네트워크 만들어지고 컨테이너들은 자동 연결됨
services:
db: # 컨테이너 이름
image: mysql:5.7 # 이미지
volumes: # volume: host와 container 매핑
- ./db_data:/var/lib/mysql
restart: always
environment: # 환경변수
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress_user
MYSQL_PASSWORD: 123456
app:
depends_on: # wordpress 는 db를 사용하기 때문에 db 컨테이너 먼저 만들어져야함
- db
image: wordpress:latest
volumes:
- ./app_data:/var/www/html
ports: # 호스트 8080 포트와 컨테이너 80 포트 연결
- "8080:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wordpress_user
WORDPRESS_DB_PASSWORD: 123456
docker-compose 로 만들어진 컨테이너들은 자동으로 하나의 네트워크에 속하게 된다.
ref