ソフトウェア工学
nコンテナ仮想化
• 仮想マシン,Docker,イメージの取得とビルド,コンテナ
の起動,コンテナ内での開発
玉木徹(名工大)
仮想化
仮想化とは
n計算機環境を抽象化すること
• 仮想的なハードウェアをソフトウェアとして用意する
• CPU,メモリ,グラフィックス,ネットワーク,HDD
• その仮想ハードウェア上に仮想OSが動く
• グラフィクスも仮想化されるとGUIが動作
n仮想化されたマシン
• 仮想マシン(VM,Virtual Machine)
• IaaSで利用
n用語
• ホストOS:VMを動作させるOS
• ゲストOS:VM中のOS
ハードウェア
OS
アプリ
ハードウェア
ホストOS
仮想化ソフト
ゲスト
OS
アプリ
ゲスト
OS
アプリ
通常 仮想化
仮想化
nホスト型仮想化
• ホストOS上のアプリ
• ゲストOSを動かす
• 遅い
nハイパーバイザー
• ホストのハードウェアを(ホス
トOSを飛ばして)直接利用する
• 高速
n参考
• 仮想化入門(ハイパーバイ
ザー) at Qiita
ハードウェア
ホストOS
仮想化ソフト
ゲスト
OS
アプリ
ゲスト
OS
アプリ
仮想化
ハードウェア
ハイパーバイザー
ゲスト
OS
アプリ
ゲスト
OS
アプリ
仮想化
オンプレミス,サーバ仮想化,コンテナ
DX白書2021, IPA, 2021
https://www.ipa.go.jp/ikc/publi
sh/dx_hakusho.html
仮想化
n類似技術
• CPUエミュレータ
• 異なるCPU用のバイナリが実行できる
• Intel (x86, x86-64/x64), AMD (AMD64), ARM
• ハードウェアは仮想化していない
• Java VM
• Javaコードを実行できる
• ハードウェアは仮想化していない
仮想化の例
ホストOS
(macOS)
ゲストOS
(Ubuntu)
ゲストアプリ
仮想化ソフト
(VituralBox)
ホスト・ゲスト間の共有
ホストアプリ
• 共有フォルダ
• マウス・キーボード
• USBデバイス
• クリップボード
仮想化されたハードウェア
仮想ハードウェア
仮想化の利点
n学生
• 自分のwindows PC上でLinuxを動かして課題を実行できる
• OSのインストールと管理を経験できる
n開発者
• 運用環境での動作をVMで確認できる
• ゲスト環境を隔離してテストできる
nSE
• 計算機資源を有効活用できる
• 1台の物理サーバで複数のVMを起動できる
• サーバのリプレースが容易
• VMの構築と破棄が手軽に行える
余談:デュアルブート
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
デスクトップ用仮想化ソフトウェア
https://www.virtualbox.org https://www.vmware.com https://www.parallels.com/jp/
https://www.qemu.org
ブラウザ型:v86
https://copy.sh/v86/
https://github.com/copy/v86
JavaScriptなのでブラウザ上で
Windows95やWindows3.1が動く!
クラウドサービスの仮想マシン
https://aws.amazon.com/jp/getting-started/launch-a-virtual-machine-B-0/ https://aws.amazon.com/jp/getting-started/hands-on/launch-windows-vm/
コンテナ仮想化
n 仮想化のデメリット
• ハードウェアも含めて仮想化するため動作が重い
n 理想
• アプリが動作する最低限の仮想化だけでよい
• GUIも不要
• OSレベルの仮想化でよい
• プロセスをデプロイしたい
n コンテナ仮想化
• 本番環境にデプロイするだけの最小限の設定(=コンテナ)だけでよい
• ウィンドウマネージャ(GUI)は不要
• PaaSで利用
n Docker
• コンテナエンジンのデファクト・スタンダード
VMとコンテナ仮想化の違い
ハードウェア
インフラストラクチャ
ホストOS
仮想化ソフト
ゲスト
OS
アプリ
ゲスト
OS
アプリ
VM
ハードウェア
インフラストラクチャ
ホストOS
コンテナエンジン
コンテ
ナ
アプリ
コンテ
ナ
アプリ
コンテナ仮想化
任意のOSの
フルセット
仮想ハード
ウェアを持つ
Linuxのみ
必要なバイナリのみ
ハードウェアは
ホストを利用
Dockerの構成要素
Arquitetura
DockerDaniloBarros - Own work
CC BY-SA 4.0
nコンテナエンジン
• コンテナを実行するソフト
• docker
nイメージ
• 起動する実行環境のスナップショット
• つまりファイル一式が入っている
• 公式リポジトリ:Docker Hub
• 多数のイメージが利用できる
• 公式以外にもリポジトリはある(Microsoft,NVIDIA,Quary.ioなど)
nコンテナ
• イメージから起動された実行中の仮想プロセス
• 1つのイメージから複数のコンテナを起動することもできる
コンテナのメリット
nメリット
• 資源が効率的に利用できる
• 環境構築が容易(インフラ構築の自動化)
• デプロイが容易(コンテナだけあればよい)
nVMと比較したメリット
• 複数のVM:複数のハードウェアを仮想化
• 複数のコンテナ:ハードウェア仮想化は不要
• コンテナだけデプロイすればよい
コンテナ運用ツールの変遷
nコンテナオーケストレーション
• 複数のコンテナによるクラスタの統合管理ツール
• Kubernetes (K8s) がデファクト,ちょっと敷居が高い
• docker composeが簡単:dockerに付属
nDockerのデメリット
• root権限が必要
• K8sがdocker非対応に
• RHELもdocker非サポートに
nDocker以外
• Singularity
• Podman
• LXC/LXD
• その他多数
Docker一強の終焉にあたり、押さえるべきContainer事情, 2023/04/03
Dockerの設定
注意:
Dockerの開発は速いので,これ以降の説明が古くなっている場合もありま
す.その場合には各自で最新の情報に読み替えてください.
ダウンロード
https://www.docker.com
公式サイトの
Get startedに行く
ダウンロード
Docker Desktopをダウンロードする
(教育・個人利用は無料)
インストール手順
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月時点の情報
インストール手順
n個人使用のためにAcceptすること
FAQ
nQ:Docker for Windowsでエラーが出て実行できません
nA:PCの再起動や,dockerのrestart,dockerの再インストールなどを
試してみてください.また最新のOSに更新も試してみてください.
FAQ
nQ:dockerのメモリ使用量が多
いので少なくしたい
nA:macos
• Docker DesktopのDashboardから,
• Preference -> Resources ->
Advancedに行って,
• CPU・使用メモリ・Swapなどを
設定,
• Apply & Restartを押して設定完了
FAQ
nQ:dockerのメモリ使用量が多いので少なくしたい
nA:Windows
• WSL2の設定を変更する:https://docs.microsoft.com/en-us/windows/wsl/wsl-config#configure-global-options-with-wslconfig
• 以下の内容のファイル「C:¥Users¥<UserName>¥.wslconfig」を作成
# Settings apply across all Linux distros running on WSL 2
[wsl2]
# Limits VM memory to use no more than 4 GB, this can be set as whole numbers using GB or MB
memory=1GB
# Sets the VM to use two virtual processors
processors=1
# Sets amount of swap storage space to 8GB, default is 25% of available RAM
swap=1GB
• 使わないときはDockerを停止&「wsl --shutdown」でWSL2も停止する
• Dockerを停止しても,WSL2はメモリを確保したままバックグラウンドで
稼働している!
これは自分のPCのユーザー名です
注意:必ずOSを最新にしておくこと
n最新OSを仮定していることが多い
• アップデートしていないと
• インストールできない
• 動作しない
• 動作が不安定
• かもしれないので注意!
macOSの場合 Windowsの場合
インストール&実行
Windows macOS
n起動しているのを確認すること
• “running”と表示されるべき
• Win:タスクトレイ
• Mac:メニューバー
ダッシュボード
ダウンロードしてあるイメージ
(この画面ではイメージはない)
ダッシュボード
実行中のコンテナ
(この画面では実行中のコンテナはない)
ダッシュボード
更新があったら
アップデートを
すること!
コマンドライン用のターミナル/シェル
nmacOSターミナル
• 標準のターミナル
• おすすめ.透明にできる
• iTerm2
• おすすめ.透明にできる
nmacOSシェル
• zsh:標準
nWindowsターミナル
• コマンドプロンプト
• 昔からある.使いにくい.コピ
ペもめんどくさい
• Windowsターミナル
• 使いやすい.おすすめ.コピペ
も楽.コマンドプロンプトも
PowerShellもWSL2も選べる
nWindowsシェル
• Windows PowerShell
• win 7用.古い.イマイチ.
• PowerShell
• 最近のwin用.おすすめ!
• storeからインストール
https://iterm2.com
この授業で使用
する環境変数も
使えないので,
使わないでくだ
さい
winでは「Windowsターミナ
ルでPowerShell」がおすすめ
WindowsターミナルでPowerShell
開くシェルを選べる
のでPowerShellを選
択(設定でデフォル
トも選べる)
注意!PowerShellと
Windows Power Shellは
別物!
(さらにISEも別物)
Dockerコマンド
ndockerはコマンドラインで実行する
• ダッシュボードならGUIで簡単な操作なら可能
n基本コマンド
• docker pull
• Docker Hubからイメージをダウンロード
• docker run
• イメージからコンテナを起動
n基本用語
• dockerイメージ
• 環境のテンプレート
• dockerコンテナ
• イメージから作成された実際の環境
Arquitetura
DockerDaniloBarros - Own work
CC BY-SA 4.0
$ docker -v
Docker version 20.10.24, build 297e128
Dockerコマンド
https://www.flickr.com/photos/appleboy/25622175940
Bo-Yi Wu, Docker-cheat-sheet-by-RebelLabs, CC BY 2.0
イメージのダウンロード
イメージをDocker
Hubからダウンロー
ドするコマンド
ダウンロードするイメージを
「イメージ名:タグ」で指定
https://hub.docker.com/_/python?tab=tags
ここでダウンロードしているイメージのURL
Arquitetura
DockerDaniloBarros - Own work
CC BY-SA 4.0
$ docker pull python:slim
slim: Pulling from library/python
26c5c85e47da: Pull complete
9e79879be9c7: Pull complete
5dd57ff8d411: Pull complete
50349b1ecdeb: Pull complete
431f8d1d6c10: Pull complete
Digest: sha256:286f2f1d6f2f730a44108656afb04b131504b610a6cb2f3413918e98
Status: Downloaded newer image for python:slim
docker.io/library/python:slim
$
$ 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
イメージのダウンロード
イメージのリストを表示するコマンド
再度イメージのリストをみると
ダウンロードされていることがわかる
イメージのダウンロード
イメージのリストを表示するコマンド
イメージ名
タグ
• バージョンなど
• latestなら最新バージョン
イメージの
ハッシュ値
イメージの容量
いつイメージが作成されたのか
$ 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
$ 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 と同じ
コンテナの起動
コンテナを起動
するコマンド
ホストの
コマンドライン
コンテナで
実行中のbash
コンテナとして起動
するイメージ名
コンテナ内で実行
するコマンド名
オプション:コ
ンテナ終了時に
コンテナを削除
オプション:
標準入力を接続
$ docker run -it --rm python:slim bash
root@ab775da97d80:/#
$
$ 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
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
コンテナは揮発性
n揮発性
• コンテナ内の作業はコンテナ終了
とともに消える
n開発時の注意
• コンテナ内でコーディング,修正,
実行をしても,結果は残らない
n解決策
• コンテナからホストをマウントす
る
• マウント
• 他のデバイスのファイルシステ
ムを自分のファイルシステムと
同様に利用できるようにするこ
と
nコーディングはコンテナ外で
• ホスト側でコーディング,修正
• 実行はコンテナで行う
コンテナから
ホストを
マウント
以下からzipをダウンロードして展開してください
https://github.com/se-nitech/06_00_python/archive/refs/heads/main.zip
次ページでの展開したディレクトリの例は
/Users/tamaki/Downloads/06_00_python-main
(各自の環境で読み替えてください)
$ 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なら使える(コマンド
プロンプトでは使えない)
コンテナ内でインタラクティブに実行
実行したい
ホスト上の
Pythonスクリプト コンテナ内のPythonで実行
numpyモジュールが
ないのでエラー
このやり方の問題点
• インタラクティブにしか実行できていない
• 必要なモジュールを手作業でインストールしなければならない
root@527f7d2b2c23:/mnt# cat hello.py
import numpy as np
print('hello world!¥n')
print('sin(x)=', np.sin(1.0))
root@527f7d2b2c23:/mnt#
root@527f7d2b2c23:/mnt#
root@527f7d2b2c23:/mnt# python hello.py
Traceback (most recent call last):
File "/mnt/hello.py", line 1, in <module>
import numpy as np
ModuleNotFoundError: No module named 'numpy'
root@527f7d2b2c23:/mnt#
イメージのビルド
独自イメージのビルド
ndockerfile
• build用の設定ファイル
ndocker build
• 既存イメージを元に新たなイメージをビルド
FROM:元にするイメージ名
RUN:イメージ作成時に実行するコマンド
WORKDIR:コンテナ内の作業ディレクトリの指定
詳細はdockerfileリファレンスを参照
$ ls
README.md dockerfile hello
$ cat dockerfile
FROM python:slim
RUN pip install numpy
WORKDIR /mnt
$
$ 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リファレンスを参照
独自イメージのビルド
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
$
補足:イメージのbuildで失敗する場合
ndocker buildやdocker compose buildで失敗する場合には,以下を試し
てください
• dockerを再起動する
• ローカルPCを再起動する
• dockerを再インストールする
$ 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を
ホストから指定
コンテナ内で
実行されるコマンド
(引数まで含めて)
コンテナ内の実行結果は
ホストに表示される
イメージ名:タグ
$ 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を
ホストから実行
コンテナ内で
実行されるコマンド
(引数まで含めて)
コンテナ内の実行結果は
ターミナルに表示される
イメージ名:タグ
コンテナ内で実行
コンテナ内で実行して結果をターミナ
ルに表示したらコンテナは終了
実際にやってみる
以下からzipをダウンロードして展開してください
https://github.com/se-nitech/06_01_C/archive/refs/heads/main.zip
https://github.com/se-nitech/06_02_Java/archive/refs/heads/main.zip
演習1:gcc
nコードのダウンロード
• https://github.com/se-nitech/06_01_C/archive/refs/heads/main.zip
nC言語のサンプルプログラムmain.cを用意する
nCコンパイラgccのイメージをpull
ndockerfileを作成
nコンテナ内のgccで,ホストのファイルmain.cをコンパイル
• 生成される実行バイナリa.outはホスト側に保存
nコンテナ内で,ホストのファイルa.outを実行
https://hub.docker.com
でイメージを検索
注意:1.5GBぐらいあります
officialかどうか確認(野良イメージを避けるため)
$ 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
$
適当なサンプルプログラム gccイメージをもとに新しいイメージをビルド
$ cat main.c
#include <stdio.h>
int main(void){
printf("hello world¥n");
return 0;
}
$ cat dockerfile
FROM gcc
WORKDIR /mnt
$
$ 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
$
コンテナ内で
実行されるコマンド
(引数まで含めて)
$ ls
README.md dockerfile main.c
$ docker run -it --rm -v ${PWD}:/mnt mygcc gcc main.c
$ docker run -it --rm -v ${PWD}:/mnt mygcc ./a.out
hello world
$ ls
README.md a.out dockerfile main.c
$
演習2:Java
nコードのダウンロード
• https://github.com/se-nitech/06_02_Java/archive/refs/heads/main.zip
nJavaのサンプルプログラムMain.javaを用意する
nJavaコンパイラのイメージをpull
ndockerfileを作成
nコンテナ内のJavaで,ホストのファイルMain.javaをコンパイル
• 生成されるJavaバイナリはホスト側に保存
nコンテナ内のJava VMで,ホストのJavaバイナリを実行
https://hub.docker.com
でイメージを検索
$ pwd
/Users/tamaki/Downloads/06_02_Java-main
$ ls
Main.java README.md dockerfile
$ cat Main.java
public class Main {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
$ cat dockerfile
FROM openjdk
WORKDIR /mnt
$
$ 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
$
$ 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!
$
イメージとコンテナの削除
不要なイメージの削除
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
$
$ 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
(必要ならタグも指定)
不要なコンテナの削除
n実行後もコンテナは停止したまま残っている
• --rmオプションをつければ停止時に消える
• --rmオプションがなければ残っている
実行中のコンテナを表示するコマンド
停止中のコンテナも表示するコマンド(all)
$ docker run -it --rm -v ${PWD}:/mnt myjava:openjdk java Main
Hello World!
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$
不要なコンテナの削除
n実行後もコンテナは停止したまま残っている
• --rmオプションをつければ停止時に消える
• --rmオプションがなければ残っている
• もう一度このコンテナを使うなら便利(コンテナ内部状態も残っている)
• 使わないなら不要
$ docker run -it -v ${PWD}:/mnt myjava:openjdk java Main
Hello World!
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS
66aad8f7866b myjava:openjdk "java Main" 3 seconds ago Exited (0) ...
$
不要なコンテナの削除
n不要なコンテナは(停止してから)削除する
• 残っているとホストのメモリを圧迫する
コンテナを削除
するコマンド 削除するコンテナのIDを指定
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS
66aad8f7866b myjava:openjdk "java Main" 55 seconds ago Exited (0) ...
$
$ docker rm 66aad8f7866b
66aad8f7866b
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$
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上で動かせるので,開発環境=デプロイ環境になる
docker composeの利用
docker compose build
docker compose up -d
docker compose ps
docker compose exec
docker compose stop
docker compose down
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ではサー
ビス名を使う
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用のイメージを作成
作成されたイメージ
$ 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
$
$ 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で
見ても良い
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"
同じディレクトリ
なら見える
違うディレクトリ
なら見えない
コンテナ自体は
起動したまま
同じディレクトリ
に戻ると見える
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
コンテナで実行するコマンド
ホスト
コンテナ
ホスト
$ 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
コンテナで実行するコマンド
コンテナ内で実行
ホスト
コンテナ
$ 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とすると,停止&削除
コンテナは消えた
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の利用例
課題
n「演習1:gcc」と「演習2:java」を,dockerを各自のPCにインス
トールして行う
• docker psやdocker image lsなどのコマンドを使って,各手順でコンテナやイ
メージを確認すること
• dockerとdoker composeと両方で試す
想定試験問題
n仮想化とは何か,またその種類を説明せよ
nコンテナ技術とは何か,またその重要性と応用を述べよ
n以下を行うDockerコマンドを説明せよ
• イメージの作成・取得
• コンテナの実行
• コンテナの停止
• イメージの削除

ソフトウェア工学2023 06 コンテナ仮想化