More Related Content Similar to ソフトウェア工学2023 06 コンテナ仮想化 Similar to ソフトウェア工学2023 06 コンテナ仮想化 (20) More from Toru Tamaki (20) ソフトウェア工学2023 06 コンテナ仮想化4. 仮想化
nホスト型仮想化
• ホストOS上のアプリ
• ゲストOSを動かす
• 遅い
nハイパーバイザー
• ホストのハードウェアを(ホス
トOSを飛ばして)直接利用する
• 高速
n参考
• 仮想化入門(ハイパーバイ
ザー) at Qiita
ハードウェア
ホストOS
仮想化ソフト
ゲスト
OS
アプリ
ゲスト
OS
アプリ
仮想化
ハードウェア
ハイパーバイザー
ゲスト
OS
アプリ
ゲスト
OS
アプリ
仮想化
10. 余談:デュアルブート
n1つのPCから複数のOSを起動
• HDDを2つのOSに分割
• PCの起動時に,どのOSを起動するか
選択
• そのOSに割り当てられたHDDで実行
• メリット
• 1台で複数OSを起動できる
• デメリット
• 同時に1つのOSしか実行できない
• macOSのブートキャンプ
• macとwindowsのデュアルブート
• 類似:UbuntuのLive DVD/USB
• DVD/USBからUbuntuをブート
HDD
Public Domain
CC0
起動画面
Linux or Windows ?
Grub 2.02 beta2-9 ubuntu1 menu DualBoot Ubuntu
and WindowsTiloWiki - Own work
CC BY-SA 4.0
15. Dockerの構成要素
Arquitetura
DockerDaniloBarros - Own work
CC BY-SA 4.0
nコンテナエンジン
• コンテナを実行するソフト
• docker
nイメージ
• 起動する実行環境のスナップショット
• つまりファイル一式が入っている
• 公式リポジトリ:Docker Hub
• 多数のイメージが利用できる
• 公式以外にもリポジトリはある(Microsoft,NVIDIA,Quary.ioなど)
nコンテナ
• イメージから起動された実行中の仮想プロセス
• 1つのイメージから複数のコンテナを起動することもできる
21. インストール手順
n 公式ドキュメント
• https://docs.docker.com/get-docker/
n macOS:11以上
• https://docs.docker.com/desktop/mac/install/
• Apple silicon(M1/M2チップ)ではRosetta 2が推奨
• ターミナルで「softwareupdate --install-rosetta」
n Windows10/11 Pro, Education, Enterprise
• WSL2 / Hyper-V backend
n Windows10/11 Home
• WSL2 backend
• https://docs.docker.com/desktop/windows/install/
• dockerインストールの前に,WSL2の設定が先に必要
• https://learn.microsoft.com/ja-jp/windows/wsl/install
• 管理者権限のPowerShellで「wsl --install」
• アップデートが必要なら「wsl --update」
2023年4月時点の情報
31. コマンドライン用のターミナル/シェル
nmacOSターミナル
• 標準のターミナル
• おすすめ.透明にできる
• iTerm2
• おすすめ.透明にできる
nmacOSシェル
• zsh:標準
nWindowsターミナル
• コマンドプロンプト
• 昔からある.使いにくい.コピ
ペもめんどくさい
• Windowsターミナル
• 使いやすい.おすすめ.コピペ
も楽.コマンドプロンプトも
PowerShellもWSL2も選べる
nWindowsシェル
• Windows PowerShell
• win 7用.古い.イマイチ.
• PowerShell
• 最近のwin用.おすすめ!
• storeからインストール
https://iterm2.com
この授業で使用
する環境変数も
使えないので,
使わないでくだ
さい
winでは「Windowsターミナ
ルでPowerShell」がおすすめ
36. $ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
gcc latest 6de5c9300469 4 days ago 1.37GB
python slim d74a102e9001 2 weeks ago 128MB
busybox latest 7cfbbec8963d 6 weeks ago 4.86MB
docker/volumes-backup-extension 1.1.2 70772ddde47c 3 months ago 118MB
felipecruz/alpine-tar-zstd latest 31988344315d 7 months ago 6.99MB
justincormack/nsenter1 latest c81481184b1b 5 years ago 101kB
イメージのダウンロード
イメージのリストを表示するコマンド
再度イメージのリストをみると
ダウンロードされていることがわかる
38. $ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$
コンテナの確認
コンテナのリストを表示するコマンド
docker container ls は
docker ps と同じ
40. $
$ uname -a
Darwin iMac-27inch-Tamaki-2019.tamaki.prv.nitech.ac.jp 22.4.0 ...
$ docker run -it --rm python:slim bash
root@c7cd76a83c3e:/#
root@c7cd76a83c3e:/# uname -a
Linux c7cd76a83c3e 5.15.49-linuxkit #1 SMP Tue Sep 13 07:51:46 ...
root@c7cd76a83c3e:/#
root@c7cd76a83c3e:/# exit
exit
$
$ uname -a
Darwin iMac-27inch-Tamaki-2019.tamaki.prv.nitech.ac.jp 22.4.0 ...
$
コンテナの起動(mac)
ホスト
masOS
コンテナ
Linux
(debian)
コンテナを抜けるには
Ctl+Dかexitでbashを終了する
ホスト
masOS
41. PS C:¥Users¥yourname> systeminfo
…
OS 名: Microsoft Windows 11 Education
…
PS C:¥Users¥yourname> docker run -it --rm python:slim bash
root@c7cd76a83c3e:/#
root@c7cd76a83c3e:/# uname -a
Linux c7cd76a83c3e 5.15.49-linuxkit #1 SMP Tue Sep 13 07:51:46 ...
root@c7cd76a83c3e:/#
root@c7cd76a83c3e:/# exit
exit
PS C:¥Users¥yourname> systeminfo
…
OS 名: Microsoft Windows 11 Education
…
コンテナの起動(win)
ホスト
win
コンテナ
Linux
(debian)
コンテナを抜けるには
Ctl+Dかexitでbashを終了する
ホスト
Wj
44. $ pwd
/Users/tamaki/Downloads/06_00_python-main
$ ls
README.md dockerfile hello.py
$
$ docker run -it --rm -v ${PWD}:/mnt python:slim bash
root@527f7d2b2c23:/# pwd
/
root@527f7d2b2c23:/# cd /mnt
root@527f7d2b2c23:/mnt# ls
README.md dockerfile hello.py
root@527f7d2b2c23:/mnt#
ホストをマウントする
ホスト
コンテナ
ホストのディレクトリをコンテナ
にマウントするコマンド
ホストの現在の
作業ディレクトリ
コンテナでのマウント先
ホストにある
ファイル
マウント先
へ移動すると
ホストのファイ
ルが見えている
この環境変数${PWD}はmacでは使える.
winでもPowerShellなら使える(コマンド
プロンプトでは使えない)
48. $ docker build -t mypython:0.1 .
[+] Building 4.8s (7/7) FINISHED
=> [internal] load build definition from Dockerfile
...
=> naming to docker.io/library/mypython:0.1
$
独自イメージのビルド
ndockerfile
• build用の設定ファイル
ndocker build
• 既存イメージを元に新たなイメージをビルド
イメージをビル
ドするコマンド
-tでイメージ名を設定 • イメージ名
• ここでは”mypython”にした
• コロン以降にタグを指定できる
• ここでは”0.1”にした
最後にdockerfileがある
ディレクトリを指定
詳細はdockerfileリファレンスを参照
49. 独自イメージのビルド
ndockerfile
• build用の設定ファイル
ndocker build
• 既存イメージを元に新たなイメージをビルド
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
mypython 0.1 b3cb3138b8b3 2 minutes ago 230MB
gcc latest 6de5c9300469 4 days ago 1.37GB
python slim d74a102e9001 2 weeks ago 128MB
busybox latest 7cfbbec8963d 6 weeks ago 4.86MB
docker/volumes-backup-extension 1.1.2 70772ddde47c 3 months ago 118MB
felipecruz/alpine-tar-zstd latest 31988344315d 7 months ago 6.99MB
justincormack/nsenter1 latest c81481184b1b 5 years ago 101kB
$
51. $ ls
README.md dockerfile hello.py
$ docker run -it --rm -v ${PWD}:/mnt mypython:0.1 bash
root@75075e476999:/mnt# ls
README.md dockerfile hello.py
root@75075e476999:/mnt# exit
exit
$ docker run -it --rm -v ${PWD}:/mnt mypython:0.1 python hello.py
hello world!
sin(x)= 0.8414709848078965
$
独自イメージで実行
ホスト
コンテナ
確認のため
bashを実行
ホスト
コンテナのCWDは/mntになっている
(DockerfileのWORKDIRで指定したから)
コンテナ内のpythonを
ホストから指定
コンテナ内で
実行されるコマンド
(引数まで含めて)
コンテナ内の実行結果は
ホストに表示される
イメージ名:タグ
52. $ ls
README.md dockerfile hello.py
$ docker run -it --rm -v ${PWD}:/mnt mypython:0.1 bash
root@d4932f38b63e:/mnt# ls
README.md dockerfile hello.py
root@d4932f38b63e:/mnt# python hello.py
hello world!
sin(x)= 0.8414709848078965
root@d4932f38b63e:/mnt# exit
exit
$ docker run -it --rm -v ${PWD}:/mnt mypython:0.1 python hello.py
hello world!
sin(x)= 0.8414709848078965
$
独自イメージで実行
ホスト
コンテナ
bashを実行
ホスト
コンテナのCWDは/mntになっている
(DockerfileのWORKDIRで指定したから)
コンテナ内のpythonを
ホストから実行
コンテナ内で
実行されるコマンド
(引数まで含めて)
コンテナ内の実行結果は
ターミナルに表示される
イメージ名:タグ
コンテナ内で実行
コンテナ内で実行して結果をターミナ
ルに表示したらコンテナは終了
57. $ docker pull gcc
Using default tag: latest
latest: Pulling from library/gcc
cc556c281183: Pull complete
8022b43d7c31: Pull complete
db75f726ec67: Pull complete
fd8a9e299258: Pull complete
b5269c0251f8: Pull complete
8fcb2d286e1d: Pull complete
16bf19d413c9: Pull complete
8ddabddca4cb: Pull complete
5fdb6969a605: Pull complete
Digest: sha256:6b98ed6d8437c714aada805655808e8dc3452...
Status: Downloaded newer image for gcc:latest
docker.io/library/gcc:latest
$
59. $ docker build -t mygcc .
[+] Building 0.8s (6/6) FINISHED
=> [internal] load build definition from Dockerfile 0.7s
=> => transferring dockerfile: 91B 0.0s
=> [internal] load .dockerignore 0.7s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/gcc:latest 0.0s
=> [1/2] FROM docker.io/library/gcc 0.0s
=> CACHED [2/2] WORKDIR /mnt 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:090ff7cdca8b07da2b8d750c7dd5524a40388b1daf51d5c935a7 0.0s
=> => naming to docker.io/library/mygcc 0.0s
$
65. $ docker build -t myjava:openjdk .
[+] Building 10.0s (7/7) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 152B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/openjdk:latest 2.8s
=> [auth] library/openjdk:pull token for registry-1.docker.io 0.0s
=> [1/2] FROM docker.io/library/openjdk@sha256:9b448de897d211c9e0ec635a485650ae 6.4s
=> => resolve docker.io/library/openjdk@sha256:9b448de897d211c9e0ec635a485650ae 0.0s
=> => sha256:71260f256d19f4ae5c762601e5301418d2516ca591103b1376 4.46kB / 4.46kB 0.0s
...
=> => extracting sha256:95a27dbe0150755fca4304b4afd0d7d6dd6a40ede6fdb30da8568e9 1.9s
=> [2/2] WORKDIR /mnt 0.7s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:37012131e118db3b80400544f296ab02d2106700506c89cfd824 0.0s
=> => naming to docker.io/library/myjava:openjdk 0.0s
$
66. $ docker run -it --rm -v ${PWD}:/mnt myjava:openjdk javac Main.java
$ ls
Main.class Main.java README.md dockerfile
$ docker run -it --rm -v ${PWD}:/mnt myjava:openjdk java Main
Hello World!
$
68. 不要なイメージの削除
nイメージのファイルサイズはかなり大きい
n不要なものは削除
gccは1G
以上!
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
myjava openjdk 37012131e118 3 minutes ago 470MB
mygcc latest 090ff7cdca8b 8 minutes ago 1.37GB
mypython 0.1 b3cb3138b8b3 21 minutes ago 230MB
gcc latest 6de5c9300469 4 days ago 1.37GB
python slim d74a102e9001 2 weeks ago 128MB
busybox latest 7cfbbec8963d 6 weeks ago 4.86MB
docker/volumes-backup-extension 1.1.2 70772ddde47c 3 months ago 118MB
felipecruz/alpine-tar-zstd latest 31988344315d 7 months ago 6.99MB
justincormack/nsenter1 latest c81481184b1b 5 years ago 101kB
$
69. $ docker image rm gcc
Untagged: gcc:latest
Untagged: gcc@sha256:6b98ed6d8437c714aada805655808e8dc3452c5bd3688ba83bc...
Deleted: sha256:6de5c9300469f4d45a0dd9852ca45a8a19efba8a29b606ca7f65aa51...
$ docker image rm mypython:0.1
Untagged: mypython:0.1
Deleted: sha256:b3cb3138b8b3783a923c46de1f8ecb90be76f958df781dd621160f67...
$ docker image rm 090ff7cdca8b
Untagged: mygcc:latest
Deleted: sha256:090ff7cdca8b07da2b8d750c7dd5524a40388b1daf51d5c935a78d2d...
$ docker image ls
不要なイメージの削除
イメージを削除
するコマンド
削除するイメージ名もしくはimage ID
(必要ならタグも指定)
73. Docker: IaC
nIaC
• Infrastructure as Code
• 環境構築(インフラ設定)をコードで行う
ndockerfile
• 環境構築のための設定ファイル
n環境
• 開発環境,実行環境,etc
• gccとJavaの場合
• gccやJavaのコンパイラのインストールや実行環境の整備は手間
• dockerなら「コンパイラのインストール」という環境構築は不要
• dockerさえ動けばどこでもOK
• “Build and Ship any Application Anywhere”, https://hub.docker.com
• PaaS上で動かせるので,開発環境=デプロイ環境になる
75. docker composeとyamlファイル
ndockerコンテナ管理
ツール
• dockerを起動するオプ
ションが面倒くさい
• yamlファイルに書く!
• docker-compose.yml
nコンセプト
• コンテナをバックグラウ
ンド起動(デーモン用)
• そのコンテナを使う(実
行する)にはアタッチし
てデタッチ
$ pwd
/Users/tamaki/Downloads/se-all/06_00_python
$ ls
README.md docker-compose.yml dockerfile hello.py
$ cat dockerfile
FROM python:slim
RUN pip install numpy
WORKDIR /mnt
$ cat docker-compose.yml
version: "3"
services:
mypython:
build: ./
volumes:
- ./:/mnt
tty: true
$
dockerfileの
あるディレクトリ
docker runの-vオ
プションと同じ
docker runの-itオ
プションと同じ
composeではサー
ビス名を使う
76. docker compose buildでイメージをビルド
$ docker compose build
[+] Building 0.1s (7/7) FINISHED
=> [internal] load build definition from dockerfile
=> => transferring dockerfile: 91B
=> [internal] load .dockerignore
=> => transferring context: 2B
=> [internal] load metadata for docker.io/library/python:slim
=> [1/3] FROM docker.io/library/python:slim
=> CACHED [2/3] RUN pip install numpy
=> CACHED [3/3] WORKDIR /mnt
=> exporting to image
=> => exporting layers
=> => writing image sha256:88563bbe26cbbc960a3582269aa56213a9
=> => naming to docker.io/library/06_00_python-mypython
$
docker composeの呼び出し docker-compose.ymlを元に
docker compose用のイメージを作成
作成されたイメージ
77. $ pwd
/Users/tamaki/Downloads/se-all/06_00_python
$
docker compose buildでイメージをビルド
イメージ名=
フォルダ名_サービス名
docker-compose.yml
で指定したサービス名
注意:
• docker composeは実行するディレク
トリの名前に依存する
• ただし-pオプションで毎回プロ
ジェクト名を指定できる
• デフォルトでは「ディレクトリ名
がプロジェクト名」になっている
• このスライドのコードは同じディレク
トリで実行してください
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
06_00_python-mypython latest 88563bbe26cb 4 hours ago 230MB
python slim d74a102e9001 2 weeks ago 128MB
$
78. $ docker compose up -d
[+] Running 2/2
✔ Network 06_00_python_default Created
✔ Container 06_00_python-mypython-1 Started
$
$ docker compose ps
NAME IMAGE COMMAND ...
06_00_python-mypython-1 06_00_python-mypython "python3" ...
$
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED ...
edf09e0d6481 06_00_python-mypython "python3" 11 seconds ...
$
docker compose upでコンテナを起動
注意:
docker composeは
実行するディレクトリに依存する
up: コンテナの起動
-d: バックグラウンドで起動(デーモン)
バックグラウ
ンドで実行中
起動中の
コンテナを
表示
buildせずに
直接upしてもOK
(buildが走る)
docker psで
見ても良い
79. docker compose psとディレクトリ
n注意:docker composeは実行するディレクトリに依存する
$ pwd
/Users/tamaki/Downloads/se-all/06_00_python
$ docker compose ps
NAME IMAGE COMMAND
06_00_python-mypython-1 06_00_python-mypython "python3"
$ cd ..
$ docker compose ps
no configuration file provided: not found
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED
5dec416b19d2 06_00_python-mypython "python3" 14 minut
$ cd 06_00_python
$ docker compose ps
NAME IMAGE COMMAND
06_00_python-mypython-1 06_00_python-mypython "python3"
同じディレクトリ
なら見える
違うディレクトリ
なら見えない
コンテナ自体は
起動したまま
同じディレクトリ
に戻ると見える
80. docker compose execでコンテナにアタッチ
n「up -d」ではバックグラウンドでコンテナが起動している
nこのコンテナでコマンドを実行するには
• yamlファイル中のサービス名を指定してexec
• コンテナにアタッチして実行してすぐデタッチ
• デタッチしてもコンテナは起動したまま
$ docker compose ps
NAME IMAGE COMMAND SERVICE ...
06_00_python-mypython-1 06_00_python-mypython "python3" mypython ...
$
$ docker compose exec mypython python hello.py
hello world!
sin(x)= 0.8414709848078965
$
services:
mypython:
build: ./
volumes:
- ./:/mnt
tty: true
docker-compose.yml
コンテナで実行するコマンド
ホスト
コンテナ
ホスト
81. $ docker compose ps
NAME IMAGE COMMAND SERVICE ...
06_00_python-mypython-1 06_00_python-mypython "python3" mypython ...
$
$ docker compose exec mypython bash
root@5dec416b19d2:/mnt# python hello.py
hello world!
sin(x)= 0.8414709848078965
root@5dec416b19d2:/mnt#
docker compose execでコンテナにアタッチ
n「up -d」ではバックグラウンドでコンテナが起動している
nこのコンテナでコマンドを実行するには
• yamlファイル中のサービス名を指定してexec
• コンテナにbashでアタッチ
• bashで実行
• その後exitする(デタッチ.コンテナは起動したまま)
services:
mypython:
build: ./
volumes:
- ./:/mnt
tty: true
docker-compose.yml
コンテナで実行するコマンド
コンテナ内で実行
ホスト
コンテナ
82. $ docker compose ps
NAME IMAGE COMMAND SERVICE
06_00_python-mypython-1 06_00_python-mypython "python3" mypython
$
$ docker compose stop
[+] Running 1/1
✔ Container 06_00_python-mypython-1 Stopped
$
$ docker compose ps -a
NAME IMAGE COMMAND SERVICE
06_00_python-mypython-1 06_00_python-mypython "python3" mypython
$
$ docker compose down
[+] Running 2/0
✔ Container 06_00_python-mypython-1 Removed
✔ Network 06_00_python_default Removed
$
$ docker compose ps -a
NAME IMAGE COMMAND SERVICE
$
docker compose downでコンテナを停止
stopでは停止するだけ
コンテナは残っている
stopの代わりにdownとすると,停止&削除
コンテナは消えた
83. cd /Users/tamaki/Downloads/06_01_C-main
docker compose up -d
docker compose exec mygcc gcc main.c
docker compose exec mygcc ./a.out
docker compose down
cd /Users/tamaki/Downloads/06_02_Java-main
docker compose up -d
docker compose exec myjava javac Main.java
docker compose exec myjava java Main
docker compose down
docker composeの利用例