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

Docker

提供: MyMemoWiki
ナビゲーションに移動 検索に移動

| 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. 実行されていることを確認
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
apt-cache policy docker-ce
sudo apt install docker-ce
sudo systemctl status docker
  • sudoしなくても良いように、docker グループに所属させる
$ sudo usermod -aG docker ${USER}
$ su ${USER}

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

root@107d2fc09ce9:# unminimize

利用

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


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

コンテナ管理


コンテナ確認

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

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

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

コンテナ削除

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

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

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

ログを確認

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

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

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

Dockerfile

  • Dockerfileに環境構築手順を設定可能
  • Dockerfileは任意のイメージを起点とする
  • build コマンドは、カレントディレクトリの "Dockerfile" を実行し環境を構築する
$ docker build .
  • タグ名など付与するので、以下のようになる
$ 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 つのビルドステージを使って依存イメージをビルドするために行います。
FROM ubuntu:latest

RUN


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

WORKDIR


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

COPY


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

実行


  • docker build を実行すると、順次コマンドライン命令を自動化した処理が行われて、ビルド結果となるイメージが得られます。
$ sudo docker build .
  • 確認
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
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 はその際にボリュームを生成
$ docker volume ls
$ docker volume inspect ${ボリューム名}
$ docker volume rm ${ボリューム名}

docker0ブリッジ


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

docker0ブリッジ2


Docker except ip router.png

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

Docker netmanater.png

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


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

docker0ブリッジ3

  1. 静的IP 23
$ 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
fcdef22003bdc75011a53a8a0e71ec8a992f17b15ce671b8064753548541f53e

$ ip addr show br0
6: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:d5:99:f5:a0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.23/24 brd 192.168.0.255 scope global br0
       valid_lft forever preferred_lft forever

$ sudo brctl addif br0 enp1s0f1
$ brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.0242d599f5a0	no		enp1s0f1
docker0		8000.0242d7eacdca	no		

 docker run -i -t --net shared_nw --ip 192.168.0.22 ubuntu /bin/bash


  • 不要?
$ sudo ip route add default via 192.168.0.23

$ ip route
default via 192.168.0.23 dev enp1s0f1 
default via 192.168.0.1 dev wlp2s0 proto dhcp metric 600 
default via 192.168.0.1 dev enp1s0f1 proto static metric 20100 
169.254.0.0/16 dev enp1s0f1 scope link metric 1000 
192.168.0.0/24 dev br0 proto kernel scope link src 192.168.0.23 
192.168.0.0/24 dev enp1s0f1 proto kernel scope link src 192.168.0.23 metric 100 
192.168.0.0/24 dev wlp2s0 proto kernel scope link src 192.168.0.47 metric 600 


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

Tips

snapインストール時の起動


$ sudo systemctl restart snap.docker.dockerd

WSL2でKubernetes/Dockerを動かす


nginxを動かす


$ docker pull nginx
$ 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用のディレクトリが無いため
$ sudo mkdir /sys/fs/cgroup/systemd
$ sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd

MySQLを動かす


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

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES

cccc85ac63e0        mysql:latest        "docker-entrypoint.s..."   10 hours ago        Up 8 minutes        3306/tcp, 33060/tcp   test-
mysql
$ docker exec -it ccc bash
root@cccc85ac63e0:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.21 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Docker mysql ubuntu.png

ASP.Net Core


ASP.NET Coreを動かす