compose는 컨테이너 간의 관계를 문서화하여, 쉽게 컨테이너를 운영할 수 있게 한다.
웹 브라우저에서 Wordpress에 접속하면 MySQL에 접속하고, 작업한 결과물을 웹 브라우저로 보내주는 환경을 docker compose를 통해 만들어보자.
https://gist.github.com/egoing/b62aa16573dd5c7c5da51fd429a5faa2
위 주소로 들어가서 명령어(command)와 설정 파일(docker-compose.yml)을 사용해서 실습을 할 수 있다.
docker network create wordpress_net
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
host에 db_data라는 폴더가 생기고, 이 안에 MySQL의 데이터가 저장된다.
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
host에 app_data라는 폴더가 생기고, 이 안에 wordpress의 데이터가 저장된다.
이렇게 두 개의 컨테이너는 wordpress_net이라는 네트워크에 연결된 상태가 된다. wordpress를 8080번 포트에 연결되도록 컨테이너를 만들었으니 접속해보면 wordpress를 설치하는 화면이 뜬다.
docker-compose.yml
이라는 파일을 만들고 안에 아래의 명령어를 저장한다.
version: "3.7"
services:
db:
image: mysql:5.7
volumes:
- ./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:
- db
image: wordpress:latest
volumes:
- ./app_data:/var/www/html
ports:
- "8080:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wordpress_user
WORDPRESS_DB_PASSWORD: 123456
version
: compose 파일 버전services
: 이하 컨테이너 생성db
&app
: 컨테이너 이름volumes
: host에 연결하는 주소. 현재 디렉토리의 db_data와 컨테이너의 var/lib/mysql에 연결한다는 의미다.environment
: 환경변수depends-on
: 선행 설치 컨테이너port
: 외부에서 접속할 수 있는 컨테이너의 포트 번호. host의 8080포트와 app의 80포트 연결.HOST=<컨테이너이름>
: 컨테이너에 접속. db를 적으면 db에 접속된다. 이를 사용하기 위해서는 네트워크를 생성해야 하지만, yml 파일을 만들면 자동으로 네트워크가 생성된다.
그리고 docker-compose up
명령어를 실행하면, 위의 상황보다 간단히 wordpress 설치 화면을 볼 수 있다. docker-compose down
을 실행하면 종료된다.
위 사진에서 첫 번째 과정이 shell, 두 번째 과정이 compose에 해당된다. 둘 다 같은 결과를 보이지만 compose를 이용하면 압축 파일 풀듯이 쉽게 컨테이너를 사용할 수 있다.