https://qiita.com/kobori_akira/items/ce9a4bcf737e2fee929e
↑の記事を読み、自分なりにDockerについてまとめてみるついでにdocker-composeも軽く触ってみました。
Dockerの登場人物
- Dockerfile
- コンテナで実行することや設定を書くファイルです
- Dockerイメージ
- Dockerfileをもとにつくられた仮想環境のファイルです
- Dockerコンテナ
- Dockerイメージを「コンテナ」として動かします
- 削除するとその状態は失われます
Dockerのメリット
- サーバの状態をコードで管理できる
- 「どんなコマンドを実行するか」「どのファイルを サーバに配置するか」などをDockerfileに書く
- 「サーバの状態」をアプリのコードと同じようにバージョン管理システムで管理できる
- 今まで手作業で構築していたものを、自動で作成できる!
- 起動が高速
- 実行したコマンドはキャッシュされる – 2度目以降の環境作成が超高速
- 環境の共有が手軽
- Dockerfileが1つあればOK
- Docker Hub Registry
- Dockerfileが1つあればOK
3分でWordPressの環境を構築
docker image pull tutum/wordpress:latest
docker container run -d -p 80:80 --name=wordpress tutum/wordpress
wordpressに適当に情報を入力して管理画面まで行く。
※↓Dockerの仕組みの図はこれが一番分かりやすい気がします。
- -dオプション
- デタッチド・モードで実行を指定する。
「デタッチド・モード」とは、バックグラウンドで実行すること。つまりは、コンソールに出力が表示されないことを指す。
- デタッチド・モードで実行を指定する。
- -pオプション
- コンテナにポートフォワーディングでアクセスできるようにさせる。
ポートフォワーディングとは、ローカルの特定のポートへの通信を、別のIPアドレスの特定のポートに飛ばすこと。
この場合だと、localhostのポート番号80にアクセスすると、それはコンテナ(が管理するWebサーバApache)のポート番号80に飛ぶ。
- コンテナにポートフォワーディングでアクセスできるようにさせる。
- --nameオプション
- コンテナの名前を決める。このオプションをつけない場合は、コンテナ名はランダムな英単語がつけられる。
起動しているコンテナを確認
docker container ls
Q:コンテナのデータは消えるか?
コンテナを停止
docker container stop (id or name)
A:消えない
コンテナスタート
docker container start
コンテナリスタート
docker contaienr restart
A:消えない
コンテナ削除
docker container rm
A:消える
Docker Compose 概要
Docker compose とは、複数のコンテナから成るサービスを構築・実行する手順を自動的にし、管理を容易にする機能です。
Docker compose では、compose ファイルを用意してコマンドを1 回実行することで、そのファイルから設定を読み込んですべてのコンテナサービスを起動することができます。
最初に起動したWordpressをdocker-compose.ymlにまとめる。
こうすると毎回起動するときに長いオプションを打たなくて済む。
version: '3'
services:
wordpres:
image: tutum/wordpress:latest
container_name: wordpress
ports:
- 80:80
docker-compose up
で起動
tutum/wodpress のDockerfileを確認する
FROM tutum/lamp:latest
MAINTAINER Fernando Mayo <fernando@tutum.co>, Feng Honglin <hfeng@tutum.co>
# Install plugins
RUN apt-get update && \
apt-get -y install php5-gd && \
rm -rf /var/lib/apt/lists/*
# Download latest version of WordPress into /app
RUN rm -fr /app && git clone --depth=1 https://github.com/WordPress/WordPress.git /app
# Configure WordPress to connect to local DB
ADD wp-config.php /app/wp-config.php
# Modify permissions to allow plugin upload
RUN chown -R www-data:www-data /app/wp-content /var/www/html
# Add database setup script
ADD create_mysql_admin_user.sh /create_mysql_admin_user.sh
ADD create_db.sh /create_db.sh
RUN chmod +x /*.sh
EXPOSE 80 3306
CMD ["/run.sh"]
tutum/lamp のDockerfile
https://github.com/tutumcloud/lamp/blob/master/Dockerfile
このままではcontainerを消すたびにMysqlのデータが消えてしまう…
オリジナルのDockerイメージ(カスタマイズしたWordPress)の作成
git clone https://github.com/mookjp/tutum-docker-wordpress
cd tutum-docker-wordpress
コンテナとローカルとのファイル共有
docker run -d -p 80:80 -v $(pwd):/data-share --name=xxx-wordpress tutum/wordpress
コンテナの中に入る
docker exec -it xxx-wordpress /bin/bash
実際にWordPressの設定を終えてから、そのデータをdata-shareにコピーする。
mysqldump -u root wordpress > /data-share/mysql.dump.sql
docker contianer stop xxx-wordpress
docker contianer rm xxx-wordpress
buildする
docker build -t xxx-wordpress .
設定済みのimageが出来る
docker run -d -p 80:80 --name=xxx-wordpress xxx-wordpress
version: '3'
services:
wordpres:
build:
context: ./tutum-docker-wordpress
container_name: xxx-wordpress
ports:
- 80:80
volumes:
- ./tutum-docker-wordpres:/data-share
おまけ
nginx,php-fpm,mysql環境構築
docker-compose.yml
version: '3'
services:
nginx:
build:
context: ./nginx
depends_on:
- php
ports:
- 80:80
volumes:
- ./app/public:/var/www/public
php:
build:
context: ./phpfpm
volumes:
- ./app/public:/var/www/public
mysql:
restart: always
image: mysql:latest
volumes:
- ./mysql:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=test
ports:
- 3306:3306
nginx/Dockerfile
FROM nginx:latest
COPY ./etc/nginx/nginx.conf /etc/nginx/nginx.conf
COPY ./etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf
php-fpm/Dockerfile
FROM php:7.1-fpm
nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$uri - $is_args - args :::'
'$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
default.conf
server {
index index.php index.html;
server_name localhost;
root /var/www/public;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}