docker-compose 사용하기 – 1부. mariadb 설정

서비스는 하나인데 사용해야 하는 컨테이너가 여러 개인 경우 매번 docker build, docker run, docker stop, docker rm, docker restart 등의 명령어를 사용하는 것은 말도 못하게 번거롭다. 필자는 바로 쉘 스크립트로 해당 명령어들을 작성해서 보관하기 시작했는데, 컨테이너 개수가 늘어나면서 관리할 쉘 스크립트도 덩달아서 늘어나고, 스크립트 내에서 사용하는 환경 변수들에 대한 처리 문제도 덩달아 발생하였다. docker-compose를 사용하면 build부터 컨테이너를 띄우는 순서까지 모두 결정할 수 있으며 docker-compose up -d 라는 명령어 한 줄이면 docker-compose.yml에 설정된 모든 컨테이너를 한 번에 바로 띄울 수 있다.

docker-compose 설정 파일은 YAML을 사용하여 서비스, 네트워크, 볼륨 등을 설정할 수 있다. 간단한 시나리오를 상정하고 docker-compose 파일을 설정해 보려한다. 워드프레스로 웹 사이트를 운영할 것이고, 데이터 베이스는 mariadb를 사용하고, 웹 서버는 nginx를 사용할 것이다. 본 포스팅에서는 우선 mariadb에 대한 docker-compose 파일 설정을 먼저 해 볼 것이다.

그에 앞서 버전 이야기를 먼저 하려고 한다. docker-compose는 docker 엔진 버전에 따라 docker-compose 파일 버전을 맞추어 설정해야 한다. 만일 도커 엔진 버전이 낮으면 해당 엔진 버전에 상응하는 docker-compose 파일 버전 이상을 사용할 수 없다. 따라서 docker-compose를 사용하려면 현재 자신이 사용하는 도커 엔진의 버전을 확인하고 적용할 수 있는 docker-compose 파일 버전을 확인한 후 사용해야 한다.

도커 버전은 다음의 명령어로 확인할 수 있다.

docker —version

일례로 필자가 사용중인 도커 엔진은 1.12 버전이다. 이 경우 docker-compose 파일 버전은 2.1까지 사용할 수 있다. 자신이 사용하는 도커 버전을 확인한 후, 아래 주소에서 자신이 사용할 수 있는 docker-compose 파일 버전을 확인한 후 활용하면 된다.

https://docs.docker.com/compose/compose-file

물론 버전에 따라 사용할 수 있는 문법의 지원 정도에 차이가 있는 것은 당연하며, 도커 엔진 버전에 상응하는 docker-compose 파일 버전보다 높은 버전으로 설정하면 오류가 발생한다.

docker-compose.yml 파일에 다음과 같이 적어주면 docker-compose 파일의 버전 설정이 끝난다.

version: '2.1'

그러면 이어서 mariadb 컨테이너 설정을 해보자. services는 띄울 컨테이너 서비스들을 모아서 설정하는 곳이다. 자신이 띄울 서비스의 이름을 적어준다. 필자는 mariadb라고 적어주었다.

version: '2.1'
services:
  mariadb:
    image: mariadb:10.2.10
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=mypassword
    volumes:
      - /Users/aaaa/con_volumes/mariadb/data:/var/lib/mysql
      - /Users/aaaa/con_volumes/mariadb/conf.d:/etc/mysql/conf.d

위의 설정은 mariadb:10.2.10이라는 image를 사용할 것을 의미한다. 재시작 옵션을 always로 하겠다는 것은 컨테이너 종료 상태와 상관없이 항상 재시작하겠다는 것이다. 이 옵션을 설정해 두면, PC을 껐다 켠 후에 컨테이너가 자동으로 뜨는 것을 확인할 수 있을 것이다.

그 다음은 enviroment 옵션인데, MYSQL_ROOT_PASSWORD를 mypassword로 설정해 주었다.

그리고 volumes 옵션을 통해서 Host 경로를 Container 경로로 마운팅하게 해 놓았는데, 도커 컨테이너를 삭제하면 당연히 컨테이너의 내용은 모두 사라진다. DB을 보존하기 위해서는 호스트 경로로 저장되도록 설정해야 한다. 콜론(:)을 중심으로 왼쪽은 호스트 경로, 오른쪽은 컨테이너 경로이다. /var/lib/mysql 경로는 DB가 저장되는 경로이고, /etc/mysql/conf.d는 mysql 환경설정을 별도로 오버라이딩 하기 위한 경로이다.

도커를 띄우기 전에 /Users/aaaa/con_volumes 디렉토리를 생성해 줘야 한다. mariadb 이후의 경로는 도커가 알아서 생성해 준다.

mkdir con_volumes

여기에서 잠깐! MYSQL_ROOT_PASSWORD는 환경변수이다. git과 같은 버전관리 도구를 사용하면서 docker-compose.yml 파일을 커밋하고 푸시하면, DB의 root 패스워드가 공개된다. 이러면 안된다. 그래서 환경변수로 설정을 해 주어야 한다.

docker-compose는 기본으로 .env 파일을 환경변수 파일로 인식한다. 필요한 변수를 .env에 설정해 주고, .gitignore에 추가한다. 새로 생성한 .env 파일과 변경한 docker-compose 파일은 다음과 같다.

MYSQL_PW=mypassword
version: '2.1'
services:
  mariadb:
    image: mariadb:10.2.10
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_PW}
    volumes:
      - /Users/aaaa/con_volumes/mariadb/data:/var/lib/mysql
      - /Users/aaaa/con_volumes/mariadb/conf.d:/etc/mysql/conf.d

이제 docker-compose.yml 파일을 안전하게 커밋해도 된다. 각자의 환경변수로 필요한 설정을 해서 사용하면 될테니 말이다.

이제 docker-compose 명령어로 컨테이너를 띄워보자.

docker-compose up -d

위와 같이 입력하면 기본적으로 .env 파일에서 환경변수를 읽어들이고, docker-compose.yml 파일을 찾아서 컨테이너를 띄우게 된다. 만약 docker-compose.yml 파일을 사용하지 않고 파일이름을 특정하고 싶다면 자신이 원하는 파일이름으로 저장한 후,  docker-compose -f FILENAME.yml up -d이라고 해 주면 된다.

docker-compose의 up 명령어는 컨테이너를 새로 생성하고 띄우라는 것이고, -d는 background 모드로 실행하겠다는 것이다. 이제 컨테이너가 작동하는지 확인해 보자.

docker-compose ps

aaaa_mariadb_1 라는 이름의 컨테이너가 떠 있는 것을 확인할 수 있다. 동일한 서비스이름을 사용할 수 있기 때문에 접두어와 접미어가 붙어있다. 접두어와 접미어를 붙이지 않고 그냥 mydb라고 간단히 명명하고 싶다면 다음과 같이 파일을 수정하면 된다.

version: '2.1'
services:
  mariadb:
    container_name: mydb
    image: mariadb:10.2.10
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_PW}
    volumes:
      - /Users/aaaa/con_volumes/mariadb/data:/var/lib/mysql
      - /Users/aaaa/con_volumes/mariadb/conf.d:/etc/mysql/conf.d

일단 docker-compose 사용하기의 첫 포스팅은 여기까지이다. 글이 너무 길어지는 것 같아서 다음 포스팅에 wordpress와 nginx 설정을 차례로 하려한다.

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.