docker-compose로 워드프레스 블로그 만들기

이 장에서는 컨테이너간의 연관 관계로 인한 관리의 어려움을 해소해주는 docker-compose에 대해 알아봅니다.



이 장의 내용

  • 컨테이너 관리를 돕는 docker-compose를 설치해 봅니다.
  • 워드프레스 컨테이너를 실행합니다.



앞 장에서는 컨테이너를 일일이 다 커맨드라인command line이나 Dockerfile로 만들었습니다. 그러나 옵션이 많아지고 연관 관계가 복잡해지면 컨테이너 관리가 점점 어려워집니다.

이런 불편을 해소하기 위한 것이 docker-compose입니다. 도커가 공식적으로 제공하는 docker-compose는 복잡한 설정을 쉽게 관리할 수 있도록 YAML 방식(사람이 쉽게 읽을 수 있는 데이터 직렬화 양식)의 설정 파일로 컨테이너를 생성하고 관리할 수 있게 해줍니다.


docker-compose 설치하기

설치는 매우 간단합니다. 설치 파일만 내려받아 실행하면 됩니다.

$ docker-compose up -d

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


실행 권한을 부여해야겠죠.

$ sudo chmod +x /usr/local/bin/docker-compose


버전을 확인해 봅시다.

$ docker-compose version
docker-compose version 1.9.0, build 2585387


docker-compose로 워드프레스 블로그 서비스하기

지금부터는  docker-compose를 이용해 바로 사용할 수 있는 워드프레스 블로그 서비스를 만들어 보겠습니다. 워드프레스 웹 서버는 데이터베이스를 필요로 하므로 MySQL을 데이터베이스로 사용하겠습니다.

이 두 서버를 컨테이너로 만들고 서로 연결하려면 명령어가 길고 복잡해질 것입니다. docker-compose를 사용하면 컨테이너 이미지와 관련 설정, 컨테이너의 연관 관계를 yml 파일에 정의하면 됩니다.

그리고 docker-compose up 명령으로 yml 파일을 지정하면 정의된 컨테이너를 한번에 생성하고, 컨테이너 간의 연관 관계도 알아서 설정합니다.

실습중인 EC2에 미리 정의된 docker-compose.yml 파일을 git을 통해 내려받습니다.


우선 Git을 설치합니다.

$ sudo yum install git -y


ec2-user home으로 이동한 후 Git clone을 실행합니다.

$ cd ~
$ git clone https://github.com/west0706/awskrug-docker-compose-wp.git
$ cat ~/awskrug-docker-compose-wp/docker-compose.yml


yml 파일의 내용은 다음과 같습니다. 참고로 여기서는 Compose file version 중 version 2를 사용합니다.각각의 버전별로 문법이 약간씩 상이한 점에 주의하기 바랍니다.

version: '2'

services:

  db:
image: mysql:5.7

volumes:
   - ./db_data:/var/lib/mysql

restart: always

environment:
   MYSQL_ROOT_PASSWORD: wordpress
   MYSQL_DATABASE: wordpress
   MYSQL_USER: wordpress
   MYSQL_PASSWORD: wordpress

  wordpress:

depends_on:
   - db

image: wordpress:latest

volumes:
   - ./wp_data:/var/www/html

ports:
   - "8000:80"

restart: always

environment:
   WORDPRESS_DB_HOST: db:3306
   WORDPRESS_DB_USER: wordpress
   WORDPRESS_DB_PASSWORD: wordpress


컨테이너 안에서 MySQL과 워드프레스의 데이터 저장 위치를 호스트의 특정 볼륨으로 정의해야 컨테이너가 종료되더라도 데이터가 유지됩니다.

awskrug-docker-compose 폴더 안에 db_data wp_data 폴더를 만듭니다.

$ cd ~/awskrug-docker-compose-wp
$ mkdir db_data wp_data


docker-compose.yml 파일이 있는 위치에서 다음 명령어를 실행합니다.

$ docker-compose up


yml 파일의 정의대로 컨테이너가 만들어질 것입니다. 로컬 이미지 레지스트리에 wordpress, mysql 이미지가 없기 때문에 이미지부터 내려받습니다. 컨테이너가 만들어지고 나면 포그라운드foreground 모드로 컨테이너가 실행됩니다. 워드프레스에 리퀘스트request를 보낼 때마다 로그가 출력되는 것을 볼 수 있습니다.


웹 브라우저 주소 창에 http://<EC2-public-IP>:8000를 입력합니다. 그러면 워드프레스 초기 설치 화면이 나타납니다.


이와 같이 docker-compose를 이용하면 Dockerfile에서 하지 못했던 많은 연관 관계를 가진 컨테이너를 한 번에 생성하고 삭제, 관리할 수 있습니다.

현재 워드프레스가 포그라운드foreground 모드로 실행중이기 때문에 터미널에서 Ctrl + C를 누르면 컨테이너가 종료됩니다. 일단 종료해 봅니다.

그리고 컨테이너가 실제로 생성됐는지 확인해 봅니다.

$ docker ps -a



docker ps -a 또는 docker-compose.yml 파일이 있는 위치에서 다음 명령을 실행해도 컨테이너 상태를 확인할 수 있습니다.

$ docker-compose ps
              Name                  Command State Ports
------------------------------------------------------------------------------------
awskrugdockercomposewp_db_1          docker-entrypoint.sh mysqld Exit 0         
awskrugdockercomposewp_wordpress_1   docker-entrypoint.sh apach ... Exit 0  



  [TIP] 만약 다음과 같은 에러가 발생한다면?

ERROR:
Can't find a suitable configuration file in this directory or any
parent. Are you in the right directory?
Supported filenames: docker-compose.yml, docker-compose.yaml


현재 디렉터리 혹은 상위 디렉터리에서 docker-compose.yml, docker-compose.yaml 파일을 찾지 못해 발생하는 에러입니다. 현재 디렉터리를 확인하세요.

$ cd ./awskrug-docker-compose-wp/
$ docker-compose ps



컨테이너가 만들어졌지만 중단 상태입니다. 백그라운드로 다시 실행하려면 docker-compose up 명령에 -d 옵션(detach)을 붙여야 합니다.

$ docker-compose up -d



MySQL 컨테이너의 데이터 저장 볼륨을 호스트의 db_data 디렉터리와 연결했기 때문에 컨테이너가 중단되도 데이터는 폴더 안에 그대로 남아 있습니다.

db_data 폴더와 wp_data 폴더에 컨테이너와 공유된 파일이 있는지 각자 확인해 봅시다.

$ ll ~/awskrug-docker-compose-wp/db_data/