Slide 1

Slide 1 text

Dockerとは 【初心者向け】Docker入門 Cloud Native Sendai #03 令和元年/07/10 oda@sendai  

Slide 2

Slide 2 text

Dockerまだよくわからないって人のための勉強会です

Slide 3

Slide 3 text

Docker社のWebページで「Docker」で統一されているため、 このスライド内でも固有名詞、コマンドは除き、「Docker」と記述します。 ※「docker」と書かれていたら、誤字なので脳内変換を お願いします。 Dockerの表記について

Slide 4

Slide 4 text

実際のコンテナ

Slide 5

Slide 5 text

OS :Windows10 Home
 仮想化ソフト :VirtualBox
 仮想OS :CentOS7
 コンテナソフト :Docker
 この環境

Slide 6

Slide 6 text

よくある図ですが。
 コンテナについて

Slide 7

Slide 7 text

仮想化
 物理サーバ上に、仮想HW(ハードウェア)を作る。
 仮想HWを組み合わせて、仮想サーバを作る。
 仮想OSは、物理・仮想を区別することなく動作する。
 CPU・メモリ等の管理は仮想化ソフトで行う。
 
 コンテナ
 メモリ・FS(ファイルシステム)等を隔離した環境を
 作る。
 その環境上でバイナリを起動する。
 コンテナについて

Slide 8

Slide 8 text

仮想化した環境では、仮想HWや仮想OSがリソースの無駄使い になっている。
 パススルー技術やハイパーバイザーが登場したがリソースが0 にはなっていない。
 
 コンテナは、HWやOSのkernelは共通で、バイナリの動作環境を 隔離しているだけ。
 
 コンテナについて

Slide 9

Slide 9 text

ホストOSのKernelで、コンテナのプロセスは動作する。
 
 ・Linux上のコンテナ
 Linuxのプロセスが動作する。
   Windowsのプロセスは動作しない。
 
 ・Windows上のコンテナ
 Windowsアプリが動作する。
   Linuxのプロセスは動作しない。
 特徴

Slide 10

Slide 10 text

2017年以降に変更された名称
 
 ・Docker CE(Community Edition)
 無償版
 ・Docker EE(Enterprise Edition)
 有償版
 
 Dockerの種類(Linux)

Slide 11

Slide 11 text

・docker-engine
 2016年以前の古いDockerのパッケージ。
 ※DockerデーモンのことをDocker Engineと
 呼ぶことがあります。
 ・docker-io
 ubuntu?debian?がメンテしているパッケージ。
 ・Docker Machine
 Linux以外でDocker環境を構築するもの。
 Dockerの種類(Linux)

Slide 12

Slide 12 text

無償版
 CentOS7.6 でのインストール例
 
 
 
 
 Docker CE(Community Edition) # yum install yum-utils device-mapper-persistent-data lvm2 # yum-config-manager --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo # yum install docker-ce

Slide 13

Slide 13 text

商用版
 ・Docker Inc.によるサポート
 サポートは3種類
 
 「Basic」
 対応OS、対応クラウドでのサポート。
 Docker Storeでの認証済みコンテナ、
 認証済みプラグインの提供。
 
 
 Docker EE(Enterprise Edition)

Slide 14

Slide 14 text

「Standard」
 「Basic」+ 
 高度なイメージおよびコンテナ管理。
 LDAP/ADユーザーを統合したDocker Datacenterへ
 のアクセス。
 
 「Advanced」
 「Standard」+
 Dockerのセキュリティスキャン。
 継続的な脆弱性監視。
 Docker EE(Enterprise Edition)

Slide 15

Slide 15 text

方法が複数あってややこしい。特に見かける2つを。
 
 ・Docker for Windows
 Windows 10 Professional または Enterprise 64-bit
 で動作する。
 ・Docker Toolbox
 古いWindows環境で動作する。
 Virtual Boxを使うらしい。
 Dockerの種類(Windows)

Slide 16

Slide 16 text

Hyper-VのLinux仮想マシン上で、コンテナを動かす。
 Windows上のコンテナでLinuxのバイナリが動作する。
 
 Windows 10 バージョン1607 以降は、
 Windowsコンテナも扱えるらしい。
 Windows上で、Dockerサービスが起動している
 当然、Windowsのバイナリが動作する。
 Docker for Windows

Slide 17

Slide 17 text

Windowsコンテナも、「Windows Server コンテナ」と
 「Hyper-V コンテナ」の2種類ある。
 WindowsのVersion、種類(Windows Server、Windows Nano)で 使えるコンテナが変わってくる。
 非常にややこしいので、使用する場合は要調査。
 Docker for Windows の注意事項

Slide 18

Slide 18 text

※Windowsで動作させる場合は、以下に注意
 
 ・Hyper-Vを使うため、Windows10Homeでは
 動作しない。
 ・Windows 10 Proで、Hyper-vを有効にすると、
 VirtualBox等の仮想化アプリが使えなくなる。
 
 Docker for Windows の注意事項

Slide 19

Slide 19 text

近い将来、WSL2(Windows Subsystem for Linux)がHyper-Vに 置き換わる。
 この時、Windows 10 HomeでもDockerが使えるようになると期 待されている。
 
 Docker for Windows

Slide 20

Slide 20 text

論理的にリソースを隔離する仕組み。
 名前空間の異なる対象にアクセス出来なくする。
 
 
 namespace(名前空間) 名称 隔離対象 IPC名前空間 メモリ マウント名前空間 ファイルシステム ネットワーク名前空間 ネットワークデバイスや IPアドレス等 PID名前空間 PID ユーザー名前空間 UID・GID UTS名前空間 ホスト名とNISドメイン名

Slide 21

Slide 21 text

「3008」はPID。
 要管理者権限。
 
 
 namespace(名前空間) # ls -l /proc/3008/ns/ 合計 0 lrwxrwxrwx. 1 root root 0 7月 7 16:59 ipc -> ipc:[4026531839] lrwxrwxrwx. 1 root root 0 7月 7 16:59 mnt -> mnt:[4026531840] lrwxrwxrwx. 1 root root 0 7月 7 16:59 net -> net:[4026531956] lrwxrwxrwx. 1 root root 0 7月 7 16:59 pid -> pid:[4026531836] lrwxrwxrwx. 1 root root 0 7月 7 16:59 user -> user:[4026531837] lrwxrwxrwx. 1 root root 0 7月 7 16:59 uts -> uts:[4026531838]

Slide 22

Slide 22 text

CPU・メモリなどの物理リソースを制御(制限)する。
 コンテナ内のプロセスをグループ化して、リソースを使い過ぎな いようにしている。
 
 
 namespaceやcgroupsは、Linux kernelに古くから
 実装されていた機能。
 決して、コンテナのための新技術ではない。
 
 cgroups(Control Groups)

Slide 23

Slide 23 text

用語 レジストリ リポジトリを管理しているサービス リポジトリ イメージを多数保持している管理単位 公式リポジトリ OSやパッケージの管理団体が出している公式なリポジトリ イメージ ルート・ファイルシステムに対する変更を1つのパッケージにしたもの。 Docker Hub などからダウンロードする。 イメージ名 基本は「リポジトリ名 :タグ名」を繋げたもの コンテナ イメージをDocker Engine上で起動したもの Dockerホスト Dockerデーモンが稼働しているサーバ Dockerデーモン イメージとコンテナを管理する Docker Engine Dockerデーモンのこと。厳密にはデーモン中のエンジン部分か?

Slide 24

Slide 24 text

用語(具体的に) レジストリ Docker Hub リポジトリ 例えば、Apacheリポジトリ リポジトリの中では、イメージの違いをタグでラベル付けする 公式リポジトリ CentOS公式リポジトリや、Apache公式リポジトリなど イメージ docker image pull コマンドでダウンロードするもの docker image ls コマンドで一覧を表示できる イメージ名 CentOS公式リポジトリ上のイメージ名 centos:latest、centos:7 Apache公式リポジトリ上のイメージ名 httpd:2.4 コンテナ docker container ls コマンドで一覧を表示できる Dockerデーモン dockerd

Slide 25

Slide 25 text

1. リポジトリからイメージをダウンロード。
 2. 必要なパッケージの導入や設定を行いイメージを
 ビルドする。
 3. ビルドしたイメージからコンテナを起動。
 4. サービスが不要になったら、コンテナの停止と削除。
 5. 再度サービスが必要になったら、3. から繰り返し。
 
 
 コンテナの運用イメージ

Slide 26

Slide 26 text

コンテナの生存期間はサービス期間中のみ
 
 サービス開始 : イメージからコンテナを起動
 サービス停止 : コンテナを停止 = コンテナの削除
 
 コンテナの停止時に削除されるように、
 「--rm」オプションがある。
 
 コンテナのライフサイクル

Slide 27

Slide 27 text

コンテナを削除すると、コンテナ内の変更が失われる。
 恒久的な変更は、イメージを再ビルドするか、
 コミットしてイメージ化する。
 
 あらかじめ変更が出る箇所をコンテナ外に置く
 ・設定ファイルはホスト上に置き、
 コンテナから読み込む。
 ・一時的な変更は、環境変数で読み込む。
 
 停止コンテナを残さない

Slide 28

Slide 28 text

変更を加えたコンテナをイメージにすること。
 コミットしないままコンテナを削除すると
 コンテナへの変更は失われる。
 
 
 
 「docker image history」コマンドを使うと、
 イメージへの変更が一覧表示される。
 しかし、コミットするとこの一覧表示されない。
 コミットについて $ docker container commit container01 testimage:1.2

Slide 29

Slide 29 text

・ホストのボリュームに置く(-v オプション)
 消したくないデータはホスト上に残すことができる。
 
 ・コンテナ起動時に環境変数で渡す(-e オプション)
 パラメータ等は、環境変数で渡すことができる。
 例)mysqldコンテナでmysqldのrootパスワードは、
 「MYSQL_ROOT_PASSWORD」で渡す。
 コンテナ外の設定

Slide 30

Slide 30 text

-v オプションを使用して、ホストのボリュームを
 コンテナにマウントできる。
 
 この時アクセス権に注意
 コンテナ内のアカウントが「apache(UID 48)」の時。
 ホスト上にファイルを出力すると
 「unknown(UID 48)」としてファイルが作成される。
 ホスト上ではアカウントは存在しないため。
 
 ボリュームのマウント

Slide 31

Slide 31 text

コマンド docker image pull イメージ名 イメージをダウンロードする docker image build イメージ名 . Dockerfileを元にイメージを作成する docker image ls イメージの一覧を表示する docker image rm イメージ名 or イメージID イメージを削除する。対象イメージから起動したコンテナ が存在する場合は削除できない docker container run イメージ名 or イメージID コマンド イメージからコンテナを起動する docker container start コンテナ 名 or コンテナID 停止したコンテナを起動する usage : docker 操作対象 サブコマンド オプション


Slide 32

Slide 32 text

コマンド docker container exec コンテナ名 or コンテナID コマンド コンテナに追加のプロセスを実行させる docker container stop コンテナ名 or コンテナID コンテナを停止する docker container ls コンテナの一覧を表示する 「-a」をつけると停止コンテナも表示する docker container rm コンテナ名 or コンテナID コンテナを削除する 起動しているコンテナは削除できない

Slide 33

Slide 33 text

dockerには、古い形式のコマンドがある。
 コンテナを操作する時、対象として「container」を指定する必要 がなかった。
 
 新しい形式は、以下のようになっている。
 $ docker 対象 サブコマンド オプション
 
 例としてコンテナの一覧表示
 新:docker container ls
 旧:docker ps
 古いコマンド

Slide 34

Slide 34 text

コマンド(具体的に) $ docker image pull centos:latest centos:latest イメージをダウンロードする $ docker image build -t centos:httpd . Dockerfileの記述に従ってイメージを作成する Dockerfileは、カレントディレクトリにある 作成元のイメージは、Dockerfileで指定する $ docker image rm centos:latest 指定したイメージを削除する

Slide 35

Slide 35 text

コマンド(具体的に) $ docker container run --name=centos7 centos:latest centos:latestイメージ からコンテナを起動する コンテナ名をcentos7にする $ docker container exec --rm -it centos7 /bin/bash 指定したコンテナでbashプロセスを新しく起動する --rm がついているので、コンテナが停止すると削除される $ docker container stop centos7 指定したコンテナを停止する

Slide 36

Slide 36 text

コマンド(具体的に) $ docker container ls コンテナの一覧を表示する $ docker container ls -a 停止したコンテナも含め一覧を表示する $ docker container rm centos7 指定したコンテナを削除する $ docker container rm $(docker container ls -aq) 停止したコンテナを全て停止する 起動しているコンテナはエラーになり停止できない 使用時は要注意!!

Slide 37

Slide 37 text

コマンド(もっと具体的に) $ docker container run --rm \ --name=nginx \ --log-driver=journald \ -d \ -p 8080:80 \ -v /opt/nginx:/usr/share/nginx/html \ nginx $ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1a95aad91ed7 nginx "nginx -g 'daemon of…" 4 seconds ago Up 4 seconds 0.0.0.0:8080->80/tcp nginx

Slide 38

Slide 38 text

よく使われる(であろう)オプション
 docker run のオプション --rm コンテナが終了したときに削除する --name コンテナに名前を付ける --hostname コンテナのホスト名を設定する(プロンプトにホスト名が表示される) --network コンテナネットワークに接続する --log-driver ログの出力方法を設定する -d バックグラウンドで動作する

Slide 39

Slide 39 text

よく使われる(であろう)オプション
 docker run のオプション -p ホストのポートをコンテナにマッピングする 記述順は、ホストのポート :コンテナのポート -v ホストのディレクトリをコンテナにマウントする 記述順は、ホストのディレクトリ :コンテナのディレクトリ -e 環境変数をコンテナに渡す -i ホスト側の入力をコンテナに送る -t コンテナの出力をホスト側に出力する

Slide 40

Slide 40 text

Dockerは、1コンテナ・1プロセスが推奨。
 コンテナで動作するプロセスは、PID1になる。
 PID1のプロセスが停止するとコンテナが停止する。
 PID1のプロセスがbashだった場合、exitすると
 コンテナも停止する。
 
 PID1のプロセスがエラーで、停止するとコンテナも停止する。
 コンテナ内のプロセス

Slide 41

Slide 41 text

PID1になるデーモンが、バックグラウンド動作だとコンテナは停 止する。
 デーモンはフォアグラウンド動作でないといけない。
 
 
 コンテナ内のプロセス

Slide 42

Slide 42 text

itオプションを使う。
 -i ホスト側の入力をコンテナに送る
 -t コンテナの出力をホスト側に出力する
 
 エラーがある場合は、画面に表示される。
 
 
 「Ctrl-c」で終了すると、コンテナも停止する。
 「Ctrl + p」「Ctrl + q」で抜けるとコンテナは残る。
 コンテナが落ちる場合 $ docker container run -it nginx 


Slide 43

Slide 43 text

logs サブコマンドで確認できる。
 ※ここでのnginxは、コンテナ名
 
 
 この時表示されるログは、デーモンが標準出力と標準エラー出 力に出力したメッセージである。
 コンテナ作成する場合は、ログは標準出力と標準エラー出力に 出力するように作成する事が望ましい。
 コンテナのログを見る $ docker container logs nginx


Slide 44

Slide 44 text

起動中のコンテナに接続したい。
 PID1のプロセスがシェルだった場合、exitすると停止する。結果 コンテナも停止する。
 「Ctrl + p」「Ctrl + q」でプロセスを停止しないで、抜けられる。 (デタッチ)
 その後、再接続したいとき。(アタッチ)
 
 
 起動中のコンテナ $ docker container attach container01

Slide 45

Slide 45 text

起動中のコンテナに接続したい。
 
 コンテナに新しいプロセス(/bin/bash)を起動して、
 標準入出力をホストにつなぐ。
 docker container exec -it container01 /bin/bash
 
 
 
 この方法だと、exitで抜けてもコンテナは停止しない。
 起動中のコンテナ $ docker container exec -it container01 /bin/bash

Slide 46

Slide 46 text

Dockerのビルドをユーザで実行するとエラーになる。
 ユーザをdockerグループに入れることで、回避できる。
 ビルド操作のその前に $ sudo gpasswd -a $USER docker
 $ sudo systemctl restart docker
 
 


Slide 47

Slide 47 text

イメージに加える変更をファイルに記述したもの。
 ビルド時に読み込んで、イメージ作成を実行させる。
 
 
 Dockerfile

Slide 48

Slide 48 text

ファイル名を、「index.html」として保存する。
 
 Dockerfile(具体的に) 
 
 test page
 
 


test page

hello world
 
 
 


Slide 49

Slide 49 text

ファイル名を、「Dockerfile」として保存する。
 
 
 
 
 このDockerfileをビルドするコマンド
 Dockerfile(具体的に) FROM nginx
 COPY index.html /usr/share/nginx/html/index.html
 CMD ["nginx", "-g", "daemon off;"]
 $ docker image build . -t nginx_mybuild


Slide 50

Slide 50 text

ビルドしたイメージを確認する
 
 
 
 
 ビルドしたイメージを実行する
 
 
 ブラウザで、ポート8080へアクセスして接続確認。
 Dockerfile(具体的に) $ docker image ls | grep build
 niginx_mybuild latest a7ad137979c7 10 seconds ago 109MB
 
 $ docker container run -d -p 8080:80 nginx_mybuild


Slide 51

Slide 51 text

CnetOS7では、iptablesではなくFirewalldが標準。
 Dockerはiptablesと連携する。
 
 起きる問題
 Dockerデーモン起動後に、Firewalldを再起動すると、
 コンテナから外部へ通信できなくなる。
 
 解決策
 Firewalldを再起動した場合は、Dockerデーモンも再起動する。
 DockerとFirewalld

Slide 52

Slide 52 text

Dockerデーモンの再起動がイヤ!!な場合。
 
 1. Firewalldの停止
 ※あくまでもテスト環境の場合
 
 2. iptablesに入れ替える
 
 
 
 ※試してはいないので、自己責任でお願いします。
 DockerとFirewalld 対策編 # systemctl stop firewalld
 # yum erase firewalld
 # yum install iptables


Slide 53

Slide 53 text

コンテナのhello-world
 
 一番簡単なコンテナ $ docker run hello-world
 Unable to find image 'hello-world:latest' locally
 latest: Pulling from library/hello-world
 d1725b59e92d: Pull complete
 Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde47097 1e499788
 Status: Downloaded newer image for hello-world:latest
 Hello from Docker!
 This message shows that your installation appears to be 


Slide 54

Slide 54 text

コンテナのhello-world
 
 一番簡単なコンテナ working correctly.
 To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 (amd64)
 3. The Docker daemon created a new container from that image which runs the
 executable that produces the output you are currently reading.
 


Slide 55

Slide 55 text

コンテナのhello-world
 
 一番簡単なコンテナ 4. The Docker daemon streamed that output to the Docker client, which sent it
 to your terminal.
 To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash
 Share images, automate workflows, and more with a free Docker ID:
 For more examples and ideas, visit:
 https://hub.docker.com/
 https://docs.docker.com/get-started/


Slide 56

Slide 56 text

Docker Hub
 https://hub.docker.com/
 Dockerイメージの探し方

Slide 57

Slide 57 text

Official imageがあるか、Download数、スター数を
 参考にする。
 Dockerイメージの探し方

Slide 58

Slide 58 text

参考 Docker ドキュメント日本語化プロジェクト - Docker-docs-ja
 http://docs.docker.jp/index.html
 ※古くてVersionが17.06
 
 Docker Documentation(英語)
 https://docs.docker.com/
 
 Docker Hub
 https://hub.docker.com/
 


Slide 59

Slide 59 text

参考 Docker のインストール - Docker-docs-ja
 http://docs.docker.jp/engine/installation/
 
 Docker Engine について - Docker-docs-ja
 http://docs.docker.jp/engine/index.html


Slide 60

Slide 60 text

Dockerとは END