Dockerコンテナを動かしてみよう︕

株式会社びぎねっと
宮原 徹

講師 ⾃⼰紹介n株式会社びぎねっと 代表取締役社⻑兼CEO⽇本仮想化技術株式会社 代表取締役社⻑兼CEOでもある
私とLPI-Japan
nLinuCの試験開発の活動に参加しています新しい試験範囲に加わった仮想化・クラウドなどは専⾨です
nLPI-Japan発⾏のメールマガジンに寄稿しています
nLPI-Japan主催各種セミナーの講師を務めていますn標準教科書シリーズの執筆などをしていました2

Linux技術者認定「LinuC（リナック)」とはnLinuCとはクラウド時代の即戦⼒エンジニアであることを証明するLinux技術者認定

ü現場で「今」求められている新しい技術要素に対応• オンプレミス／仮想化・コンテナを問わず様々な環境下でのサーバー構築• 他社とのコラボレーションの前提となるオープンソースへの理解• システムの多様化に対応できるアーキテクチャへの知⾒ü全⾯的に⾒直した「今」⾝につけておくべき技術範囲を網羅
今となっては使わない技術やコマンドの削除、アップデート、新領域の取り込みüLinuxの範疇だけにとどまらない領域までカバー
セキュリティや監視、オープンソースへの理解など、ITエンジニアであれば必須の領域もカバー
3

クラウドを活⽤できるITエンジニアに必須の技術がまとまっている
AWSなどのパブリッククラウドを活⽤するための技術

AWSなどのパブリッククラウドを活⽤するための技術間が⽋けている状態

仮想マシン／コンテナ技術、クラウドセキュリティ、アーキテクチャ、ほか

オンプレミスのサーバーサイドLinux技術

オンプレミスのサーバーサイドLinux技術【今まで／その他】

Version10.0
4

Dockerコンテナを動かしてみよう︕

5

コンテナの特徴

n1コンテナ1プロセスで動作する
仮想マシンと⽐べてハイパーバイザーのオーバーヘッドが無いのでより⾼速n≒コンテナ内で1プロセス（1タスク）が動作する
サービスプロセスと並⾏で対話型シェルを動かすなどの考え⽅は基本的に無い（シングルタスク）
コンテナの中であれこれ動作させるのには向かない
WebアプリならWeb APサーバで1コンテナ、DBサーバで1コンテナという感じ
nDockerイメージは（ルート）ファイルシステム
chrootを思い浮かべるとちょうどいい
6各⽅式の⽐較
ベアメタル（物理）

仮想マシン

コンテナ

性能
OS

最も速い
1つだけI/Oが遅い
速い
複数種類を混在可能 カーネルは1つだけだが、ディストリビューションは混在可能

リソース使用システムで専有

メモリの無駄が多い

柔軟性
主な用途

硬直的
高速なDBなど

非常に柔軟
従来型の業務システ
ム

OSカーネルは1つで効率が良い
単機能向け
Webサービスのフロントエンド等、同一のものを大量配備する必要があるもの

7

Dockerを動かす⽅法

nDocker Desktopを使う
WindowsとMacに対応
Linux版はベータ版で仮想マシン上では動作しない
GUIが便利nLinuxにDocker関連パッケージをインストールシンプルに動かせる
よりサーバー向き︖
nその他、いろいろなソリューションがあるので、⽬的に応じて

8

DOCKER DESKTOPのインストール

9Docker Desktopをインストール
n⼿元で使いやすいDocker Desktopをインストール
 学習⽬的としてインストールしてください 商⽤利⽤は有償（⼩規模企業は例外あり）
nシステム要件はドキュメントで確認 https://docs.docker.jp/desktop/
nWindowsはWSL2上でDockerコンテナが動作 Windows HomeでもWSL2は動作するのでインストール可能
nmacOSは10.13(High Sierra)以降が必要
 Apple Siliconも対応
nLinuxの場合でもコマンドラインは共通なので、関連パッケージをインストールしてDockerコンテナの実⾏環境を⽤意してください 物理マシン上でDocker Desktop for Linuxベータ版でも可10

Docker Desktop for Macのインストール

nダウンロード後、実⾏ファイルをコピー
n実⾏ファイルを起動すると管理者権限を要求されるので認証
n使⽤権許諾を確認
n（アプリケーションが正しく起動しないので再度起動）

11

管理権限が必要

使⽤権許諾を確認
12Dockerイメージをダウンロード

1. UbuntuのDockerイメージを検索
# docker search ubuntu
2. UbuntuのDockerイメージをダウンロード
# docker pull ubuntu
最新版（latest）がダウンロードされる
3. Dockerイメージを確認
# docker images
イメージはIDで識別

13

コマンド実⾏例% docker search ubuntuNAMEDESCRIPTIONSTARSOFFICIAL AUTOMATED
ubuntuUbuntu is a Debian-based Linux operating sys… 14171[OK]（略）% docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
125a6e411906: Pull complete
Digest: sha256:26c68657ccce2cb0a31b330cb0be2b5e108d467f641c62e13ab40cbec258c68d
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest% docker images
REPOSITORY TAG
IMAGE ID
CREATED
SIZEubuntu
latest d2e4e1f51132 4 days ago 77.8MB

14

GUIでイメージを確認15Dockerコンテナを実⾏（基本）

1. Ubuntuイメージでコンテナを実⾏
# docker run -it ubuntu bash
-i, --interactive=true|false
-t, --tty=true|false
2. 実⾏中のコンテナを確認（ホスト）コンテナ内ではなくホスト側で実⾏（別ターミナル起動など）
# docker ps -a
-a, --all=true|false⼀意のIDと名前が割り当てられる
3. コンテナから抜けるには exit コマンド16

GUIで実⾏しているコンテナを確認

17

Dockerコンテナ実⾏（応⽤）1. コンテナ名を付ける
# docker run --name=名前 イメージ名 コマンド
2. シェルからコマンドを実⾏させる
# docker run イメージ名 /bin/bash -c "コマンド"
3. より複雑な実⾏時処理を⾏いたい場合はDockerfileを記述する（後述）どこまで複雑にするかはケースバイケース︖

18

GUIでコンテナを起動

19

DOCKERコンテナのライフサイクル

20

イメージとコンテナの変移

ubuntu①コンテナとして実⾏（docker run）
② # apt install nginx

nginx
ubuntu④イメージをコンテナ化（docker run）

③コンテナをイメージ化（docker commit）

nginx
ubuntu21

コンテナにNginxをインストール
1. コンテナを起動（ホスト） # docker run -it --name=nginx ubuntu bash
2. apt updateを実⾏
 # apt update
3. Nginxをインストール
 # apt install nginx
4. curlコマンドをインストール（Nginxの動作確認⽤）
 # apt install curl
5. Nginxを起動（バックグラウンド動作）
 # nginx
6. 動作確認 # curl localhost サンプルHTMLが表⽰されればNginxが動作している
 Nginxの停⽌は nginx -s quit を実⾏
22コンテナをイメージ化1. Nginxをフォアグラウンド実⾏するように設定
 コンテナ内でNginxをバックグラウンド起動するとコンテナが停⽌してしまう このコマンドはコンテナ内で実⾏すること
 # echo "daemon off;" >> /etc/nginx/nginx.conf
2. コンテナから抜ける
 # exit
3. コンテナをイメージ化する（ホスト） # docker commit nginx nginx_template nginxは実⾏していたコンテナ名
 nginx_templateは保存するイメージ名nコンテナイメージが追加されたことを確認（ホスト） # docker images23

GUIでイメージを確認

24

新たなイメージからコンテナ実⾏

1. コンテナでNginxを実⾏し、ホストのポート8080番をコンテナのポート80番に紐付ける（ホスト）# docker run -d -p 8080:80 --name=web1
nginx_template nginx
-d, --detach=true|false
2. ポートが紐付いていることを確認（ホスト）# docker ps -a
# curl localhost:8080
NginxのサンプルページのHTMLが表⽰されればOK

25

GUIで実⾏しているコンテナを確認

26

DOCKERのネットワーク

27

Dockerのネットワーク構成図（Linuxの場合）

Dockerコンテナ

Dockerコンテナ

eth0

eth0
仮想的に直結veth

veth

docker0

ブリッジ接続NAPT接続（IPマスカレードやポート転送）

eth0
外部

28

今回のケースを当てはめてみるとDocker Desktopの場合、構成が異なるのでこの通りではありませんが基本的な考え⽅は⼤体⼀緒ですDockerコンテナ
eth0
ポート80

仮想的に直結veth
ブリッジ接続docker0
NAPT接続（IPマスカレードやポート転送）

eth0
localhost:8080
curlコマンド29

⾃動化への第⼀歩

DOCKERFILEを書いてみる

30

Dockerfileに書ける内容
命令

内容

FROM

元となるイメージ

LABEL

イメージにメタデータを付与

RUN

docker build時にコマンド実行

CMD

コンテナ実行時にコマンド実行（実行時上書き可）

EXPOSE

ポートの紐付け

ENV

環境変数の指定

ADD

ファイル、ディレクトリの追加

COPY

ファイル、ディレクトリの追加（URL指定不可・解凍不可）

ENTRYPOINT

コンテナ実行時にコマンド実行（実行時上書き不可）

VOLUME

ボリュームのマウント

USER

実行ユーザの指定

WORKDIR

作業ディレクトリの指定

ONBUILD

作成したイメージを元にしたdocker build終了後にコマンドを実行
31

Dockerfileの使⽤例（1）nDockerfileを作成する
ホームディレクトリ以外のディレクトリに作成すること
FROM ubuntu:latest
RUN apt update -y
RUN apt install nginx -y
ENTRYPOINT /usr/sbin/nginx -g "daemon off;"

ENTRYPOINTでNginxのフォアグラウンド起動を指定
ndocker buildでDockerイメージを作る
# docker build -t nginx_dockerfile . ←.（ドット）を忘れずに
最後の「. 」はカレントディレクトリのDockerfileを参照するために指定
32

Dockerfileの使⽤例（2）nDockerイメージが作成されたことを確認
# docker images
nDocker buildで作成したイメージでコンテナを実⾏する
# docker run -d -p 8081:80 --name=web2
nginx_dockerfile
# curl localhost:8081
ENTRYPOINTでnginxの起動を指定しているのでコンテナで実⾏するコマンドの指定は不要
Nginxのフォアグラウンド起動は起動時オプション-gでパラメータを動的に与えています33

GUIでイメージを確認

34

GUIで実⾏しているコンテナを確認

35

まとめ

nDockerコンテナの実⾏環境を構築して、基本的なDockerコンテナの扱い⽅について解説しました
nコンテナは実体が⾒えにくいため、Docker DesktopのGUIを状態把握のために活⽤しましょう
nコンテナのライフサイクルについてきちんと理解しましょう
nDockerfileで⾃動化に⼊⾨

36