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

MyMemoWiki

Docker

提供: MyMemoWiki
2021年5月23日 (日) 05:27時点におけるPiroto (トーク | 投稿記録)による版 (→‎docker0ブリッジ2)
ナビゲーションに移動 検索に移動

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

インストール

CentOS


Windows


Mac


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}

利用

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


  • 検索
    • 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

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

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

設計

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

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

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

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

軽量なDockerイメージにする

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

セキュリティ

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

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

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

コンテナ

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

システムコンテナ

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

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

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

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

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

Dockerfile

FROMでベースイメージを指定して、RUNやCOPYなどのコマンドでイメージを作成する

  • Dockerfile
FROM ubuntu:latest
  • 実行
$ sudo docker build .
  • 確認
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              4e2eef94cd6b        9 days ago          73.9MB

コマンド

ネットワーク

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


  1. 固定IP
  2. docker bip のゲートウェイに上記固定IPを指定
  3. bridge0の構成?

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