Dockerの導入 
FUNTERACTIVE OPEN MEETING VOL.04
FUNTERACTIVE OPEN MEETING VOL.04  
Yuji Tsukaguchi 
ファンタラクティブ株式会社 
COO, Web Designer 
無料写真素材サイト ぱくたそ 
Enginner 
@regret_raym
■ 本番環境のアプリケーションバージョン 
・WordPress、PHP、MySQL、Apache、Nginx… 
! 
■ それに合わせた開発環境 
・VirtualBox、VPS、Heroku… 
! 
■ 早い、軽いで話題のDockerを試す 
FUNTERACTIVE OPEN MEETING VOL.04  
はじめに
FUNTERACTIVE OPEN MEETING VOL.04 
Under the hood, Docker is built on the following components: 
・The cgroup and namespacing capabilities of the Linux 
kernel; 
・AUFS, a powerful union filesystem with copy-on-write 
capabilities; 
・The Go programming language; 
・lxc, a set of convenience scripts to simplify the creation of 
Linux containers. 
FUNTERACTIVE OPEN MEETING VOL.04  
Docker? 
https://github.com/docker/docker/blob/master/README.md#under-the-hood
AUFSとLXCを使って 
いい感じにコンテナ化してくれる 
FUNTERACTIVE OPEN MEETING VOL.04 
Apps Apps 
ゲストOS ゲストOS 
仮想マシン仮想マシン 
ユーザー空間 
OS process process process 
カーネル空間 
FUNTERACTIVE OPEN MEETING VOL.04  
VirtualBox 
物理マシン 
ハードウェアごと仮想化
ユーザー空間 
カーネル空間 
FUNTERACTIVE OPEN MEETING VOL.04  
LXC 
Linux Containers 
物理マシン 
Apps 
OS 
process 
process 
Apps 
process 
process 
ユーザー空間を分割して仮想化
AUFS 
DVD-ROM 
FUNTERACTIVE OPEN MEETING VOL.04  
AUFS 
Another Union File System 
File System 
modify new 
read-write 
read-only 
A’ B C 
A’ C 
A B 
http://itpro.nikkeibp.co.jp/article/Keyword/20090209/324482/?SS=imgview&FD=-692683090&ST=oss
Docker file system 
http://docs.docker.com/terms/layer/ 
FUNTERACTIVE OPEN MEETING VOL.04  
Container 
writable 
! 
Image 
read-only 
! 
Base image
Docker install 
FUNTERACTIVE OPEN MEETING VOL.04 
FUNTERACTIVE OPEN MEETING VOL.04  
Install 
# yumからインストール 
$ sudo yum install docker-io 
! 
# docker起動 
$ sudo service docker start 
! 
# サービス登録 
$ sudo chkconfig docker on 
! 
# バージョン確認 
$ docker -v 
Docker version 1.3.1, build c78088f/1.3.1 
※VirtualBox、Vagrantを使ってインストール
FUNTERACTIVE OPEN MEETING VOL.04  
Docker Pull 
docker indexからcentosのDocker Imageを取得
FUNTERACTIVE OPEN MEETING VOL.04  
docker image取得 
# 公式リポジトリからcentosのイメージを取得 
$ sudo docker pull centos 
! 
# 取得したイメージを確認 
$ sudo docker images centos
$ sudo docker run -i -t centos /bin/bash 
OS ユーザー空間 
カーネル空間 
物理マシン 
FUNTERACTIVE OPEN MEETING VOL.04  
container a52e5157470c 
base image 
process 
process 
centos 
コンテナ作成
コンテナ内にwget入れる 
$ yum install -y wget 
OS ユーザー空間 
カーネル空間 
物理マシン 
FUNTERACTIVE OPEN MEETING VOL.04  
container wget 
base image 
process 
process 
centos
FUNTERACTIVE OPEN MEETING VOL.04  
コンテナをコミット 
$ sudo docker ps -a 
! 
$ sudo docker commit a52e5157470c centos/wget 
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 
a52e515747 
0c centos:latest "/bin/ 
bash" 
10 minutes 
ago 
Exited (0) 2 
minutes 
ago 
agitated_poincare 
docker ps -aで確認できる項目
read-onlyのイメージ 
OS ユーザー空間 
カーネル空間 
物理マシン 
FUNTERACTIVE OPEN MEETING VOL.04  
image centos/wget 
base image 
process 
process 
centos
centos/wgetを元に新規コンテナ 
$ sudo docker run -i -t centos/wget /bin/bash 
OS ユーザー空間 
カーネル空間 
物理マシン 
FUNTERACTIVE OPEN MEETING VOL.04  
image centos/wget 
base image 
process 
process 
centos 
container 
921e5f3f895e
centos/wgetを元に新規コンテナ 
OS ユーザー空間 
カーネル空間 
物理マシン 
FUNTERACTIVE OPEN MEETING VOL.04  
image centos/wget 
base image 
process 
process 
centos 
container 
$ yum install -y vim 
vim
vimを入れたコンテナをコミット 
$ sudo docker commit 921e5f3f895e centos/vim 
OS ユーザー空間 
カーネル空間 
物理マシン 
FUNTERACTIVE OPEN MEETING VOL.04  
image centos/vim 
image centos/wget 
base image 
process 
process 
centos
複数のコンテナ起動 
$ sudo docker run -i -t centos/wget /bin/bash 
$ sudo docker run -i -t centos/vim /bin/bash 
OS ユーザー空間 
カーネル空間 
物理マシン 
FUNTERACTIVE OPEN MEETING VOL.04  
container 
image 
image 
base image 
process 
process 
container 
image 
base image 
process 
process 
centos/wget 
centos/vim
FUNTERACTIVE OPEN MEETING VOL.04  
コマンド一例 
# リモートリポジトリからイメージ取得 
$ docker pull REPOSITORY[:TAG] 
! 
# イメージ一覧 
$ docker images 
! 
# イメージからコンテナを起動接続 
$ docker run -i -t IMAGE /bin/bash 
! 
# コンテナを起動 
$ docker start CONTAINER 
! 
# コンテナを終了 
$ docker stop CONTAINER 
! 
# コンテナを削除 
$ docker rm CONTAINER 
# イメージを削除 
$ docker rmi IMAGE 
! 
# 起動しているコンテナに接続 
$ docker attach CONTAINER 
! 
# 起動しているコンテナ一覧 
$ docker ps 
! 
# 全てのコンテナ 
$ docker ps -a 
! 
# コンテナを全て停止 
$ docker stop `docker ps -aq` 
! 
# コンテナを全て削除 
$ docker rm `docker ps -aq`
SSHで接続 
FUNTERACTIVE OPEN MEETING VOL.04 
FUNTERACTIVE OPEN MEETING VOL.04  
SSH 
# コンテナ起動 
$ docker run -t -i centos /bin/bash 
! 
# 必要なパッケージインストール 
$ yum install -y passwd openssh openssh-clients openssh-server 
! 
# rootパスワード変更 
$ passwd 
! 
# sshdの変更 
$ vi /etc/ssh/sshd_config 
UsePAM no 
! 
$ exit
FUNTERACTIVE OPEN MEETING VOL.04  
コンテナ起動と接続 
# コンテナ確認 
$ sudo docker ps -a 
! 
# 先ほどのコンテナをコミット 
$ sudo docker commit XXXXXXX centos/sshd 
! 
# -dオプションでデーモン化、SSHが起動した状態でコンテナ起動 
$ sudo docker run -d -p 22 centos/sshd /usr/sbin/sshd -D 
! 
# docker ps -aでフォワードと、ifconfigでIPを確認する 
$ ssh root@XXX.XX.XX.X -p PORT
Supervisor 
FUNTERACTIVE OPEN MEETING VOL.04 
FUNTERACTIVE OPEN MEETING VOL.04  
Supervisor 
Dockerでは、プロセスを起動させるコマンドが一つしか選択できな 
いようなので、Python製のプロセス管理ツールSupervisorを使う。 
# yum install 
$ yum install -y python-setuptools 
! 
# supervisord インストール 
$ easy_install supervisor 
! 
# supervisord起動スクリプト 
$ vi /etc/init.d/supervisord 
! 
https://gist.github.com/regret/da56a239cb581089c813
FUNTERACTIVE OPEN MEETING VOL.04  
Supervisord設定 
# Supervisord config include 
! 
$ echo_supervisord_conf > /etc/supervisord.conf 
! 
$ echo "[include]" >> /etc/supervisord.conf 
! 
$ echo "files = supervisord/conf/*.conf" >> /etc/ 
supervisord.conf 
! 
$ mkdir -p /etc/supervisord/conf/
FUNTERACTIVE OPEN MEETING VOL.04  
Supervisord設定 
# Supervisord service.conf 
$ vi /etc/supervisord/conf/service.conf 
! 
[supervisord] 
nodaemon=true 
! 
[program:sshd] 
command=/usr/sbin/sshd -D 
autostart=true 
autorestart=true 
! 
[program:httpd] 
command=/usr/sbin/httpd -c "ErrorLog /dev/stdout" - 
DFOREGROUND 
redirect_stderr=true
FUNTERACTIVE OPEN MEETING VOL.04  
コンテナ起動と接続 
# コミット 
$ sudo docker commit XXXXXXX centos/supervisord 
! 
# 開放ポートを指定して起動 
$ sudo docker run -d -p 22 -p 80 centos/supervisord /usr/ 
bin/supervisord 
! 
# ポートマッピング確認 
$ sudo docker ps -a 
! 
# SSHログイン 
$ ssh root@127.0.0.1 -p PORT
Dockerで複数Webサーバ 
FUNTERACTIVE OPEN MEETING VOL.04 
Dockerに複数Webサーバ 
80 
FUNTERACTIVE OPEN MEETING VOL.04  
container 
container 
Domain A 
Apache 
Domain B 
Nginx 
proxy 
80 
Nginx 
Supervisord 
run プロセス管理ツール
Domain AのSupervisord 
# sshdとhttpdを設定 
$ vi /etc/supervisord/conf/service.conf 
! 
[supervisord] 
nodaemon=true 
[program:sshd] 
command=/usr/sbin/sshd -D 
autostart=true 
autorestart=true 
[program:httpd] 
command=/usr/sbin/httpd -c "ErrorLog /dev/stdout" - 
DFOREGROUND 
redirect_stderr=true 
FUNTERACTIVE OPEN MEETING VOL.04 
Domain BのSupervisord 
# sshdとnginxを設定 
$ vi /etc/supervisord/conf/service.conf 
! 
[supervisord] 
nodaemon=true 
[program:sshd] 
command=/usr/sbin/sshd -D 
autostart=true 
autorestart=true 
[program:nginx] 
command=/usr/sbin/nginx -c /etc/nginx/nginx.conf 
redirect_stderr=true 
FUNTERACTIVE OPEN MEETING VOL.04 
FUNTERACTIVE OPEN MEETING VOL.04  
ホスト側のnginx設定 
# コンテナのポートマッピング確認 
$ sudo docker ps -a 
! 
# プロキシ設定 
$ sudo vi /etc/nginx/conf.d/proxy.conf 
! 
proxy_redirect off; 
proxy_set_header Host $host; 
proxy_set_header X-Real-IP $remote_addr; 
proxy_set_header X-Forwarded-Host $host; 
proxy_set_header X-Forwarded-Server $host; 
proxy_set_header X-Forwarded-For 
$proxy_add_x_forwarded_for; 
!
FUNTERACTIVE OPEN MEETING VOL.04  
ホスト側のnginx設定 
# nginxのリバースプロキシ設定 
$ sudo /etc/nginx/conf.d/virtual.conf 
! 
server { 
listen 80; 
server_name hogehoge.jp; 
location / { 
proxy_pass http://127.0.0.1:XXXXX; 
} 
} 
server { 
listen 80; 
server_name piyopiyo.jp; 
location / { 
proxy_pass http://127.0.0.1:XXXXX; 
} 
} 
調べたポート番号
Docker registry 
FUNTERACTIVE OPEN MEETING VOL.04 
FUNTERACTIVE OPEN MEETING VOL.04 
ご清聴ありがとうございました 
FFUUNNTTEERRAACCTTIIVVEE OOPPEENN MMEEEETTIINNGG VVOOLL..0034 

Dockerの導入

  • 1.
  • 2.
    FUNTERACTIVE OPEN MEETINGVOL.04  Yuji Tsukaguchi ファンタラクティブ株式会社 COO, Web Designer 無料写真素材サイト ぱくたそ Enginner @regret_raym
  • 3.
    ■ 本番環境のアプリケーションバージョン ・WordPress、PHP、MySQL、Apache、Nginx… ! ■ それに合わせた開発環境 ・VirtualBox、VPS、Heroku… ! ■ 早い、軽いで話題のDockerを試す FUNTERACTIVE OPEN MEETING VOL.04  はじめに
  • 4.
  • 5.
    Under the hood,Docker is built on the following components: ・The cgroup and namespacing capabilities of the Linux kernel; ・AUFS, a powerful union filesystem with copy-on-write capabilities; ・The Go programming language; ・lxc, a set of convenience scripts to simplify the creation of Linux containers. FUNTERACTIVE OPEN MEETING VOL.04  Docker? https://github.com/docker/docker/blob/master/README.md#under-the-hood
  • 6.
  • 7.
    Apps Apps ゲストOSゲストOS 仮想マシン仮想マシン ユーザー空間 OS process process process カーネル空間 FUNTERACTIVE OPEN MEETING VOL.04  VirtualBox 物理マシン ハードウェアごと仮想化
  • 8.
    ユーザー空間 カーネル空間 FUNTERACTIVEOPEN MEETING VOL.04  LXC Linux Containers 物理マシン Apps OS process process Apps process process ユーザー空間を分割して仮想化
  • 9.
    AUFS DVD-ROM FUNTERACTIVEOPEN MEETING VOL.04  AUFS Another Union File System File System modify new read-write read-only A’ B C A’ C A B http://itpro.nikkeibp.co.jp/article/Keyword/20090209/324482/?SS=imgview&FD=-692683090&ST=oss
  • 10.
    Docker file system http://docs.docker.com/terms/layer/ FUNTERACTIVE OPEN MEETING VOL.04  Container writable ! Image read-only ! Base image
  • 11.
    Docker install FUNTERACTIVEOPEN MEETING VOL.04 
  • 12.
    FUNTERACTIVE OPEN MEETINGVOL.04  Install # yumからインストール $ sudo yum install docker-io ! # docker起動 $ sudo service docker start ! # サービス登録 $ sudo chkconfig docker on ! # バージョン確認 $ docker -v Docker version 1.3.1, build c78088f/1.3.1 ※VirtualBox、Vagrantを使ってインストール
  • 13.
    FUNTERACTIVE OPEN MEETINGVOL.04  Docker Pull docker indexからcentosのDocker Imageを取得
  • 14.
    FUNTERACTIVE OPEN MEETINGVOL.04  docker image取得 # 公式リポジトリからcentosのイメージを取得 $ sudo docker pull centos ! # 取得したイメージを確認 $ sudo docker images centos
  • 15.
    $ sudo dockerrun -i -t centos /bin/bash OS ユーザー空間 カーネル空間 物理マシン FUNTERACTIVE OPEN MEETING VOL.04  container a52e5157470c base image process process centos コンテナ作成
  • 16.
    コンテナ内にwget入れる $ yuminstall -y wget OS ユーザー空間 カーネル空間 物理マシン FUNTERACTIVE OPEN MEETING VOL.04  container wget base image process process centos
  • 17.
    FUNTERACTIVE OPEN MEETINGVOL.04  コンテナをコミット $ sudo docker ps -a ! $ sudo docker commit a52e5157470c centos/wget CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a52e515747 0c centos:latest "/bin/ bash" 10 minutes ago Exited (0) 2 minutes ago agitated_poincare docker ps -aで確認できる項目
  • 18.
    read-onlyのイメージ OS ユーザー空間 カーネル空間 物理マシン FUNTERACTIVE OPEN MEETING VOL.04  image centos/wget base image process process centos
  • 19.
    centos/wgetを元に新規コンテナ $ sudodocker run -i -t centos/wget /bin/bash OS ユーザー空間 カーネル空間 物理マシン FUNTERACTIVE OPEN MEETING VOL.04  image centos/wget base image process process centos container 921e5f3f895e
  • 20.
    centos/wgetを元に新規コンテナ OS ユーザー空間 カーネル空間 物理マシン FUNTERACTIVE OPEN MEETING VOL.04  image centos/wget base image process process centos container $ yum install -y vim vim
  • 21.
    vimを入れたコンテナをコミット $ sudodocker commit 921e5f3f895e centos/vim OS ユーザー空間 カーネル空間 物理マシン FUNTERACTIVE OPEN MEETING VOL.04  image centos/vim image centos/wget base image process process centos
  • 22.
    複数のコンテナ起動 $ sudodocker run -i -t centos/wget /bin/bash $ sudo docker run -i -t centos/vim /bin/bash OS ユーザー空間 カーネル空間 物理マシン FUNTERACTIVE OPEN MEETING VOL.04  container image image base image process process container image base image process process centos/wget centos/vim
  • 23.
    FUNTERACTIVE OPEN MEETINGVOL.04  コマンド一例 # リモートリポジトリからイメージ取得 $ docker pull REPOSITORY[:TAG] ! # イメージ一覧 $ docker images ! # イメージからコンテナを起動接続 $ docker run -i -t IMAGE /bin/bash ! # コンテナを起動 $ docker start CONTAINER ! # コンテナを終了 $ docker stop CONTAINER ! # コンテナを削除 $ docker rm CONTAINER # イメージを削除 $ docker rmi IMAGE ! # 起動しているコンテナに接続 $ docker attach CONTAINER ! # 起動しているコンテナ一覧 $ docker ps ! # 全てのコンテナ $ docker ps -a ! # コンテナを全て停止 $ docker stop `docker ps -aq` ! # コンテナを全て削除 $ docker rm `docker ps -aq`
  • 24.
  • 25.
    FUNTERACTIVE OPEN MEETINGVOL.04  SSH # コンテナ起動 $ docker run -t -i centos /bin/bash ! # 必要なパッケージインストール $ yum install -y passwd openssh openssh-clients openssh-server ! # rootパスワード変更 $ passwd ! # sshdの変更 $ vi /etc/ssh/sshd_config UsePAM no ! $ exit
  • 26.
    FUNTERACTIVE OPEN MEETINGVOL.04  コンテナ起動と接続 # コンテナ確認 $ sudo docker ps -a ! # 先ほどのコンテナをコミット $ sudo docker commit XXXXXXX centos/sshd ! # -dオプションでデーモン化、SSHが起動した状態でコンテナ起動 $ sudo docker run -d -p 22 centos/sshd /usr/sbin/sshd -D ! # docker ps -aでフォワードと、ifconfigでIPを確認する $ ssh root@XXX.XX.XX.X -p PORT
  • 27.
  • 28.
    FUNTERACTIVE OPEN MEETINGVOL.04  Supervisor Dockerでは、プロセスを起動させるコマンドが一つしか選択できな いようなので、Python製のプロセス管理ツールSupervisorを使う。 # yum install $ yum install -y python-setuptools ! # supervisord インストール $ easy_install supervisor ! # supervisord起動スクリプト $ vi /etc/init.d/supervisord ! https://gist.github.com/regret/da56a239cb581089c813
  • 29.
    FUNTERACTIVE OPEN MEETINGVOL.04  Supervisord設定 # Supervisord config include ! $ echo_supervisord_conf > /etc/supervisord.conf ! $ echo "[include]" >> /etc/supervisord.conf ! $ echo "files = supervisord/conf/*.conf" >> /etc/ supervisord.conf ! $ mkdir -p /etc/supervisord/conf/
  • 30.
    FUNTERACTIVE OPEN MEETINGVOL.04  Supervisord設定 # Supervisord service.conf $ vi /etc/supervisord/conf/service.conf ! [supervisord] nodaemon=true ! [program:sshd] command=/usr/sbin/sshd -D autostart=true autorestart=true ! [program:httpd] command=/usr/sbin/httpd -c "ErrorLog /dev/stdout" - DFOREGROUND redirect_stderr=true
  • 31.
    FUNTERACTIVE OPEN MEETINGVOL.04  コンテナ起動と接続 # コミット $ sudo docker commit XXXXXXX centos/supervisord ! # 開放ポートを指定して起動 $ sudo docker run -d -p 22 -p 80 centos/supervisord /usr/ bin/supervisord ! # ポートマッピング確認 $ sudo docker ps -a ! # SSHログイン $ ssh root@127.0.0.1 -p PORT
  • 32.
  • 33.
    Dockerに複数Webサーバ 80 FUNTERACTIVEOPEN MEETING VOL.04  container container Domain A Apache Domain B Nginx proxy 80 Nginx Supervisord run プロセス管理ツール
  • 34.
    Domain AのSupervisord #sshdとhttpdを設定 $ vi /etc/supervisord/conf/service.conf ! [supervisord] nodaemon=true [program:sshd] command=/usr/sbin/sshd -D autostart=true autorestart=true [program:httpd] command=/usr/sbin/httpd -c "ErrorLog /dev/stdout" - DFOREGROUND redirect_stderr=true FUNTERACTIVE OPEN MEETING VOL.04 
  • 35.
    Domain BのSupervisord #sshdとnginxを設定 $ vi /etc/supervisord/conf/service.conf ! [supervisord] nodaemon=true [program:sshd] command=/usr/sbin/sshd -D autostart=true autorestart=true [program:nginx] command=/usr/sbin/nginx -c /etc/nginx/nginx.conf redirect_stderr=true FUNTERACTIVE OPEN MEETING VOL.04 
  • 36.
    FUNTERACTIVE OPEN MEETINGVOL.04  ホスト側のnginx設定 # コンテナのポートマッピング確認 $ sudo docker ps -a ! # プロキシ設定 $ sudo vi /etc/nginx/conf.d/proxy.conf ! proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; !
  • 37.
    FUNTERACTIVE OPEN MEETINGVOL.04  ホスト側のnginx設定 # nginxのリバースプロキシ設定 $ sudo /etc/nginx/conf.d/virtual.conf ! server { listen 80; server_name hogehoge.jp; location / { proxy_pass http://127.0.0.1:XXXXX; } } server { listen 80; server_name piyopiyo.jp; location / { proxy_pass http://127.0.0.1:XXXXX; } } 調べたポート番号
  • 38.
    Docker registry FUNTERACTIVEOPEN MEETING VOL.04 
  • 39.
  • 40.