| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

「Docker」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
226行目: 226行目:
 
*[[Docker ネットワーク]]
 
*[[Docker ネットワーク]]
 
*[[Jenkins]] 参照
 
*[[Jenkins]] 参照
 +
 +
===HOSTネットワークの使用===
 +
*https://docs.docker.jp/network/host.html
 +
*コンテナに対して host ネットワーク・モードを使うと、コンテナのネットワーク・スタックは Docker ホストから隔離されません
  
 
===ボリューム===
 
===ボリューム===

2021年7月3日 (土) 01:24時点における版

| Docker コマンド | Docker ネットワーク | WSL | Kubernetes | MicroK8s | 機械学習 | Ubuntu | | 仮想化 | Kubernetes |

インストール

CentOS


Windows


Mac


Docker Desktopインストール

Ubuntu


  1. パッケージのリストを更新
  2. TTPS経由でパッケージを使用できるように
  3. 公式DockerリポジトリのGPGキーをシステムに追加
  4. DockerリポジトリをAPTソースに追
  5. 追加されたリポジトリからDockerパッケージでパッケージデータベースを更新
  6. Dockerリポジトリからインストールしようとしていることを確認
  7. Dockerをインストール
  8. 実行されていることを確認
  1. sudo apt update
  2. sudo apt install apt-transport-https ca-certificates curl software-properties-common
  3. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  4. sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
  5. apt-cache policy docker-ce
  6. sudo apt install docker-ce
  7. sudo systemctl status docker
  • sudoしなくても良いように、docker グループに所属させる
  1. $ sudo usermod -aG docker ${USER}
  2. $ su ${USER}

一般的にUbuntuサーバーに入っているツールを一括インストール

  1. root@107d2fc09ce9:# unminimize

利用

検索、ダウンロード、確認、実行


  • 検索
    • Docker Hubをクロールし、名前が検索文字列と一致するすべてのイメージのリストを返す
    • OFFICIAL列のOKは、プロジェクトの背後にある会社によって構築およびサポートされているイメージを示す
  1. $ docker search ubuntu
  2. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  3. ubuntu Ubuntu is a Debian-based Linux operating sys 12271 [OK]
  4. dorowu/ubuntu-desktop-lxde-vnc Docker image to provide HTML5 VNC interface 533 [OK]
  5. websphere-liberty WebSphere Liberty multi-architecture images 272 [OK]
  6. r
  7. :
  • ダウンロード
  1. $ docker pull ubuntu
  • 確認
  1. $ docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. ubuntu latest 7e0aa2d69a15 4 weeks ago 72.7MB
  • 実行
    • -it インタラクティブシェル
    • 「6779ec318a4a」の部分がコンテナID
  1. $ docker run -it ubuntu
  2. root@6779ec318a4a:/#

コンテナ管理


コンテナ確認

  • アクティブなコンテナを表示
  1. $ docker ps
  • 非アクティブなコンテナも含める
  1. $ docker ps -a
  • 作成した最新のコンテナを表示
  1. $ docker ps -l

コンテナ開始・接続・停止

  • 停止したコンテナを開始
  1. $ docker start ${コンテナID}
  • コンテナに接続
  1. docker exec -it ${コンテナID} /bin/bash
  • コンテナを停止
  1. $ docker start ${コンテナID or コンテナ名}

コンテナ削除

  1. $ docker rm ${コンテナID or コンテナ名}

コンテナ内の変更をDocker イメージへ適用

  • 起動と停止はできますが、 docker rm コマンドで破棄すると、変更は永久に失われる
  • 新しいDockerイメージインスタンスへの変更をコミット
  • イメージをコミットすると、新しいイメージはコンピュータのローカルに保存
  1. docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name

ログを確認

  • -f でウォッチ
  1. $ docker logs ${コンテナID}

DockerイメージをDockerリポジトリにプッシュ

  • Docker Hubにログイン
  1. $ docker login -u docker-registry-username
  • 独自イメージをプッシュ(ubuntu-nodejs イメージを sammy リポジトリにプッシュ)
  1. $ docker push docker-registry-username/docker-image-name

Dockerfile

  • Dockerfileに環境構築手順を設定可能
  • Dockerfileは任意のイメージを起点とする
  • build コマンドは、カレントディレクトリの "Dockerfile" を実行し環境を構築する
  1. $ docker build .
  • タグ名など付与するので、以下のようになる
  1. $ docker build -t myjenkins-blueocean:1.1 .

設計

1コンテナにつき1プロセス

  • 最も大事な観点。複数プロセスは非推奨

イミュータブルなインフラストラクチャイメージにする

  • コンテナイメージはバージョン管理できるため、コンテナ実行後ではなく、コンテナイメージに実行バイナリやリソースを可能な限り埋め込むようにする

軽量なDockerイメージにする

  • ノード上に使用するイメージがない場合、外部からダウンロードする必要がある
  • キャッシュなどの削除、Alpine Linuxなど軽量なディストリビューションの利用
  • 陥りがちな罠
    • 後続のレイヤーで削除したファイルはイメージ内には実際には存在したままになる、そのファイルは単にアクセスできなくなるだけ
    • 各レイヤは、前のレイヤからの差分のため、前のレイヤを作り直すと、イメージをデプロイするために、そのレイヤをビルドし直し、もう一度プッシュしてからプルする必要がある

セキュリティ

  • コンテナにパスワードを入れない
  • 機密情報をイメージに混ぜない

実行ユーザーをroot以外にする

  • コンテナない実行ユーザーの権限を最小化

コンテナ

  • コンテナは2つのカテゴリに分類
    • システムコンテナ
    • アプリケーションコンテナ

システムコンテナ

  • 仮想マシンとよく似た動きをし完全なブートプロセスを実行
  • 通常の仮想マシンに含まれるのと同様な、ssh,cron,syslogといったシステムサービスが含まれる

アプリケーションコンテナ

  • 通常はアプリケーションを一つだけ動かすと言う点でシステムコンテナとは異なる
  • コンテナ一つに対して一つしかアプリケーションを動かさないのは余計な制約に見えるかもしれないが、スケーラブルなアプリケーションを構築するためには適切な細分化の単位
  • KubernetesのPodによってうまく活用できるデザイン哲学にもなっている

リモートレジストリへのイメージの保存

  • Dockerコミュニティーでは、Dockerイメージをリモートレジストリへ保存しておくのが標準的な方法
  • Dockerレジストリにはたくさんの種類がある
  • 最初に決めるのは、プライベートレジストリを使用するのかパブリックレジストリを使用するのか

Dockerfile

  • Dockerfile

FROM


  • FROM 命令は、イメージビルドのための処理ステージを初期化し、ベース・イメージ を設定します。後続の命令がこれに続きます。
  • 1 つの Dockerfile 内に FROM を複数記述することが可能です。
  • 出現順にマルチレイヤーとして処理される。 これは複数のイメージを生成するため、あるいは 1 つのビルドステージを使って依存イメージをビルドするために行います。
  1. FROM ubuntu:latest

RUN


  • RUN 命令は、現在のイメージの最上位の最新レイヤーにおいて、あらゆるコマンドを実行します。 そして処理結果を確定します。

WORKDIR


  • WORKDIR 命令はワークディレクトリを設定します。 Dockerfile 内にてその後に続く命令において利用することができます。

COPY


  • COPY 命令は <src> からファイルやディレクトリを新たにコピーして、コンテナ内のファイルシステムのパス <dest> に追加

実行


  • docker build を実行すると、順次コマンドライン命令を自動化した処理が行われて、ビルド結果となるイメージが得られます。
  1. $ sudo docker build .
  • 確認
  1. $ docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. ubuntu latest 4e2eef94cd6b 9 days ago 73.9MB

コマンド

ネットワーク

HOSTネットワークの使用

  • https://docs.docker.jp/network/host.html
  • コンテナに対して host ネットワーク・モードを使うと、コンテナのネットワーク・スタックは Docker ホストから隔離されません

ボリューム

  • https://matsuand.github.io/docs.docker.jp.onthefly/storage/volumes/
  • ボリュームとは、Docker コンテナーにおいて生成され利用されるデータを、永続的に保持する目的で利用される仕組み
  • バインドマウント はホストマシン OS のディレクトリ構造に依存しますが、ボリュームは完全に Docker によって管理される
  • ボリュームがまだ存在していない状態で、そのボリュームを使ったコンテナーを起動すると、Docker はその際にボリュームを生成
  1. $ docker volume ls
  2. $ docker volume inspect ${ボリューム名}
  3. $ docker volume rm ${ボリューム名}

docker0ブリッジ


  1. $ nmcli con show
  2. NAME UUID TYPE DEVICE
  3. 有線接続 1 2951eca6-87d7-3bfd-b31c-c6d6b0914e1e ethernet enp1s0f1
  4. ctc-g-d17c80 21fe84f8-fefd-4f25-a922-e098b6d49e3d wifi wlp2s0
  5. docker0 fbbd5a7e-7a83-4bfb-9f26-5a5d1ecfa370 bridge docker0
  1. $ sudo brctl show
  2. bridge name bridge id STP enabled interfaces
  3. docker0 8000.02421613dc30 no vethe38ad90
  1. $ ip addr show docker0
  2. 4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
  3. link/ether 02:42:6e:6b:32:17 brd ff:ff:ff:ff:ff:ff
  4. inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
  5. valid_lft forever preferred_lft forever
  • $ sudo vi /etc/sysctl.conf
  1. # Uncomment the next line to enable packet forwarding for IPv4
  2. net.ipv4.ip_forward=1
  • dockerブリッジの確認
  1. $ docker network inspect bridge
  2. [
  3. {
  4. "Name": "bridge",
  5. "Id": "090fc50f5cea256b57797287b7bff9b3ad9bcfc7ad0c0d7f0df9a68fd0bb3233",
  6. "Created": "2021-05-23T10:25:41.276772008+09:00",
  7. "Scope": "local",
  8. "Driver": "bridge",
  9. "EnableIPv6": false,
  10. "IPAM": {
  11. "Driver": "default",
  12. "Options": null,
  13. "Config": [
  14. {
  15. "Subnet": "172.17.0.0/16",
  16. "Gateway": "172.17.0.1"
  17. }
  18. ]
  19. },
  20. "Internal": false,
  21. "Attachable": false,
  22. "Ingress": false,
  23. "ConfigFrom": {
  24. "Network": ""
  25. },
  26. "ConfigOnly": false,
  27. "Containers": {},
  28. "Options": {
  29. "com.docker.network.bridge.default_bridge": "true",
  30. "com.docker.network.bridge.enable_icc": "true",
  31. "com.docker.network.bridge.enable_ip_masquerade": "true",
  32. "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
  33. "com.docker.network.bridge.name": "docker0",
  34. "com.docker.network.driver.mtu": "1500"
  35. },
  36. "Labels": {}
  37. }
  38. ]
  • 設定ファイル(デフォルトでは存在しないので作成)
  • /etc/docker/daemon.json
  1. $ sudo vi /etc/docker/daemon.json
  2. {
  3. "bip": "192.168.0.1/29"
  4. }
  • リスタート
  1. $ sudo systemctl restart docker
  • 確認
  1. $ ip addr show dev docker0
  2. 4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
  3. link/ether 02:42:6e:6b:32:17 brd ff:ff:ff:ff:ff:ff
  4. inet 192.168.0.3/29 brd 192.168.0.7 scope global docker0
  5. valid_lft forever preferred_lft forever
  6. inet6 fe80::42:6eff:fe6b:3217/64 scope link
  7. valid_lft forever preferred_lft forever
  • ブリッジと接続
  1. piroto@darjeeling:/etc/docker$ sudo nmcli con show
  2. [sudo] piroto のパスワード:
  3. NAME UUID TYPE DEVICE
  4. 有線接続 1 2951eca6-87d7-3bfd-b31c-c6d6b0914e1e ethernet enp1s0f1
  5. ctc-g-d17c80 21fe84f8-fefd-4f25-a922-e098b6d49e3d wifi wlp2s0
  6. docker0 04b34379-fa40-4081-912f-5fd6253d7438 bridge docker0
  7. ctc-a-d17c80 46a14c17-83f7-4d08-bf9d-c9e1aeba3b81 wifi --
  8. piroto@darjeeling:/etc/docker$ sudo nmcli con add type bridge-slave ifname enp1s0f1 master docker0
  9. 接続 'bridge-slave-enp1s0f1' (bf223bdf-e5d0-4947-97ac-2c5c4f9bdad9) が正常に追加されました。
  10. piroto@darjeeling:/etc/docker$ sudo nmcli con show
  11. NAME UUID TYPE DEVICE
  12. 有線接続 1 2951eca6-87d7-3bfd-b31c-c6d6b0914e1e ethernet enp1s0f1
  13. ctc-g-d17c80 21fe84f8-fefd-4f25-a922-e098b6d49e3d wifi wlp2s0
  14. docker0 04b34379-fa40-4081-912f-5fd6253d7438 bridge docker0
  15. bridge-slave-enp1s0f1 bf223bdf-e5d0-4947-97ac-2c5c4f9bdad9 ethernet --
  16. ctc-a-d17c80 46a14c17-83f7-4d08-bf9d-c9e1aeba3b81 wifi --
  17. piroto@darjeeling:/etc/docker$ sudo nmcli con up bridge-slave-enp1s0f1
  18. 接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/4)

docker0ブリッジ2


Docker except ip router.png

  1. 固定IP
  2. docker bip のゲートウェイに上記固定IPを指定
  3. bridge0の構成?
  1. $ ls /etc/netplan
  2. 99-netcfg.yaml bak
  1. $ sudo vi /etc/netplan/99-netcfg.yaml
  2. network:
  3. version: 2
  4. renderer: NetworkManager
  5. ethernets:
  6. enp1s0f1:
  7. dhcp4: no
  8. addresses: [192.168.0.23/24]
  9. gateway4: 192.168.0.1
  10. nameservers:
  11. addresses: [192.168.0.1, 8.8.8.8, 8.8.4.4]
  1. piroto@darjeeling:~$ nmcli con show
  2. NAME UUID TYPE DEVICE
  3. netplan-enp1s0f1 fb8733d5-5b9d-3c3c-ad52-c077a300b661 ethernet enp1s0f1
  4. ctc-g-d17c80 21fe84f8-fefd-4f25-a922-e098b6d49e3d wifi wlp2s0
  5. bridge-slave-enp1s0f1 9942b6c7-2cc4-4cb7-88d2-8e79bad972ac ethernet --
  6. ctc-a-d17c80 46a14c17-83f7-4d08-bf9d-c9e1aeba3b81 wifi --

Docker netmanater.png

  1. {
  2. "bip": "192.168.0.23/24"
  3. }
  1. $ sudo systemctl restart docker
  1. $ ip addr show dev docker0
  2. 4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
  3. link/ether 02:42:c5:9e:3c:a1 brd ff:ff:ff:ff:ff:ff
  4. inet 192.168.0.23/24 brd 192.168.0.255 scope global docker0
  5. valid_lft forever preferred_lft forever
  6. inet6 fe80::42:c5ff:fe9e:3ca1/64 scope link
  7. valid_lft forever preferred_lft forever


  1. $ docker run -i -t --rm ubuntu /bin/bash
  2. root@42dcb495617c:/# apt update
  3. root@42dcb495617c:/# apt install iproute2
  1. $ docker run -it --ip 192.168.0.22 ubuntu /bin/bash
  2. root@a32360383ebf:/# apt update
  3. oot@a32360383ebf:/# apt install iproute2
  4.  

docker0ブリッジ3

  1. 静的IP 23
  1. $ docker network create --driver bridge --subnet=192.168.0.0/24 --gateway=192.168.0.23 --opt "com.docker.network.bridge.name"="br0" shared_nw
  2. fcdef22003bdc75011a53a8a0e71ec8a992f17b15ce671b8064753548541f53e
  3.  
  4. $ ip addr show br0
  5. 6: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
  6. link/ether 02:42:d5:99:f5:a0 brd ff:ff:ff:ff:ff:ff
  7. inet 192.168.0.23/24 brd 192.168.0.255 scope global br0
  8. valid_lft forever preferred_lft forever
  9.  
  10. $ sudo brctl addif br0 enp1s0f1
  11. $ brctl show
  12. bridge name bridge id STP enabled interfaces
  13. br0 8000.0242d599f5a0 no enp1s0f1
  14. docker0 8000.0242d7eacdca no
  15.  
  16. docker run -i -t --net shared_nw --ip 192.168.0.22 ubuntu /bin/bash


  • 不要?
  1. $ sudo ip route add default via 192.168.0.23
  2.  
  3. $ ip route
  4. default via 192.168.0.23 dev enp1s0f1
  5. default via 192.168.0.1 dev wlp2s0 proto dhcp metric 600
  6. default via 192.168.0.1 dev enp1s0f1 proto static metric 20100
  7. 169.254.0.0/16 dev enp1s0f1 scope link metric 1000
  8. 192.168.0.0/24 dev br0 proto kernel scope link src 192.168.0.23
  9. 192.168.0.0/24 dev enp1s0f1 proto kernel scope link src 192.168.0.23 metric 100
  10. 192.168.0.0/24 dev wlp2s0 proto kernel scope link src 192.168.0.47 metric 600


  1. $ docker run -i -t --net shared_nw --ip 192.168.0.21 tensorflow/tensorflow:latest-jupyter
  2. [I 13:56:25.626 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret
  3. jupyter_http_over_ws extension initialized. Listening on /http_over_websocket
  4. [I 13:56:26.377 NotebookApp] Serving notebooks from local directory: /tf
  5. [I 13:56:26.377 NotebookApp] Jupyter Notebook 6.3.0 is running at:
  6. [I 13:56:26.378 NotebookApp] http://92ce0f7112eb:8888/?token=deadf022c3f634f84f7efa67b7b37decbfd28a9519e14c75
  7. [I 13:56:26.378 NotebookApp] or http://127.0.0.1:8888/?token=deadf022c3f634f84f7efa67b7b37decbfd28a9519e14c75
  8. [I 13:56:26.378 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
  9. [C 13:56:26.389 NotebookApp]
  10. To access the notebook, open this file in a browser:
  11. file:///root/.local/share/jupyter/runtime/nbserver-1-open.html
  12. Or copy and paste one of these URLs:
  13. http://92ce0f7112eb:8888/?token=deadf022c3f634f84f7efa67b7b37decbfd28a9519e14c75
  14. or http://127.0.0.1:8888/?token=deadf022c3f634f84f7efa67b7b37decbfd28a9519e14c75

Tips

snapインストール時の起動


  1. $ sudo systemctl restart snap.docker.dockerd

WSL2でKubernetes/Dockerを動かす


nginxを動かす


  1. $ docker pull nginx
  2. $ docker run --name test-ginx -d -p 8080:80 nginx

Docker nginx ubuntu.png

Docker nginx wsl2.png

docker: Error response from daemon: cgroups: cannot find cgroup mount destination: unknown.


  • Windowsの場合、ホスト側のVMにcgroups用のディレクトリが無いため
  1. $ sudo mkdir /sys/fs/cgroup/systemd
  2. $ sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd

MySQLを動かす


  1. $ docker pull mysql
  2. $ docker run --name test-mysql -e MYSQL_ROOT_PASSWORD=my-password -d mysql:latest
  • 接続
    • psでコンテナIDを確認
    • exec -it で接続
  1. $ docker ps

  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

  3. cccc85ac63e0 mysql:latest "docker-entrypoint.s..." 10 hours ago Up 8 minutes 3306/tcp, 33060/tcp test-
mysql
  4. $ docker exec -it ccc bash
  5. root@cccc85ac63e0:/# mysql -u root -p
  6. Enter password:
  7. Welcome to the MySQL monitor. Commands end with ; or \g.
  8. Your MySQL connection id is 8
  9. Server version: 8.0.21 MySQL Community Server - GPL
  10.  
  11. Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
  12.  
  13. Oracle is a registered trademark of Oracle Corporation and/or its
  14. affiliates. Other names may be trademarks of their respective
  15. owners.
  16.  
  17. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  18.  
  19. mysql>

Docker mysql ubuntu.png

ASP.Net Core


ASP.NET Coreを動かす