【初心者・入門者必見】Dockerの取扱説明書 Vol.2 Compose編
どうも、ユーキです。
前回の記事では、Dockerの基礎とWebサーバーを立ててみました。
Dockerfileに設定を書いて、docker buildでイメージを作成。そして、docker runでイメージをもとにコンテナを起動。これで動くようになりました。
しかし、コンテナが増えれば増えるほど、コンテナごとに毎回コマンドを実行することになって、かなり面倒ですよね。
そこで、今回はDocker Composeというものを使ってコンテナ管理が用意にできるようまとめてました。
目次
Docker Composeとは
ドッカーコンポーズと読みます。
複数のコンテナをより簡単に実行・管理するための便利ツールです。
例えば、LAMPで動かしてるシステムの環境を整えたいとなった場合、
LinuxにApacheとPHPが入ってる環境(アプリケーション用のコンテナ)と、MySQLが入ってる環境(DB用のコンテナ)の2つを用意する必要があります。1つにしてもできるのですが、1コンテナ1プロセスにするのがベストプラクティスになります。
レプリケーションしてる場合だと、マスターとスレーブそれぞれのコンテナを用意するといったことも簡単にできます。
今回はわかりやすく、アプリケーション用コンテナ、DB用コンテナの2つで解説していきます。
詳しく知りたい方はこちら
まずは環境から
今回の環境は以下です。Githubでも公開してます。
作成するのが面倒という方は、こちらからDLもしくはクローンしてお使いください!
※windows未確認です
アプリケーションやOSは最新のものを取得するようになってます。2018/1/11現在は
- CentOS 7.4
- Apache 2.4.6
- MySQL 5.7.20
- PHP 7.2.1
となってます。
ディレクトリとファイルの構造は
lamp
├── Dockerfile
├── docker-compose.yml
├── httpd.conf
├── mysql
│ └── my.cnf
└── webroot
├── db.php
└── index.php
こんな感じです。
各ファイルの作成する
今回新たに必要となるのが、docker-compose.ymlというファイルです。
Dockerイメージやコンテナの情報を書いていきます。
docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "10080:80"
links:
- db
volumes:
- .:/code
db:
image: "mysql:latest"
ports:
- "13306:3306"
volumes:
- ./mysql:/etc/mysql/conf.d
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: dev_app
上から解説していくと
- version Docker Composeバージョン。3が現状最新なので3にしておきましょう。
- services 各コンテナの設定を宣言。上記だと、webとdbの2つ。
- build Dockerfileがあるディレクトリを指定。
- ports コンテナの公開ポートを指定。 ホスト側:コンテナ側 となる。
- links コンテナ間を連携。dbをリンクして動作するということ。
- volumes マウント時のディレクトリを指定。 ホスト側:コンテナ側 となる。
- image ベースのイメージを指定。
- environment コンテナ内の環境変数を指定。上記だとDB用のアカウントのパスワードとDB名を指定。
こんな感じです。あまり細かくは設定してないですが、各コンテナごとにさらに細かく設定することも可能です。
Dockerfile
# CentOSの最新を指定
FROM centos:latest
# 変数の定義
ENV code_root /code
ENV httpd_conf ${code_root}/httpd.conf
# Apacheのインストール
RUN yum install -y httpd
# php 7.2のインストール
RUN yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
RUN yum install -y --enablerepo=remi-php72 php php-cli php-gd php-mbstring php-mcrypt php-mysqlnd php-pdo php-xml
RUN sed -i -e "s|^;date.timezone =.*$|date.timezone = Asia/Tokyo|" /etc/php.ini
# ルートディレクトリを変更(http.confファイルに追記)
ADD . $code_root
RUN test -e $httpd_conf && echo "Include $httpd_conf" >> /etc/httpd/conf/httpd.conf
# 外部に公開するコンテナのポートを指定
EXPOSE 80
# イメージからコンテナを起動するときに実行するコマンドを指定
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
httpd.conf
VitualHostを追加しています。
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot /code/webroot
<Directory /code/webroot>
require all granted
Options Indexes FollowSymLinks MultiViews
AllowOverride all
Order allow,deny
allow from all
</Directory>
</VirtualHost>
ServerName追加して、hostsファイル書き換えればドメインでもアクセスできるはずです。
mysql/my.cnf
DBのデフォルトの文字コードをUTF-8にしているだけです。
[mysqld]
character-set-server = utf8
[client]
default-character-set = utf8
webroot/index.php db.php
今回はwebroot/がルートディレクトリになるよう指定しています。
ここにファイルを追加することでコンテナに同期されサーバー上で動作確認が出来るようになります。
現状のファイルだと、
index.phpは、phpinfo()が実行され、
db.phpは、DBにアクセスできるかどうか確認できます。
Docker Composeの使い方
# 実行
docker-compose up
# ターミナル、コマンドプロンプト上で動かしたくない場合-dをつける
docker-compose up -d
# 停止
docker-compose down
# 削除
docker-compose rm
# コンテナ上のサーバーに直接アクセスしたいとき
docker exec -it lamp_web_1 bash
さっそく実行してみましょう!!
実行が完了したら
http://localhost:10080/
にアクセスしてみてください。
こんな画面がでてきますか?出てきてればアプリケーション用のコンテナはきちんと動作しています。
次に、こちらにアクセスしてみてください。
http://localhost:10080/db.php
こちらも上記画像の用に表示されてればOKです。これで環境構築は終わりになります。
まとめ
Docker Composeを使うことで、各コンテナをまとめて1コマンドで実行し、かなり楽に環境構築ができるようになりました。
コンテナが増えれば増えるほど効果を発揮します。
ローカルだけでなくサーバー上でもDockerやDocker Composeを使うことができるので、本番環境の運用でも活躍してくれます。
これを機にもう少し深いところまで触ってみてもらえるとうれしいです。
他にもDocker Machine、Docker Engineをいじれたりもするので、もう少し理解が深まったらそのうち記事にしたいと思います!