가장 빨리 만나는 Docker 16장 - 2. MySQL 데이터베이스 Dockerfile 작성하기

저작권 안내
  • 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
  • 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.

Docker로 워드프레스 블로그 구축하기

이재홍 http://www.pyrasis.com 2014.08.02 ~ 2014.09.20

MySQL 데이터베이스 Dockerfile 작성하기

이제 데이터베이스 이미지를 생성합니다. mysql 디렉터리를 생성하고 다음 내용을 Dockerfile로 저장합니다.

~$ mkdir mysql
~$ cd mysql
~/mysql/Dockerfile
FROM ubuntu:14.04

ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update
RUN echo "mysql-server mysql-server/root_password password" | debconf-set-selections
RUN echo "mysql-server mysql-server/root_password_again password" | debconf-set-selections
RUN apt-get install -y mysql-server

WORKDIR /etc/mysql
RUN sed -i "s/127.0.0.1/0.0.0.0/g" my.cnf

ADD entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
EXPOSE 3306

ENTRYPOINT /entrypoint.sh
  • ENV로 환경 변수 DEBIAN_FRONTENDnoninteractive를 반드시 설정합니다. apt-get으로 MySQL 패키지를 설치하면 사용자가 직접 root 비밀번호를 입력하는 부분이 나옵니다. 하지만, Docker 이미지를 생성할 때는 입력을 할 수가 없으므로 noninteractive를 설정하여 사용자 입력 없이 넘어가 야합니다.
  • apt-get update로 패키지 목록을 최신 상태로 업데이트합니다.
  • mysql-server mysql-server/root_password passworddebconf-set-selections에 설정하여 noninteractive로 넘어갔던 부분에 비밀번호 설정을 적용합니다. password 뒤에 실제로 사용할 비밀번호를 입력해도 되지만, 우리는 docker run 명령에서 -e 옵션으로 비밀번호를 설정할 것이므로 아무것도 입력하지 않습니다.
  • mysql-server mysql-server/root_password_again password도 위와 동일합니다.
  • apt-get installmysql-server 패키지를 설치합니다.
  • sed/etc/mysql 디렉터리의 my.cnf 파일 내용을 수정합니다. bind-address = 127.0.0.1 부분을 bind-address = 0.0.0.0으로 수정합니다. 이 부분을 수정하지 않으면 외부에서 MySQL에 접속할 수 없습니다.
  • entrypoint.sh 파일을 추가한 뒤 실행할 수 있도록 권한을 설정합니다.
  • EXPOSE에 3306을 설정하여 3306번 포트에 접속할 수 있도록 합니다.
  • ENTRYPOINT에 /entrypoint.sh 파일을 설정하여 컨테이너가 시작되었을 때 스크립트 파일을 실행합니다.

VOLUME
각자 상황에 따라 데이터베이스를 컨테이너 안에 저장하지 않고 VOLUME을 설정하여 호스트에 저장할 수도 있습니다.

VOLUME ["/var/lib/mysql"]

다음 내용을 entrypoint.sh로 저장합니다.

~/mysql/entrypoint.sh
#!/bin/bash

if [ -z $MYSQL_ROOT_PASSWORD ]; then
  exit 1
fi

mysql_install_db --user mysql > /dev/null

cat > /tmp/sql <<EOF
USE mysql;
FLUSH PRIVILEGES;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
UPDATE user SET password=PASSWORD("$MYSQL_ROOT_PASSWORD") WHERE user='root';
EOF

mysqld --bootstrap --verbose=0 < /tmp/sql
rm -rf /tmp/sql

mysqld
  • 환경 변수에 MYSQL_ROOT_PASSWORD가 없으면 데이터베이스를 실행하지 않고 빠져나옵니다.
  • mysql_install_db로 데이터베이스 파일을 설치합니다.
  • MySQL root 계정의 비밀번호를 설정하는 SQL문을 /tmp/sql 파일로 저장합니다. 비밀번호는 환경 변수의 MYSQL_ROOT_PASSWORD에 저장된 값을 사용합니다. Dockerfile에서 비밀번호를 설정하지 않고 이곳에서 비밀번호를 설정하는 이유는 docker run 명령의 -e 옵션으로 비밀번호를 설정하기 위해서입니다. -e 옵션으로 설정한 환경 변수 값은 CMD, ENTRYPOINT에서만 사용할 수 있습니다.
  • mysqld--bootstrap 옵션을 설정하고 /tmp/sql 파일을 입력하여 root 계정의 비밀번호를 설정합니다. 그리고 /tmp/sql 파일은 삭제합니다.
  • 마지막으로 mysqld를 실행합니다. Apache와 마찬가지로 MySQL도 foreground로 실행합니다.

docker build 명령으로 이미지를 생성합니다.

~/mysql$ sudo docker build --tag mysql .

저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

2014-11-30