LinAction.Lab Presents LinAction Theme Docker ~ WordPress 環環環環環環環環 環環環環環環 ver1.3 ~ Date : 2016.3.23 Location : 日日 IBM 日 日 1
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.19UTS namespace ホストネームの分離 Kernel 2.6.19IPC namespace IPC (プロセス間通信)の分離 Kernel 2.6.19User namespace ユーザ( UID/GID )の分離 Kernel 2.6.23 ~ Kernel3.8PID namespace プロセステーブルの分離 Kernel 2.6.24Network 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:latesttag:6.7・・
tag:latesttag: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 builddocker commit
Docker ハンズオン~ WordPress の環境作成~
概要• Docker のインストール• Docker Hub からコンテナーイメージの pull• コンテナーの起動• 起動したコンテナーの確認• コンテナーとホスト Linux との切替• コンテナーの起動と停止• Dockerfile から WordPress 環境作成• コンテナーの commit• コンテナーイメージを Docker Hub に push
Docker Hub
仮想環境( Virtualbox,VMWare )
docker pull
docker push
docker rundocker psdocker imagesdocker startdocker stopdocker attachdocker commitdocker builddocker rmdocker rmi
docker searchdocker login Dockerfile
11
12
Docker 実践入門
中井悦司さん
SoftwareDesign2015 年 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/0be8ff750951193406081.Docker のインストール
# yum -y install docker
2.Docker の自動起動設定及びサービスの起動
# systemctl enable docker.service# systemctl start docker.service
13
3. コンテナーイメージへのディスク最適化設定追加# vi /etc/sysconfig/dockerOPTIONS=‘--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 linactionINDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATEDdocker.io docker.io/linaction/centos Sample CentOS6.7(Final) 0
2. コンテナーイメージをダウンロード# docker pull -a linaction/centoscentos6: Pulling from docker.io/linaction/centos
47d44cb6f252: Already exists6a7b54515901: Already existse788880c8cfa: Already exists1debf8fb53e6: Already exists72703a0520b7: Already exists68833123ff9e: Already existsce76491a3be1: Already existsDigest: sha256:759ea478951130a32e9191daaffc9b4e3c5ad089331eccc32112e370bf7c9fb8Status: Image is up to date for docker.io/linaction/centos
14
3.ダウンロードしたイメージを確認
# docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEdocker.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-releaseCentOS release 6.7 (Final)
2. コンテナー内のプロセスを確認[root@f2f7ecdecaf2 /]# ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 04:55 ? 00:00:00 /bin/bashroot 13 1 0 04:59 ? 00:00:00 ps -ef
3. コンテナー環境のネットワークを確認[root@f2f7ecdecaf2 /]# ifconfig eth0eth0 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 -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf2f7ecdecaf2 linaction/centos:centos6 "/bin/bash" 23 minutes ago Exited (137) 13 seconds ago centos01
5. 起動したコンテナーを確認# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf2f7ecdecaf2 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 DockerfileDockerfile の内容は次のページを参照: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.03ce407416874308af370951ecf56c77b53e2aa405ba20aae51593fd3a0e2e108
-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 start\nservice httpd start\n/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.0cf75652d0f8a1509a5ad132ecf1214416c2b8dbf9fe9f93830ab8b51e738db73
4. コンテナーイメージを確認
# docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZElinaction/wordpress ver1.0 cf75652d0f8a 56 seconds ago 474.9 MBdocker.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 loginUsername: linactionPassword:Email:Login Succeeded
2.Docker Hub にコンテナーイメージを push# docker push linaction/wordpressDo you really want to push to public registry? [y/n]: yThe push refers to a repository [docker.io/linaction/wordpress] (len: 0)・・Digest: sha256:97e3bd8b7ed451163af7284513d398c426c796451d343400a9859156c1a8c021
23
3. リポジトリーを確認# docker search linactionINDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATEDdocker.io docker.io/linaction/centos Sample CentOS6.7(Final) 0docker.io docker.io/linaction/wordpress
24
最後に全てのイメージと停止コンテナを削除して、 push した wordpress のコンテナーイメージをダウンロードして起動してみましょう。
# docker rm `docker ps -a -q`# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1. 停止コンテナの一括削除
# docker rmi イメージ ID# docker imagesREPOSITORY 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 builddocker commitdocker push
Web/AP環境DB環境
Git リポジトリDocker Hub(イメージレジストリ)
=====================
=====================
開発用端末 テストサーバ
git pushgit 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