저작권 안내
- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
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_FRONTEND에 noninteractive를 반드시 설정합니다.
apt-get
으로 MySQL 패키지를 설치하면 사용자가 직접 root 비밀번호를 입력하는 부분이 나옵니다. 하지만, Docker 이미지를 생성할 때는 입력을 할 수가 없으므로 noninteractive를 설정하여 사용자 입력 없이 넘어가 야합니다. apt-get update
로 패키지 목록을 최신 상태로 업데이트합니다.- mysql-server mysql-server/root_password password를
debconf-set-selections
에 설정하여 noninteractive로 넘어갔던 부분에 비밀번호 설정을 적용합니다. password 뒤에 실제로 사용할 비밀번호를 입력해도 되지만, 우리는docker run
명령에서-e
옵션으로 비밀번호를 설정할 것이므로 아무것도 입력하지 않습니다. - mysql-server mysql-server/root_password_again password도 위와 동일합니다.
apt-get install
로 mysql-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 공유는 허용합니다.