LinAction.Lab Presents
LinAction Theme
Docker
~WordPress環境を作ってみる ハンズオン編 ver1.3~
Date : 2016.3.23
Location : 日本IBM本社
1
LinAction.Labについて
LinAction = Linux + Action
「Linuxで行動を起こそう!」というスローガンを基に、ハンズオンを中心にLinuxに関わる
あらゆることを追求するコミュニティです。
難しいことはひとまず置いて、まずは試して、触って、行動優先から深めて行きましょう。
その、「まずは試して、触って」のお役に立てればと思います。
2
サーバ仮想化について
①ベアメタル環境(非仮想化環境)
OS
物理ハードウェア
② ソフトウェアによる仮想化
仮想
マシン
物理ハードウェア
ゲスト
OS
仮想
マシン
ゲスト
OS
仮想
マシン
ゲスト
OS
③ ソフトウェアによる仮想化
仮想
マシン
ハイパーバイザー
(カーネルモジュール)
物理ハードウェア
ゲスト
OS
仮想
マシン
ゲスト
OS
ハイパーバイザー(ソフトウェア)
ホストOS
ホストOSにハイパーバイザ機能を追加
物理ハードウェア上にハイパーバイザを導入
VMware,Xenなど
Linux KVM
3
Dockerの基礎技術~Linuxコンテナー~
Linuxコンテナーは、仮想マシンやゲストOSという考え方はありません。(仮想ではない)
Linuxカーネルが提供する機能により、Linux上で稼働するユーザープロセスをグループに分割
して、それぞれのグループごとに異なる環境(ファイルシステム、ネットワーク等)を割り当て
られた空間(コンテナー)です。
物理ハードウェア
ベアメタル環境(非仮想化環境)
ユ
ー
ザ
ー
プ
ロ
セ
ス
ユ
ー
ザ
ー
プ
ロ
セ
ス
ユ
ー
ザ
ー
プ
ロ
セ
ス
・ ・ ・
カーネル空間
物理ハードウェア
コンテナーで分割した環境
・
カーネル空間
ユ
ー
ザ
ー
プ
ロ
セ
ス
・・
ユーザー空間 ユーザ空間
ユ
ー
ザ
ー
プ
ロ
セ
ス
ユ
ー
ザ
ー
プ
ロ
セ
ス
ユ
ー
ザ
ー
プ
ロ
セ
ス
ユーザー空間
OS
コンテナ
4
Dockerの基礎技術~Linuxコンテナー~
物理ハードウェア
コンテナーに属さないユーザー空間をLinuxホストと呼んだりします。
・
カーネル空間
ユ
ー
ザ
ー
プ
ロ
セ
ス
・・
コンテナー コンテナー
ユ
ー
ザ
ー
プ
ロ
セ
ス
ユ
ー
ザ
ー
プ
ロ
セ
ス
ユ
ー
ザ
ー
プ
ロ
セ
ス
5
ユ
ー
ザ
ー
プ
ロ
セ
ス
ユ
ー
ザ
ー
プ
ロ
セ
ス
Docker
サービス
ユーザー空間
Dockerの基礎技術~Linuxコンテナー~
■namespace機能
namespace 説明 実装対象カーネル
Mount namespace ファイルシステムの分離 Kernel 2.4.19
UTS namespace ホストネームの分離 Kernel 2.6.19
IPC namespace IPC(プロセス間通信)の分離 Kernel 2.6.19
User namespace ユーザ(UID/GID)の分離 Kernel 2.6.23~Kernel3.8
PID namespace プロセステーブルの分離 Kernel 2.6.24
Network namespace ネットワーク設定の分離 Kernel 2.6.24
namespace機能は、ユーザープロセスのグループ(コンテナー)分割を始め、
ファイルシステムやネットワーク設定の分離等、いくつかの種類があります。
■cgroups機能
cgroups機能は、それぞれのグループ(コンテナー)に対して、CPU、メモリの割
り当てを制御する機能です。
6
Linuxコンテナーを実現するための主なカーネル機能として、namespace機能と
cgroups機能があります。
Dockerとは?
Linuxコンテナーは、Linuxカーネルの機能(namespace機能やcgroups機能)を
組み合わせて実現されるものです。
それでは、Dockerとは何でしょうか?
Dockerとは、Linuxカーネルの機能を統合してコンテナーを
作り上げる管理ツールです。
7
Dockerの基礎技術~Dockerイメージ~
物理ハードウェア
pull
カーネル空間
ユ
ー
ザ
ー
プ
ロ
セ
ス
コンテナー コンテナー
ユ
ー
ザ
ー
プ
ロ
セ
ス
ユ
ー
ザ
ー
プ
ロ
セ
ス
8
ユーザー空間
Docker Hub
(レジストリ)
CentOS
レポジトリ
Ubuntu
レポジトリ
https://hub.docker.com/
push
tag:latest
tag:6.7
・
・
tag:latest
tag:14.04
・
・
DockerHubからpullしたDockerイメージをコンテナーに当てることでCentOSや
Ubuntuをコンテナーで起動できます。
Dockerの基礎技術~Dockerイメージ構造~
9
Docker
イメージ
読み込み専用
(ReadOnly)
ベースイメージ
CentOS,Ubuntu等
イメージ層
コマンドごとに記録
ベースイメージ
CentOS,Ubuntu等
イメージ層
コマンドごとに記録
書き込み可能な
イメージ層
読み込み専用
(ReadOnly)
コンテナーが起動すると、
自動的に書き込み可能な
レイヤーが作られる仕組
みです。
(1)Dockerイメージの構造
(2)Dockerコンテナー起動時の構造
Dockerの基本機能
Docker Hub
(イメージレジストリ)
Dockerfile
10
Dockerイメージ
アプリケーション
フレームワーク
アプリケーション
ライブラリ
OSイメージ
Dockerサーバ
① Dockerイメージ自動作成
② Dockerイメージ
の保存・公開
③ Dockerサーバにイメージ配布・実行
イメージの
作成手順を記載
docker pull
docker push
docker build
docker commit
Dockerハンズオン~WordPressの環境作成~
概要
• Dockerのインストール
• Docker Hubからコンテナーイメージのpull
• コンテナーの起動
• 起動したコンテナーの確認
• コンテナーとホストLinuxとの切替
• コンテナーの起動と停止
• DockerfileからWordPress環境作成
• コンテナーのcommit
• コンテナーイメージをDocker Hubにpush
Docker Hub
仮想環境
(Virtualbox,VMWare)
docker pull
docker push
docker run
docker ps
docker images
docker start
docker stop
docker attach
docker commit
docker build
docker rm
docker rmi
docker search
docker login Dockerfile
11
12
Docker実践入門
中井悦司さん
SoftwareDesign
2015年12月号
参考図書・資料
http://www.slideshare.net/enakai/docker-with-rhel7
Docker with RHEL7 技術勉強会
http://www.slideshare.net/zembutsu/devsumi-2016-docker-introduction
Docker 基礎講座
前佛雅人さん
Dockerのインストール
スライドに記載しているテキストは、以下をご利用ください。
http://qiita.com/cyberblack28/private/0be8ff75095119340608
1.Dockerのインストール
# yum -y install docker
2.Dockerの自動起動設定及びサービスの起動
# systemctl enable docker.service
# systemctl start docker.service
13
3.コンテナーイメージへのディスク最適化設定追加
# vi /etc/sysconfig/docker
OPTIONS=‘--selinux-enabled’
↓
OPTIONS=‘--selinux-enabled --storage-opt dm.no_warn_on_loop_devices=true’
:wq
4.Dockerサービスの再起動
# systemctl restart docker.service
Docker Hubからコンテナーイメージのpull
CentOS6のコンテナーイメージをDocker Hubからダウンロードします。
1.searchサブコマンドでレジストリーを検索
# docker search linaction
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/linaction/centos Sample CentOS6.7(Final) 0
2.コンテナーイメージをダウンロード
# docker pull -a linaction/centos
centos6: Pulling from docker.io/linaction/centos
47d44cb6f252: Already exists
6a7b54515901: Already exists
e788880c8cfa: Already exists
1debf8fb53e6: Already exists
72703a0520b7: Already exists
68833123ff9e: Already exists
ce76491a3be1: Already exists
Digest: sha256:759ea478951130a32e9191daaffc9b4e3c5ad089331eccc32112e370bf7c9fb8
Status: Image is up to date for docker.io/linaction/centos
14
3.ダウンロードしたイメージを確認
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
docker.io/linaction/centos centos6 ce76491a3be1 About an hour ago 190.6 MB
15
コンテナーの起動
CentOS6のイメージからコンテナーを起動してみましょう。
1.コンテナーを起動
# docker run -it --name centos01 linaction/centos:centos6 /bin/bash
[root@f2f7ecdecaf2 /]#
# docker run -it -name centos01 linaction/centos:centos6 /bin/bash
コマンド詳細
① -i オプションは、コンテナーを実行したコマンドの標準出力に接続して、対話的に
操作できるようにします。
② -t オプションは、コンテナーに疑似TTY端末を割り当てます。
③ --nameオプションは、起動するコンテナーに名前を付与します。省略すると自動
的に名前が付与されます。
④ linaction/centoos:centos6は使用するコンテナーイメージを指定します。
⑤ /bin/bashは、コンテナー内で最初に実行するコマンドを指定します。
①② ③ ④ ⑤
16
新規にコンテナーを起動する度に自動的にランダムに割り当てられます。
起動したコンテナーの確認
1.コンテナー環境のOSのバージョンを確認
[root@f2f7ecdecaf2 /]# cat /etc/redhat-release
CentOS release 6.7 (Final)
2.コンテナー内のプロセスを確認
[root@f2f7ecdecaf2 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 04:55 ? 00:00:00 /bin/bash
root 13 1 0 04:59 ? 00:00:00 ps -ef
3.コンテナー環境のネットワークを確認
[root@f2f7ecdecaf2 /]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:04
inet addr:172.17.0.4 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:acff:fe11:4/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:648 (648.0 b) TX bytes:738 (738.0 b)
17
コンテナーとホストLinuxの切替
1.コンテナーの/bin/bashから抜けてホストLinuxに戻る
2.ホストLinuxから再度コンテナー内のbashに接続
# docker attach centos01
[root@f2f7ecdecaf2 /]#
Ctrl + P Q
Ctrlキーを押したまま、PとQを順番に押す。
attachの後には、--nameで指定した名前を指定します。
18
コンテナーの起動と停止
1.Linuxホストに戻る
2.コンテナーを停止
# docker stop centos01
Ctrlキーを押したまま、PとQを順番に押す。
stopの後には、--nameで指定した名前を指定します。
3.停止したコンテナーを確認
4.コンテナーを起動
startの後には、--nameで指定した名前を指定します。
# docker start centos01
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2f7ecdecaf2 linaction/centos:centos6 "/bin/bash" 23 minutes ago Exited (137) 13 seconds ago centos01
5.起動したコンテナーを確認
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2f7ecdecaf2 linaction/centos:centos6 "/bin/bash" 30 minutes ago Up 4 seconds centos01
19
DockerfileからWordPress環境作成
1.コンテナーを停止
# docker stop centos01
2.build用のディレクトリを作成
3.Dockerfileを作成
# cd build_wordpress
# vi Dockerfile
Dockerfileの内容は次のページを参照
:wq
# mkdir ~/build_wordpress
4.Dockerfileを実行
# docker build -t linaction/wordpress:ver1.0 ~/build_wordpress
・
・
Successfully built 0c4e45b86bcd
5.コンテナーを起動
# docker run -itd -p 8000:80 --name wordpress01 linaction/wordpress:ver1.0
3ce407416874308af370951ecf56c77b53e2aa405ba20aae51593fd3a0e2e108
-d オプションはバックグラウンドでの実行。
-p オプションはポートフォワーディング、Linuxホスト8000番→コンテナー80番に転送。
20
#centos6のイメージを取得
FROM centos:centos6
#Dockerfile作成者
MAINTAINER linaction
#タイムゾーンの設定
RUN /bin/cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
#yumによるHTTPD,MySQL,PHP,tar,wgetのインストール
RUN yum -y install httpd php php-mysql mysql-server tar wget php-gd
#tmpディレクトリに移動
WORKDIR /tmp/
#wordpress一式のダウンロード
RUN wget https://ja.wordpress.org/latest-ja.tar.gz
#wordpressの展開
RUN tar xvfz ./latest-ja.tar.gz
#ダウンロードしたwordpressの削除
RUN rm -f ./latest-ja.tar.gz
#wordpressディレクトリ内のファイルをDocumentRootに移動
RUN mv wordpress/* /var/www/html/
#wordpressのconfigファイルをリネームして利用可能にする
RUN cp /var/www/html/wp-config-sample.php /var/www/html/wp-config.php
#wordpressのconfigファイルに必要な情報をsedコマンドで書き換える
RUN sed -i -e 's/database_name_here/wordpress/g' -e 's/username_here/wordpress/g' -e 's/password_here/wppass/g' /var/www/html/wp-config.php
#DocumentRootディレクトリの所有者をapacheに変更
RUN chown -R apache.apache /var/www/html/
#mysqldの起動、DB作成、ユーザ作成および権限設定、mysqldの停止
RUN service mysqld start && mysql -u root -e "CREATE DATABASE wordpress; GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'localhost' IDENTIFIED BY 'wppass';
FLUSH PRIVILEGES;" && service mysqld stop
#mysqld,httpdの起動スクリプトの作成
RUN echo -e "service mysqld startnservice httpd startn/bin/bash" > /startService.sh
#mysqld,httpdの起動スクリプトの権限設定
RUN chmod o+x /startService.sh
#公開ポート
EXPOSE 80
#mysqld,httpdの起動スクリプトの実行
CMD /startService.sh
Dockerfileの内容
21
命令 説明
FROM コンテナーイメージを指定 「リポジトリー:タグ名」
MAINTAINER コンテナーイメージ作成者名
ENV 環境変数を設定
RUN コマンドの実行
ADD ホストLinuxからファイルを設置
EXPOSE コンテナーで使用するポート番号を指定
CMD コンテナー起動時に実行するコマンドを指定
WORKDIR RUN,CMD,ENTRYPOINTを実行する時のワーキングディレ
クトリを指定
コンテナーのcommit
1.ブラウザを起動し、「http://VirtualBoxのIPアドレス:8000/」にアクセスし、
WordPressの管理画面が表示されることを確認
2.コンテナーを停止
# docker stop wordpress01
3.コンテナーを保存
# docker commit wordpress01 linaction/wordpress:ver1.0
cf75652d0f8a1509a5ad132ecf1214416c2b8dbf9fe9f93830ab8b51e738db73
4.コンテナーイメージを確認
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
linaction/wordpress ver1.0 cf75652d0f8a 56 seconds ago 474.9 MB
docker.io/linaction/centos centos6 ce76491a3be1 2 hours ago 190.6 MB
22
# docker commit wordpress01 linaction/wordpress:ver1.0
コマンド詳細
① ② ③
① コンテナ名
② リポジトリ名
③ タグ名
コンテナーイメージをDocker Hubにpush
事前に「https://hub.docker.com/」にアクセスし、Docker Hubのアカウントを
作成しておく必要があります。本勉強会ではlinactionのアカウントでデモします。
1.Docker Hubにログイン
# docker login
Username: linaction
Password:
Email:
Login Succeeded
2.Docker Hubにコンテナーイメージをpush
# docker push linaction/wordpress
Do you really want to push to public registry? [y/n]: y
The push refers to a repository [docker.io/linaction/wordpress] (len: 0)
・
・
Digest: sha256:97e3bd8b7ed451163af7284513d398c426c796451d343400a9859156c1a8c021
23
3.リポジトリーを確認
# docker search linaction
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/linaction/centos Sample CentOS6.7(Final) 0
docker.io docker.io/linaction/wordpress
24
最後に全てのイメージと停止コンテナを削除して、pushしたwordpressのコンテ
ナーイメージをダウンロードして起動してみましょう。
# docker rm `docker ps -a -q`
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1.停止コンテナの一括削除
# docker rmi イメージID
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
2.イメージの一括削除
# docker pull -a linaction/wordpress
3.wordpressのコンテナーイメージをダウンロード
4.コンテナーを起動
# docker run -itd -p 8000:80 --name wordpress01 linaction/wordpress:ver1.0
25
コンテナーのライフサイクル
26
run(起動)、stop(停止)、start(再開)、commit(保存)、rm(削除)における、
コンテナーのライフサイクルは以下の様になります。
保存イメージ スナップショット
プロセス
スナップショット スナップショット
保存イメージ
run start
stop rm
commit
コンテナーが破棄されます。
コンテナーを複製して、保存イ
メージとして登録します。
コンテナーを停止するとプロセ
スが終了し、コンテナーが残り
ます。
コンテナーの起動と同時にス
ナップショットが作成されます。
アプリケーション開発におけるDockerの利用
Dockerfile
27
docker build
docker commit
docker push
Web/AP環境
DB環境
GitリポジトリDocker Hub
(イメージレジストリ)
=======
=======
=======
=======
=======
=======
開発用端末 テストサーバ
git push
git pull
git pull
CIツール等を用い
てインテグレー
ションテストの自
動実行
本番サーバ
Web/AP環境
Docker Hub
(イメージレジストリ)
DB環境
===
===
===
==========
=======
=======
docker push
docker pull
===
===
===
===
テストが実施されたOSも含めたアプリケーション環境をDockerイメージにして、
本番環境にデプロイすることでアプリケーションの配布を安全かつ容易にします。
Dockerイメー
ジを自動で作成
する。
===
===
===
===
===
===
===
===
===
===
===
===
===
===
===
===
docker run
docker pull
おまけ~Docker + TensorFlow~
28
2015年11月末にGoogleから公開された深層学習フレームワーク、TensorFlowも
Dockerで簡単に利用できます。
※ちなみに、AlphaGOの機械学習にはGoogle Cloud Platform上でTensorFlowが使用されています。
# docker run -it b.gcr.io/tensorflow/tensorflow

LinAction Theme Docker