docker入門~word press環境を作ってみる ハンズオン編 ver1.4~ pulic
TRANSCRIPT
LinAction.Lab Presents
LinAction Theme
Docker入門~WordPress 環境を作ってみる ハンズオン編 ver1.4 ~
Date : 2017.2.28 Location : Rancher もくもく勉強会 #3
1
コミュニティ活動
LinAction = Linux + Action
ハンズオンを中心に Linux に関わるあらゆることを追求するコミュニティです。
2
日本で Rancher 及び関連するコンテナ技術の啓蒙活動を行うコミュニティです。
サーバ仮想化について
Docker の基礎技術~ Linux コンテナー~
Docker とは?
Docker の基礎技術~ Docker イメージ~
Docker ハンズオン~ WordPress の環境作成~
参考図書・資料
Docker のインストール
Docker Hub からコンテナーイメージの pullコンテナーの起動
起動したコンテナーの確認
コンテナーとホスト Linux との切替
コンテナーの起動と停止
Dockerfile から WordPress 環境作成
コンテナーの commitコンテナーイメージを Docker Hub に pushコンテナーのライフサイクル
3
アジェンダ
サーバ仮想化について
① 非仮想化環境
4
物理ハードウェア
OS
アプリケーション
サーバ仮想化について
5
物理ハードウェア
ホスト OS仮想化アプリケーション
仮想マシン Aアプリケーション
ゲスト OS
仮想マシン Bアプリケーション
ゲスト OS
仮想マシン Cアプリケーション
ゲスト OS
② ホスト OS 型仮想
ホスト OS 上の仮想化アプリケーション上で仮想マシンを稼働させる。
VMware Workstation 、 Microsoft VirtualPC 、 VirtualBox
サーバ仮想化について
6
物理ハードウェアハイパーバイザー
仮想マシン Aアプリケーション
ゲスト OS
仮想マシン Bアプリケーション
ゲスト OS
仮想マシン Cアプリケーション
ゲスト OS
③ ハイパーバイザー型仮想(ソフトウェア)
ホスト OS を必要とせず、ハイパーバイザーというソフトウェア上で仮想マシンを稼働させる。
VMware ESXi 、 Xen/Citrix XenServer 、 Microsoft Hyper-V
サーバ仮想化について
7
物理ハードウェア
ホスト OSハイパーバイザー
仮想マシン Aアプリケーション
ゲスト OS
仮想マシン Bアプリケーション
ゲスト OS
④ ハイパーバイザー型仮想(カーネルモジュール)
ホスト OS ( Linux )のカーネルモジュールのハイパーバイザー機能で仮想マシンを稼働させる。
Linux KVM
Docker の基礎技術~ Linux コンテナー~
Linux コンテナーは、仮想マシン、ゲスト OS という考え方はありません。(仮想ではない)
Linux カーネルの機能により、 Linux 上で稼働するユーザープロセスをグループに分割し、各グループごとに異なる環境(ファイルシステム、ネットワーク等)を割り当てたユーザー空間(コンテナー)のことです。
物理ハードウェア
非仮想化環境
ユー
ザー
プロ
セス ユ
ーザ
ープ
ロセ
ス ユー
ザー
プロ
セス
・ ・ ・カーネル空間
物理ハードウェア
分割した環境
・
カーネル空間
ユー
ザー
プロ
セス
・ ・
ユーザー空間 ユーザー空間
ユー
ザー
プロ
セス ユ
ーザ
ープ
ロセ
ス ユー
ザー
プロ
セス
ユーザー空間
OSコンテナ
8
Docker の基礎技術~ Linux コンテナー~
物理ハードウェア
コンテナーに属さないユーザー空間を Linux ホストと呼んだりします。
・
カーネル空間
ユー
ザー
プロ
セス
・ ・
ユーザー空間 ユーザー空間ユ
ーザ
ープ
ロセ
ス ユー
ザー
プロ
セス ユ
ーザ
ープ
ロセ
ス
9
ユー
ザー
プロ
セス
ユー
ザー
プロ
セス
ユーザー空間 = Linux ホスト
ユー
ザー
プロ
セス
・ ・ ・ コンテナ
Docker の基礎技術~ Linux コンテナー~
■namespace 機能
namespace 説明
Mount namespace ファイルシステムの分離
UTS namespace ホストネームの分離
IPC namespace IPC (プロセス間通信)の分離
User namespace ユーザ( UID/GID )の分離
PID namespace プロセステーブルの分離
Network namespace ネットワーク設定の分離
namespace 機能は、ユーザープロセスのグループ分割を始め、ファイルシステムやネットワーク設定の分離等、いくつかの種類があります。
■cgroups 機能
cgroups 機能は、それぞれのグループ(コンテナー)に対して、 CPU 、メモリの割り当てを制御する機能です。
10
Linux コンテナーを実現するための主なカーネル機能として、 namespace 機能と cgroups 機能があります。
Docker とは?
Linux コンテナーは、 Linux カーネルの機能である namespace 機能や cgroups 機能
を組み合わせて実現されるものです。
11
Docker とは?
それでは、 Docker とは何でしょうか?
12
Docker とは?
Docker とは、 Linux カーネルの機能を統合してコンテナーを作り上げる管理ツールです。
13
Docker の基礎技術~ Docker イメージ~
物理ハードウェア
pull
カーネル空間
ユー
ザー
プロ
セス
コンテナー コンテナー
ユー
ザー
プロ
セス ユ
ーザ
ープ
ロセ
ス
14
ユーザー空間Docker Hub(レジストリ)
CentOSレポジトリ
Ubuntuレポジトリ
https://hub.docker.com/
push
tag:latesttag:6.7・・
tag:latesttag:14.04・・
DockerHub から pull した Docker イメージをコンテナーに当てることでCentOS や Ubuntu をコンテナーで起動できます。
Docker の基礎技術~ Docker イメージ構造~
15
Dockerイメージ
読み込み専用( ReadOnly
) ベースイメージCentOS,Ubuntu 等
イメージ層コマンドごとに記録
ベースイメージCentOS,Ubuntu 等
イメージ層コマンド( RUN )及びビルドごとに記録
書き込み可能なイメージ層
読み込み専用( ReadOnly
)
コンテナーが起動すると、自動的に書き込み可能なレイヤーが作られる仕組みです。
( 1 ) Docker イメージの構造
( 2 ) Docker コンテナー起動時の構造
Docker の基本機能
Docker Hub(イメージレジストリ)
Dockerfile
16
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
17
18
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/items/e3fb956f584094341c62
1.Docker のインストール
# yum -y install docker
2.Docker の自動起動設定及びサービスの起動
# systemctl enable docker.service# systemctl start docker.service
19
ディストリビューションの Docker をインストールする場合
# curl -fsSL https://get.docker.com/ | sh
最新の Docker をインストールする場合※ 本ハンズオンでは最新の Docker では後半のビルドでエラーとなるので yum でインストールします。
3.Docker のバージョンを確認
# docker version
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
20
3. ダウンロードしたイメージを確認
# docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEdocker.io/linaction/centos centos6 ce76491a3be1 About an hour ago 190.6 MB
21
コンテナーの起動
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 は、コンテナー内で最初に実行するコマンドを指定します。
①② ③ ④ ⑤
22
新規にコンテナーを起動する度に自動的にランダムに割り当てられます。
起動したコンテナーの確認
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)
23
コンテナーとホスト Linux の切替
1. コンテナーの /bin/bash から抜けてホスト Linux に戻る
2. ホスト Linux から再度コンテナー内の bash に接続
# docker attach centos01[root@f2f7ecdecaf2 /]#
Ctrl + P Q
Ctrl キーを押したまま、 P と Q を順番に押す。
attach の後には、 --name で指定した名前を指定します。
24
コンテナーの起動と停止
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
25
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番に転送。
26
#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 の内容
27
命令 説明
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
28
# 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
29
3. リポジトリーを確認# docker search linactionINDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATEDdocker.io docker.io/linaction/centos Sample CentOS6.7(Final) 0docker.io docker.io/linaction/wordpress
30
最後に全てのイメージと停止コンテナを削除して、 push した wordpress のコンテナーイメージをダウンロードして起動してみましょう。
# docker rm `docker ps -a -q`# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1. 停止コンテナの一括削除
# docker rmi `docker images -aq`# 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
31
コンテナーのライフサイクル
32
run( 起動 ) 、 stop( 停止 ) 、 start(再開 ) 、 commit( 保存 ) 、 rm(削除 ) における、コンテナーのライフサイクルは以下の様になります。
保存イメージ スナップショット
プロセス
スナップショット スナップショット
保存イメージ
run start
stop rm
commit
コンテナーが破棄されます。
コンテナーを複製して、保存イメージとして登録します。
コンテナーを停止するとプロセスが終了し、コンテナーが残ります。
コンテナーの起動と同時にスナップショットが作成されます。
33
ご清聴ありがとうございました!