Docker入門
OSC2018 Tokyo/Spring 2.24
cyberblack28
Profile
Twitter:cyberblack28
Job
Infrastructure Engineer
Frontend Engineer
Educational Solutions Architect
Community
Hobby1: Music,Live,FES !!
Hobby2: Take a picture !!
https://www.flickr.com/photos/cyberblack
ISBN-10: 4798155373
ISBN-13: 978-4798155371
第6章 Rancher2.0の
部分を執筆しました。
2018年3月15日発売
• サーバ仮想化について
• Dockerの基礎技術~Linuxコンテナー~
• Dockerとは?
• Dockerの基礎技術~Dockerイメージ~
• Dockerハンズオン~WordPressの環境作成~
• 参考図書・資料
• Dockerのインストール
• Docker Hubからコンテナーイメージのpull
• コンテナーの起動
• 起動したコンテナーの確認
• コンテナーとホストLinuxとの切替
• コンテナーの起動と停止
• DockerfileからWordPress環境作成
• コンテナーのcommit
• コンテナーイメージをDocker Hubにpush
• コンテナーのライフサイクル
3
アジェンダ
前半
• 複数コンテナー
• Docker Compose
• docker-compose.ymlの内容
• .envファイルの内容
• 主なコマンド
後半
サーバ仮想化について
①非仮想化環境
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:latest
tag:6.7
・
・
tag:latest
tag: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 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
17
18
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 基礎講座
前佛雅人さん
19
コマンドのテキスト
2.Docker pull commit push Dockerfile WordPress環境をつくる~
Docker Compose~
https://goo.gl/nFJooG
1.Docker pull commit push Dockerfile WordPress環境をつくる
https://goo.gl/fsDAAa
コマンドのテキストは、Qiitaにあります!
Dockerのインストール
スライドに記載しているテキストは、以下をご利用ください。
http://qiita.com/cyberblack28/items/e3fb956f584094341c62
1.Dockerのインストール
# yum -y install docker
2.Dockerの自動起動設定及びサービスの起動
# systemctl enable docker.service
# systemctl start docker.service
20
ディストリビューションの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 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
21
3.ダウンロードしたイメージを確認
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
docker.io/linaction/centos centos6 ce76491a3be1 About an hour ago 190.6 MB
22
コンテナーの起動
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は、コンテナー内で最初に実行するコマンドを指定します。
①② ③ ④ ⑤
23
新規にコンテナーを起動する度に自動的にランダムに割り当てられます。
起動したコンテナーの確認
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)
24
コンテナーとホストLinuxの切替
1.コンテナーの/bin/bashから抜けてホストLinuxに戻る
2.ホストLinuxから再度コンテナー内のbashに接続
# docker attach centos01
[root@f2f7ecdecaf2 /]#
Ctrl + P Q
Ctrlキーを押したまま、PとQを順番に押す。
attachの後には、--nameで指定した名前を指定します。
25
コンテナーの起動と停止
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
26
コンテナーの起動と停止
6.docker execコマンド
# docker exec -it centos01 /bin/bash
docker execコマンドの場合は、exitしてもコンテナは終了せず、稼働し続けます。
27
attachは、コンテナーで起動しているPID=1のプロセスの標準入出力(STDIN/STDOUT)
に接続するため、exitと同時にPID=1の/bin/bashが終了し、コンテナーも停止する。
exitの場合は、新たに/bin/bashのプロセスが起動し、exitしても新規の/bin/bashプロセ
スが終了となるため、元々の/bin/bash自体は停止しないため、コンテナーは稼働状態と
なる。
attachとexecの違い
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番に転送。
28
#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の内容
29
命令 説明
FROM コンテナーイメージを指定 「リポジトリー:タグ名」
MAINTAINER コンテナーイメージ作成者名
ENV 環境変数を設定
RUN コマンドの実行
ADD ホストLinuxからファイルを設置
EXPOSE コンテナーで使用するポート番号を指定
CMD コンテナー起動時に実行するコマンドを指定
WORKDIR RUN,CMD,ENTRYPOINTを実行する時のワーキングディレ
クトリを指定
30
8000 Port
80 Port
ポート
フォワーディング
アクセスの流れ
コンテナーの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
31
# 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
32
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
33
最後に全てのイメージと停止コンテナを削除して、pushしたwordpressのコンテ
ナーイメージをダウンロードして起動してみましょう。
# docker rm `docker ps -a -q`
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1.停止コンテナの一括削除
# docker rmi `docker images -aq`
# 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
34
コンテナーのライフサイクル
35
run(起動)、stop(停止)、start(再開)、commit(保存)、rm(削除)における、
コンテナーのライフサイクルは以下の様になります。
保存イメージ スナップショット
プロセス
スナップショット スナップショット
保存イメージ
run start
stop rm
commit
コンテナーが破棄されます。
コンテナーを複製して、保存イ
メージとして登録します。
コンテナーを停止するとプロセ
スが終了し、コンテナーが残り
ます。
コンテナーの起動と同時にス
ナップショットが作成されます。
複数のコンテナー
36
前半では、1コンテナーの中に、Apache、MySQLをインストールしました。
推奨されているコンテナーの利用方法として、「1コンテナ1プロセス」が
あります。
これは大規模でオーケストレーションツール(Kubernetes等)と組み合わ
せたマイクロサービスのシステム上で有用性があります。
もう少し小さい規模においては、例えば、WEB、APP、DB等のロール
ベースに分けることが良いとされているケースもあります。
後半では、Docker Composeを利用して、WEB(WordPress)と
DB(MySQL)を分けて、複数コンテナー管理をしてみようと思います。
Docker Compose
37
docker compose は docker-compose.ymlというファイルで構成を定
義します。YAML で体系的に構成を定義出来るので複数コンテナーの全体
像を管理しやすくなります。
docker run時のオプションも定義できるので、コマンド1回実行するだけ
で複数のコンテナを起動できます。
Docker Compose
38
1. Docker Composeのインストール
2. docker-compose.ymlの作成
3. WordPressコンテナーとMySQLコンテナーの一括起動
39
# curl -L https://github.com/docker/compose/releases/download/1.9.0/docker-compose-`uname -s`-
`uname -m` > /usr/local/bin/docker-compose# docker ps -a
1.Docker Composeのインストール
2.ダウンロードしたバイナリに対して実行権限を追加
# chmod +x /usr/local/bin/docker-compose
3.インストール確認
# docker-compose -v
docker-compose version 1.9.0, build 2585387
4.docker-compose.ymlの作成
# vim docker-compose.yml
5..envファイルの作成
# vim .env
6.コンテナー一括起動
# docker-compose up -d
40
version: "2"
services:
wordpress:
image: wordpress:latest
ports:
- “8080:80"
depends_on:
- db
environment:
WORDPRESS_DB_HOST: "db:3306"
env_file: .env
db:
image: mysql:latest
env_file: .env
volumes:
- db-data:/var/lib/mysql
volumes:
db-data:
driver: local
定義 説明
version バージョン宣言
services:サービス設定カテゴリ
image コンテナを実行時に元となるイメージを指定し
ます。リポジトリ名・タグあるいはイメージ ID
の一部を指定
ports 公開用のポート
depends_on サービス間の依存関係を指定
environment 環境変数を追加します。
env_file ファイル上の定義から環境変数を追加
volumes パスをボリュームとしてマウントします。オプ
ションとしてホスト側のパスを指定(ホスト:コ
ンテナ)したり、アクセスモードを指定します
(ホスト:コンテナ:ro)。
volumes:ボリューム設定カテゴリ
driver ボリューム・ドライバがどのボリュームを使う
べきかを指定します。デフォルトは local
その他詳細は、こちらのリファレンスを参照。
http://docs.docker.jp/compose/compose-file.html
docker-compose.ymlの内容
41
WORDPRESS_DB_NAME=wordpress
WORDPRESS_DB_USER=wp_user
WORDPRESS_DB_PASSWORD=hogehoge
MYSQL_RANDOM_ROOT_PASSWORD=yes
MYSQL_DATABASE=wordpress
MYSQL_USER=wp_user
MYSQL_PASSWORD=hogehoge
定義 説明
WORDPRESS_DB_NAME WORDPRESSのDB名
WORDPRESS_DB_USER WORDPRESSのDBユーザ名
WORDPRESS_DB_PASSWORD WORDPRESSのDBパスワード
MYSQL_RANDOM_ROOT_PASSWORD yesを設定することで、rootユーザのための初期パスワードを
(pwgenを利用して)ランダムで生成
MYSQL_DATABASE WORDPRESS用のDB名
MYSQL_USER WORDPRESS用のDBユーザ名
MYSQL_PASSWORD WORDPRESS用のDBパスワード
.envファイルの内容
42
コマンド 説明
up コンテナーの生成/起動
down 全てのコンテナの停止と同時削除
scale 生成するコンテナー数の指定
ps コンテナーの一覧表示
logs コンテナーログ出力
run コンテナーの実行
start コンテナーの起動
stop コンテナーの停止
restart コンテナーの再起動
kill 実行中のコンテナーの強制停止
rm コンテナーの削除
主なコマンド
その他詳細は、こちらのリファレンスを参照。
http://docs.docker.jp/compose/reference/overview.html
43
LB
Internet
オーケストレーション
ツール
イメージ
レジストリ
本ハンズオンの構成
オーケストレーショ
ンツールを利用した
冗長構成

Docker入門 OSC 2018 Tokyo/Spring