仮想化 Linux 環境 Docker について
前田 俊行
千葉工業大学 人工知能・ソフトウェア技術研究センター

Docker ってなに?
• Linux 環境を仮想的に再現するソフトウェア

Docker ってなに?
• Linux 環境を仮想的に再現するソフトウェア

Docker ってなに?
• Linux 環境を仮想的に再現するソフトウェア

計算機上に、
その計算機とは別個・隔離された計算機環境を再現すること

仮想環境? 他にもいっぱいあるじゃん?
• KVM: https://www.linux-kvm.org/• VMware: http://www.vmware.com/• QEMU: http://www.qemu-project.org/• VirtualBox: https://www.virtualbox.org/• Hyper-V: http://www.microsoft.com/hyper-v• LXC: https://linuxcontainers.org/• Xen: https://www.xenproject.org/…

Docker の特徴•とても簡単•とても軽いDocker の特徴•とても簡単•とても軽いDocker を使ってみようDocker をインストールしよう
https://store.docker.com/search?
type=edition&offering=community• 上記ページからダウンロード、もしくはインストール手順が確認できます– Linux (Ubuntu, Debian, Fedra, CentOS, etc.) 版もmacOS 版もWindows 版もありますDocker コンテナを実行してみよう% docker run ubuntu cat /etc/lsb-releaseDocker コンテナを実行してみよう% docker run ubuntu cat /etc/lsb-release…
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"

Docker コンテナを実行してみよう% docker run ubuntu cat /etc/lsb-releaseDocker コンテナを実行してみよう% docker run ubuntu cat /etc/lsb-release

Docker ランタイム

Docker コンテナを実行してみよう% docker run ubuntu cat /etc/lsb-release

Docker ランタイム
Docker コマンド

Docker コンテナを実行してみよう
コンテナを
起動せよ!

※ コンテナ = 仮想環境

% docker run ubuntu cat /etc/lsb-release

Docker ランタイム
Docker コマンド

Docker コンテナを実行してみよう% docker run ubuntu cat /etc/lsb-release

Docker ランタイム
Docker コマンド

イメージ名

Docker コンテナを実行してみよう
このイメージを元に起動せよ!
% docker run ubuntu cat /etc/lsb-release

Docker ランタイム
Docker コマンド

イメージ名

Docker コンテナを実行してみよう% docker run ubuntu cat /etc/lsb-release

Docker ランタイム
Docker コマンド

イメージ名

実行コマンドDocker コンテナを実行してみよう
起動したコンテナ内でこのコマンドを実行せよ!
% docker run ubuntu cat /etc/lsb-release

Docker ランタイム
Docker コマンド

イメージ名

実行コマンドDocker コンテナを実行してみよう% docker run ubuntu cat /etc/lsb-releaseDocker コンテナを実行してみよう% docker run ubuntu cat /etc/lsb-release…
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"

イメージを探してみよう% docker search centos

イメージを探してみよう% docker search centos

DNAME
DESCRIPTION
centosThe official bjdeathe/centos-ssh
CentOS-6 6.8 x
jdeathe/centos-ssh-apache-php CentOS-6 6.8 x
consol/centos-xfce-vnc
Centos containnimmis/java-centos
This is docker…

イメージを探してみよう% docker search centos

Docker コマンド

イメージを探してみよう
イメージを
検索せよ!
% docker search centos

Docker コマンド

イメージを探してみよう% docker search centos

検索文字列
Docker コマンド

イメージを探してみよう
この文字列で検索せよ!
% docker search centos

検索文字列
Docker コマンド

イメージを探してみよう% docker search centos

イメージを探してみよう% docker search centos

DNAME
DESCRIPTION
centosThe official bjdeathe/centos-ssh
CentOS-6 6.8 x
jdeathe/centos-ssh-apache-php CentOS-6 6.8 x
consol/centos-xfce-vnc
Centos containnimmis/java-centos
This is docker…

見つかったイメージを実行してみよう% docker run centos cat /etc/redhat-release

見つかったイメージを実行してみよう% docker run centos cat /etc/redhat-release…
CentOS Linux release 7.3.1611 (Core)裏で何が起きているのか?
https://hub.docker.com

検索結果% docker search centos …

Cf. apt of Debian/Ubuntu and yum of CentOS/Fedora裏で何が起きているのか?
https://hub.docker.com

イメージ
リクエスト
(pull)

ダウンロード% docker run centos …

Cf. apt of Debian/Ubuntu and yum of CentOS/Fedora

Docker Hub: https://hub.docker.com• 様々な Docker イメージが登録されている
レジストリ• 欲しいイメージは大抵すでに存在している– ただし「誰でも登録できる」レジストリのため、オフィシャルイメージや信頼できるイメージ以外は実行しない方がよい

コンテナを実行してみよう (その2)イメージをダウンロードする% docker pull nginx

コンテナを実行してみよう (その2)イメージをダウンロードする% docker pull nginx

Using default tag: latest
latest: Pulling from library/nginx
693502eb7dfb: Downloading [====> ] 50.86 MB/
6decb850d2bc: Download complete
c3e19f087ed6: Download complete

コンテナを実行してみよう (その2)イメージをダウンロードする% docker pull nginx

Using default tag: latest
latest: Pulling from library/nginx
693502eb7dfb: Pull complete
6decb850d2bc: Pull complete
c3e19f087ed6: Pull complete
Digest: sha256:52a189e49c0c797cfc5cbfe578c68
Status: Downloaded newer image for nginx:lat

コンテナを実行してみよう (その2)イメージをダウンロードする% docker pull nginx

コンテナを実行してみよう (その2)イメージをダウンロードする% docker pull nginx

Docker コマンド

コンテナを実行してみよう (その2)イメージをダウンロードする
イメージを
ダウンロードせよ!
% docker pull nginx

Docker コマンド

コンテナを実行してみよう (その2)イメージをダウンロードする% docker pull nginx

イメージ名Docker コマンド

コンテナを実行してみよう (その2)イメージをダウンロードする
この名前のイメージをダウンロードせよ!
% docker pull nginx

イメージ名Docker コマンド

コンテナを実行してみよう (その2)イメージを確認する% docker images

コンテナを実行してみよう (その2)イメージを確認する% docker images
REPOSITORY
centosnginx
ubuntuTAG
latestlatestlatestIMAGE ID
98d35105a391
6b914bbcb89e
0ef2e08ed3fa

CREATED
4 days ago
2 weeks ag
2 weeks ag

コンテナを実行してみよう (その2)イメージを確認する% docker images

Docker コマンド

コンテナを実行してみよう (その2)イメージを確認する
ローカルに存在するイメージを列挙せよ!
% docker images

Docker コマンド

コンテナを実行してみよう (その2)イメージを確認する% docker images
REPOSITORY
centosnginx
ubuntuTAG
latestlatestlatestIMAGE ID
98d35105a391
6b914bbcb89e
0ef2e08ed3fa

CREATED
4 days ago
2 weeks ag
2 weeks ag

コンテナを実行してみよう (その2)イメージを確認する
イメージには「バージョン」がある% docker images
REPOSITORY
centosnginx
ubuntuTAG
latestlatestlatestIMAGE ID
98d35105a391
6b914bbcb89e
0ef2e08ed3fa

CREATED
4 days ago
2 weeks ag
2 weeks ag

コンテナを実行してみよう (その2)【ちょっと脱線】バージョンを指定してみよう% docker run ubuntu:17.04 cat /etc/lsb-releaseコンテナを実行してみよう (その2)【ちょっと脱線】バージョンを指定してみよう% docker run ubuntu:17.04 cat /etc/lsb-release

バージョン (tag)を指定しているコンテナを実行してみよう (その2)【ちょっと脱線】バージョンを指定してみよう% docker run ubuntu:17.04 cat /etc/lsb-releaseコンテナを実行してみよう (その2)【ちょっと脱線】バージョンを指定してみよう% docker run ubuntu:17.04 cat /etc/lsb-release…
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=17.04
DISTRIB_CODENAME=zesty
DISTRIB_DESCRIPTION="Ubuntu Zesty Zapus (develo

コンテナを実行してみよう (その2)サーバを起動してみる% docker run –d –p (好きな番号):80 nginx

コンテナを実行してみよう (その2)サーバを起動してみる% docker run –d –p (好きな番号):80 nginx

ddc41a326fc28951546e3959d7dd552e03be8e82e1a9

コンテナを実行してみよう (その2)サーバを起動してみる% docker run –d –p (好きな番号):80 nginx

バックグラウンド
実行を指定コンテナを実行してみよう (その2)サーバを起動してみる% docker run –d –p (好きな番号):80 nginx

バックグラウンド
実行を指定

TCPのポート番号を指定

コンテナを実行してみよう (その2)サーバを起動してみる
ホスト側の(好きな番号) 番ポートをコンテナの 80 番ポートに接続する% docker run –d –p (好きな番号):80 nginx

バックグラウンド
実行を指定

TCPのポート番号を指定

コンテナを実行してみよう (その2)サーバを起動してみる% docker run –d –p (好きな番号):80 nginx

19ecb956ab5d1e5362fe57701ec3a7667cdf1a9e9ba2

実行されたコンテナの ID

コンテナを実行してみよう (その2)サーバが起動しているか確認する% docker ps

コンテナを実行してみよう (その2)サーバが起動しているか確認する% docker ps
CONTAINER ID
19ecb956ab5d

IMAGE
nginx

COMMAND“nginx -g ‘daemon ...”

コンテナを実行してみよう (その2)サーバが起動しているか確認する% docker ps

コンテナを実行してみよう (その2)サーバが起動しているか確認する% docker ps

Docker コマンド

コンテナを実行してみよう (その2)サーバが起動しているか確認する
実行中のコンテナを列挙せよ!
% docker ps

Docker コマンド

コンテナを実行してみよう (その2)サーバが起動しているか確認する% docker ps

コンテナを実行してみよう (その2)サーバが起動しているか確認する% docker ps
CONTAINER ID
19ecb956ab5d

IMAGE
nginx

COMMAND“nginx -g ‘daemon ...”

コンテナを実行してみよう (その2)サーバを停止してみる% docker stop 19ecb

コンテナを実行してみよう (その2)サーバを停止してみる% docker stop 19ecb
19ecb

コンテナを実行してみよう (その2)サーバを停止してみる% docker stop 19ecb

コンテナを実行してみよう (その2)サーバを停止してみる
コンテナを停止せよ!
% docker stop 19ecb

Docker コマンド

コンテナを実行してみよう (その2)サーバを停止してみる% docker stop 19ecb

コンテナID
Docker コマンド

コンテナを実行してみよう (その2)サーバを停止してみる
このコンテナを停止せよ!
% docker stop 19ecb

コンテナID
Docker コマンド

コンテナを実行してみよう (その2)サーバを停止してみる
このコンテナを停止せよ!
% docker stop 19ecb

コンテナID
Docker コマンド※コンテナ ID は全部入力する必要はない

コンテナを実行してみよう (その2)サーバを停止してみる% docker stop 19ecb

コンテナを実行してみよう (その2)サーバを停止してみる% docker stop 19ecb
19ecb

コンテナを実行してみよう (その2)サーバが停止したか確認する% docker ps

コンテナを実行してみよう (その2)サーバが停止したか確認する% docker ps
CONTAINER ID

IMAGE

COMMAND

コンテナを実行してみよう (その2)停止したコンテナを確認する% docker ps -a

コンテナを実行してみよう (その2)停止したコンテナを確認する% docker ps -a
CONTAINER ID
19ecb956ab5d
a844e44f4790
533c0f506a00
6b73015537c0

IMAGE
nginx
ubuntu:17.04
centosubuntuCOMMAND"nginx -g 'daemo"cat /etc/lsb-re"cat /etc/redhat"cat /etc/lsb-re

コンテナを実行してみよう (その2)停止したコンテナを確認する% docker ps -a

コンテナを実行してみよう (その2)停止したコンテナを確認する% docker ps -a

停止しているものも含めて全てのコンテナを表示せよ!

コンテナを実行してみよう (その2)停止したコンテナを確認する% docker ps -a

コンテナを実行してみよう (その2)停止したコンテナを確認する% docker ps -a
CONTAINER ID
19ecb956ab5d
a844e44f4790
533c0f506a00
6b73015537c0

IMAGE
nginx
ubuntu:17.04
centosubuntuCOMMAND"nginx -g 'daemo"cat /etc/lsb-re"cat /etc/redhat"cat /etc/lsb-re

コンテナを実行してみよう (その2)不要なコンテナを削除しよう% docker rm 19ec a844 533c 6b73

コンテナを実行してみよう (その2)不要なコンテナを削除しよう% docker rm 19ec a844 533c 6b73
19ec
a844
533c
6b73

コンテナを実行してみよう (その2)不要なコンテナを削除しよう% docker rm 19ec a844 533c 6b73

コンテナを実行してみよう (その2)不要なコンテナを削除しよう% docker rm 19ec a844 533c 6b73

Docker コマンド

コンテナを実行してみよう (その2)不要なコンテナを削除しよう
コンテナを削除せよ!
% docker rm 19ec a844 533c 6b73

Docker コマンド

コンテナを実行してみよう (その2)不要なコンテナを削除しよう% docker rm 19ec a844 533c 6b73

削除するコンテナのID
Docker コマンド

コンテナを実行してみよう (その2)不要なコンテナを削除しよう
これらのコンテナを削除せよ!
% docker rm 19ec a844 533c 6b73

削除するコンテナのID
Docker コマンド

コンテナを実行してみよう (その2)不要なコンテナを削除しよう% docker rm 19ec a844 533c 6b73

コンテナを実行してみよう (その2)不要なコンテナを削除しよう% docker rm 19ec a844 533c 6b73
19ec
a844
533c
6b73

コンテナを実行してみよう (その2)コンテナを削除できたか確認する% docker ps -a

コンテナを実行してみよう (その2)コンテナを削除できたか確認する% docker ps -a
CONTAINER ID

IMAGE

COMMAND

コンテナ内でシェルを起動してみる% docker run –i –t ubuntu /bin/bash

コンテナ内でシェルを起動してみる% docker run –i –t ubuntu /bin/bash
root@d2db426e0aa9:/#

コンテナ内でシェルを起動してみる% docker run –i –t ubuntu /bin/bash

コンテナ内でシェルを起動してみる% docker run –i –t ubuntu /bin/bash

TTY を割り当てる
インタラクティブ:
標準入力を閉じないコンテナ内でシェルを起動してみる
シェルが入力を受付けられるようにする% docker run –i –t ubuntu /bin/bash

TTY を割り当てる
インタラクティブ:
標準入力を閉じないコンテナ内でシェルを起動してみる% docker run –i –t ubuntu /bin/bash

コンテナ内でシェルを起動してみる% docker run –i –t ubuntu /bin/bash
root@d2db426e0aa9:/#

コンテナ内でシェルを終了する% docker run –i –t ubuntu /bin/bash
root@d2db426e0aa9:/# exit

停止したコンテナを再起動する% docker restart d2db4

停止したコンテナを再起動する% docker restart d2db4
d2db4

停止したコンテナを再起動する% docker restart d2db4

停止したコンテナを再起動するコンテナを再起動せよ!
% docker restart d2db4

Docker コマンド

停止したコンテナを再起動する% docker restart d2db4コンテナID
Docker コマンド

停止したコンテナを再起動する
このコンテナを再起動せよ!
% docker restart d2db4コンテナID
Docker コマンド

停止したコンテナを再起動する% docker restart d2db4

停止したコンテナを再起動する% docker restart d2db4
d2db4

再起動したコンテナに接続する% docker attach d2db4

再起動したコンテナに接続する% docker attach d2db4
root@d2db426e0aa9:/#

再起動したコンテナに接続する% docker attach d2db4

再起動したコンテナに接続する% docker attach d2db4

Docker コマンド

再起動したコンテナに接続する
コンテナに
接続せよ!
% docker attach d2db4

Docker コマンド

再起動したコンテナに接続する% docker attach d2db4コンテナID
Docker コマンド

再起動したコンテナに接続する
このコンテナに接続せよ!
% docker attach d2db4コンテナID
Docker コマンド

再起動したコンテナに接続する% docker attach d2db4

再起動したコンテナに接続する% docker attach d2db4
root@d2db426e0aa9:/#実行中のコンテナ内でシェルを起動する% docker run –d –p (好きな番号):80 nginx

実行中のコンテナ内でシェルを起動する% docker run –d –p (好きな番号):80 nginx

30d198bf0ad3c03535f2d292153a9f7ae003b71ca0ec

実行中のコンテナ内でシェルを起動する% docker exec –i –t 30d19 /bin/bash

実行中のコンテナ内でシェルを起動する% docker exec –i –t 30d19 /bin/bash
root@30d198bf0ad3:/#

実行中のコンテナ内でシェルを起動する% docker exec –i –t 30d19 /bin/bash

実行中のコンテナ内でシェルを起動する% docker exec –i –t 30d19 /bin/bash

Docker コマンド

実行中のコンテナ内でシェルを起動する
コンテナ内でコマンドを実行せよ!
% docker exec –i –t 30d19 /bin/bash

Docker コマンド

実行中のコンテナ内でシェルを起動する% docker exec –i –t 30d19 /bin/bash

Docker コマンドコンテナ ID

実行中のコンテナ内でシェルを起動する
このコンテナ内でコマンドを実行せよ!
% docker exec –i –t 30d19 /bin/bash

Docker コマンドコンテナ ID

実行中のコンテナ内でシェルを起動する% docker exec –i –t 30d19 /bin/bash

Docker コマンドコンテナ ID

コマンド

実行中のコンテナ内でシェルを起動する
このコマンドを実行せよ!
% docker exec –i –t 30d19 /bin/bash

Docker コマンドコンテナ ID

コマンド

実行中のコンテナ内でシェルを起動する% docker exec –i –t 30d19 /bin/bash

実行中のコンテナ内でシェルを起動する% docker exec –i –t 30d19 /bin/bash
root@30d198bf0ad3:/#

コンテナからイメージを作成する% docker stop 30d19

コンテナからイメージを作成する% docker stop 30d19
30d19

コンテナからイメージを作成する% docker commit 30d19 (好きな名前)

コンテナからイメージを作成する% docker commit 30d19 (好きな名前)

sha256:96475fbbe6901fcf946502eebb317869d791a

コンテナからイメージを作成する% docker commit 30d19 (好きな名前)

コンテナからイメージを作成する% docker commit 30d19 (好きな名前)

Docker コマンド

コンテナからイメージを作成する
コンテナからイメージを作成せよ!
% docker commit 30d19 (好きな名前)

Docker コマンド

コンテナからイメージを作成する% docker commit 30d19 (好きな名前)

コンテナID
Docker コマンド

コンテナからイメージを作成する
このコンテナからイメージを作成せよ!
% docker commit 30d19 (好きな名前)

コンテナID
Docker コマンド

コンテナからイメージを作成する% docker commit 30d19 (好きな名前)

コンテナID
Docker コマンド

イメージ名

コンテナからイメージを作成する
このイメージ名でイメージを作成せよ!
% docker commit 30d19 (好きな名前)

コンテナID
Docker コマンド

イメージ名

コンテナからイメージを作成する% docker commit 30d19 (好きな名前)

コンテナからイメージを作成する% docker commit 30d19 (好きな名前)

sha256:96475fbbe6901fcf946502eebb317869d791a

作成したイメージを確認する% docker images

作成したイメージを確認する% docker images
REPOSITORY TAG(好きな名前) latest
centoslatestnginx
latestubuntulatestIMAGE ID
96475fbbe690
98d35105a391
6b914bbcb89e
0ef2e08ed3fa

CREATED
32 seconds
4 days ago
2 weeks ag
2 weeks ag

作成したイメージでコンテナを実行する% docker run -d -p (好きな番号):80 (好きな名前)作成したイメージでコンテナを実行する% docker run -d -p (好きな番号):80 (好きな名前)

172e159d9e814d15a7c579a06eabfc050106811b6bfcad1

ホストとコンテナでファイルを共有する% mkdir nginx-files% docker run -d -p (好きな番号):80 ∖–v $PWD/nginx-files:/usr/share/nginx/html ∖(好きな名前)

ホストとコンテナでファイルを共有する% mkdir nginx-files% docker run -d -p (好きな番号):80 ∖–v $PWD/nginx-files:/usr/share/nginx/html ∖(好きな名前)87ee8e79f2139f658cbdbdd77667b64b0b5d0dae2cff

ホストとコンテナでファイルを共有する% mkdir nginx-files% docker run -d -p (好きな番号):80 ∖–v $PWD/nginx-files:/usr/share/nginx/html ∖(好きな名前)

ホストとコンテナでファイルを共有する% mkdir nginx-files% docker run -d -p (好きな番号):80 ∖–v $PWD/nginx-files:/usr/share/nginx/html ∖(好きな名前)
ホスト上のディレクトリ

ホストとコンテナでファイルを共有する% mkdir nginx-files% docker run -d -p (好きな番号):80 ∖–v $PWD/nginx-files:/usr/share/nginx/html ∖(好きな名前)
ホスト上のディレクトリ

コンテナ内のディレクトリ

ホストとコンテナでファイルを共有する
ホストのこのディレクトリを…
% mkdir nginx-files% docker run -d -p (好きな番号):80 ∖–v $PWD/nginx-files:/usr/share/nginx/html ∖(好きな名前)
ホスト上のディレクトリ

コンテナ内のディレクトリ

ホストとコンテナでファイルを共有する
ホストのこのディレクトリを…

コンテナのこのディレクトリにマウントする% mkdir nginx-files% docker run -d -p (好きな番号):80 ∖–v $PWD/nginx-files:/usr/share/nginx/html ∖(好きな名前)
ホスト上のディレクトリ

コンテナ内のディレクトリ

ホストとコンテナでファイルを共有する% mkdir nginx-files% docker run -d -p (好きな番号):80 ∖–v $PWD/nginx-files:/usr/share/nginx/html ∖(好きな名前)このように共有されたディレクトリをボリュームと呼ぶ

ホストとコンテナでファイルを共有する% mkdir nginx-files% docker run -d -p (好きな番号):80 ∖–v $PWD/nginx-files:/usr/share/nginx/html ∖(好きな名前)

ホストとコンテナでファイルを共有する% mkdir nginx-files% docker run -d -p (好きな番号):80 ∖–v $PWD/nginx-files:/usr/share/nginx/html ∖(好きな名前)87ee8e79f2139f658cbdbdd77667b64b0b5d0dae2cff

ホストとコンテナでファイルを共有する:ホストからファイルを編集する% vi nginx-files/index.html

ホストとコンテナでファイルを共有する:コンテナからファイルを編集する% docker exec –i –t 87ee8 /bin/bash
root@87ee8e79f213:/# vim.tiny ∖/usr/share/nginx/html/index.html

ホストとコンテナでファイルを共有する:コンテナからファイルを編集する% docker exec –i –t 87ee8 /bin/bash
root@87ee8e79f213:/# vim.tiny ∖/usr/share/nginx/html/index.html

待った!

コンテナからボリューム上のファイルをさわるときは注意が必要
root@87ee8e79f213:/# cd /usr/share/nginx/html
root@87ee8e79f213:/# touch index2.html
root@87ee8e79f213:/# exit
% ls –l nginx-files

コンテナからボリューム上のファイルをさわるときは注意が必要
root@87ee8e79f213:/# cd /usr/share/nginx/html
root@87ee8e79f213:/# touch index2.html
root@87ee8e79f213:/# exit
% ls –l nginx-files

total 0-rw-r--r-- 1 ubuntu ubuntu 51 Mar 22 02:55 index.html-rw-rw-r-- 1 root
root
0 Mar 22 03:00 index2.html

コンテナからボリューム上のファイルをさわるときは注意が必要
root@87ee8e79f213:/# cd /usr/share/nginx/html
root@87ee8e79f213:/# touch index2.html
root@87ee8e79f213:/# exit
% ls –l nginx-files

total 0-rw-r--r-- 1 ubuntu ubuntu 51 Mar 22 02:55 index.html-rw-rw-r-- 1 root
root
0 Mar 22 03:00 index2.html

コンテナからボリューム上のファイルをさわるときは注意が必要
root 権限でファイルがroot@87ee8e79f213:/#
cd /usr/share/nginx/html
作れてしまった!
root@87ee8e79f213:/# touch index2.html
root@87ee8e79f213:/# exit
% ls –l nginx-files

total 0-rw-r--r-- 1 ubuntu ubuntu 51 Mar 22 02:55 index.html-rw-rw-r-- 1 root
root
0 Mar 22 03:00 index2.html

コンテナからボリューム上のファイルをさわるときは注意が必要
root@680e0e43f517:/# cd /usr/share/nginx/html
root@680e0e43f517:/# touch index2.html
root@680e0e43f517:/# exit
% ls –l nginx-files
total 8
-rw-r--r-- 1 tosh
-rw-rw-r-- 1 tosh

staff
staff

51
0

3 22 14:30 index.html
3 22 14:35 index2.html※ そうならない環境もあります (e.g., macOS)

イメージをファイルに保存する% docker save (好きな名前) > (好きなファイル名).tar

イメージをファイルに保存する% docker save (好きな名前) > (好きなファイル名).tar

Docker コマンド

イメージをファイルに保存するイメージを標準出力に書き出せ!
% docker save (好きな名前) > (好きなファイル名).tar

Docker コマンド

イメージをファイルに保存する% docker save (好きな名前) > (好きなファイル名).tar

Docker コマンド

イメージ名

イメージをファイルに保存する
このイメージを標準出力に書き出せ!
% docker save (好きな名前) > (好きなファイル名).tar

Docker コマンド

イメージ名

イメージをファイルに保存する% docker save (好きな名前) > (好きなファイル名).tar

Docker コマンド

イメージ名

※ docker save の出力は基本的に tar アーカイブ

イメージをファイルに保存する% docker save (好きな名前) > (好きなファイル名).tar

不要なイメージを削除する% docker rmi (好きな名前)

不要なイメージを削除する% docker rmi (好きな名前)

Deleted: sha256:96475fbbe6901fcf946502eebb31786
Deleted: sha256:be5c26bf4ce7314097263ed9f418939

不要なイメージを削除する% docker rmi (好きな名前)

不要なイメージを削除する% docker rmi (好きな名前)

Docker コマンド

不要なイメージを削除する
イメージを削除せよ!
% docker rmi (好きな名前)

Docker コマンド

不要なイメージを削除する% docker rmi (好きな名前)

Docker コマンド

イメージ名

不要なイメージを削除する
このイメージ名のイメージを削除せよ!
% docker rmi (好きな名前)

Docker コマンド

イメージ名

不要なイメージを削除する% docker rmi (好きな名前)

不要なイメージを削除する

エラーが出ますか?
% docker rmi (好きな名前)

不要なイメージを削除する

エラーが出ますか?
% docker rmi (好きな名前)

そのイメージを使ったコンテナが存在していないか
docker ps –a
で確認して、
docker stop からの docker rm
で削除してください不要なイメージを削除する% docker rmi (好きな名前)

Deleted: sha256:96475fbbe6901fcf946502eebb31786
Deleted: sha256:be5c26bf4ce7314097263ed9f418939

ファイルからイメージをロードする% docker load < (好きなファイル名).tar

ファイルからイメージをロードする% docker load < (好きなファイル名).tar

d17d48b2382a: Loading layer [===========>] 128.
cf0d2468e726: Loading layer [===========>] 60.
e3a86ffb1c45: Loading layer [===========>] 3.58…
Loaded image (好きな名前):latest

ファイルからイメージをロードする% docker load < (好きなファイル名).tar

ファイルからイメージをロードする% docker load < (好きなファイル名).tar

Docker コマンド

ファイルからイメージをロードする
標準入力からイメージを読込め!
% docker load < (好きなファイル名).tar

Docker コマンド

ファイルからイメージをロードする% docker load < (好きなファイル名).tar

ファイルからイメージをロードする% docker load < (好きなファイル名).tar

d17d48b2382a: Loading layer [===========>] 128.
cf0d2468e726: Loading layer [===========>] 60.
e3a86ffb1c45: Loading layer [===========>] 3.58…
Loaded image (好きな名前):latest

出てきたコマンドの一覧•

Docker run:

– Docker run -i -t– Docker run -d– Docker run -p– Docker run -v

•
•
•
•
•
•

シェルが標準入力を取れるように実行する
バックグラウンドで実行する
ポート番号をマップする
ボリュームをマウントする

Docker stop
Docker restartDocker searchDocker pull
Docker images
Docker ps

コンテナを停止する
コンテナを再起動するイメージを検索するイメージをダウンロードする
イメージの一覧を得る
実行中のコンテナの一覧を得る

Docker rm
Docker rmi
Docker attach
Docker exec
Docker commit
Docker saveDocker load

コンテナを削除する
イメージを削除する
実行中のコンテナに接続する
実行中のコンテナ内でコマンドを実行する
コンテナからイメージを作成する
イメージを標準出力へ書き出す
標準入力からイメージをロードする– Docker ps –a

•
•
•
•
•
•
•

コンテナを実行する(停止中のものも含め) 全てのコンテナの一覧を得る

Docker の特徴•とても簡単•とても軽いDocker の特徴•とても簡単•とても軽いDocker の性能は?
• Linux 版は何もしないで実行してもほとんどネイティブ実行と変わらないか、
少し悪いくらい– CPU: ほとんど変わらない– ファイル I/O: ほとんど変わらないか若干悪化– ネットワーク: 若干悪化
• デフォルトの設定だと NAT 処理がはさまるため(?)• macOS 版や Windows 版は xhyve や Hyper-V のオーバーヘッドのため(?)若干性能が落ちる– xhyve: macOS の仮想化ハイパーバイザ– Hyper-V: Windows の仮想化ハイパーバイザ

Docker の性能は?
• ちょっと工夫するとネイティブ実行と区別つかないくらいになる– ファイル I/O:
• ボリュームを使ってしまえばよい (i.e., -v オプションを使う)
à ネイティブとほぼ同性能が出る– ネットワーク I/O:
• ホスト側のネットワークをそのまま使ってしまえばよいà ネイティブとほぼ同性能がでる– コンテナ起動時に --net=host オプションを指定するとコンテナがホストのネットワークスタックを直接叩くようになるDocker の性能は?
• ちょっと特殊なデバイスも使える– デバイスファイルを --device オプションでコンテナ内にマウントできる– NVDIA:• https://github.com/NVIDIA/nvidia-docker– Infiniband:• /dev/infiniband 下のデバイスファイルを
コンテナ内にマウントすれば OK (らしい)Docker のセキュリティは?

Docker のセキュリティは?

😨

Docker のセキュリティは?
• 事実上、「docker コマンドを叩ける」== 「root 権限を持っている」• 率直に言えば、現時点では生の Docker を一般ユーザにそのまま使わせるのは管理者の視点からは危険すぎるDocker のセキュリティ、
ここがやばい (その1)• ボリューム機能がセキュリティについて何も考えてなさすぎ% docker run –v /:/foo –i –t ubuntu /bin/bash
root@9ab5647d7695:/# cat /foo/etc/shadow
root@9ab5647d7695:/# cp /bin/sh /foo/root@9ab5647d7695:/# chown root:root /foo/shroot@9ab5647d7695:/# chmod a+s /foo/sh• 真面目に解決するには
SELinux などの設定が必要

Docker のセキュリティ、
ここがやばい (その2)• ユーザ間の区別がないに等しい– 誰のイメージでもアクセス・実行・削除等が可能– 誰のコンテナでもアクセス・実行・削除等が可能

現在よく取られている現実的な解決策• Docker とは別にユーザ隔離できる仮想環境を
ユーザごとに用意してその中で Docker を使わせる– 例: Amazon ECS, Google Container Engine, …

Docker にはまだまだいろいろな機能・ツールがいっぱい• 今日の内容は基礎中の基礎だけDocker にはまだまだいろいろな機能・ツールがいっぱい• Dockerfile– Makefile の Docker 版と考えればよい• イメージをビルドする手順を指定する• docker-compose– 複数のコンテナを組み合わせた環境を構築・実行するのに便利• docker-machine– AWS や GCE や SoftLayer 等の上でコンテナを実行させるのに便利• docker swarm– Docker が動作する複数のホストをまとめて管理するのに便利• docker network– 仮想的なネットワークを構築する• 物理的に異なる複数ホスト間で仮想的なネットワークを構築することもできる• …