Docker
| Docker コマンド | Docker ネットワーク | WSL | Kubernetes | MicroK8s | 機械学習 | Ubuntu | | 仮想化 | Kubernetes |
インストール
CentOS
Windows
Mac
Ubuntu
- パッケージのリストを更新
- TTPS経由でパッケージを使用できるように
- 公式DockerリポジトリのGPGキーをシステムに追加
- DockerリポジトリをAPTソースに追
- 追加されたリポジトリからDockerパッケージでパッケージデータベースを更新
- Dockerリポジトリからインストールしようとしていることを確認
- Dockerをインストール
- 実行されていることを確認
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
- 固定IP
- docker bip のゲートウェイに上記固定IPを指定
- 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 --
{ "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
- 静的IP 22
$ docker network create --driver bridge --subnet=192.168.0.0/24 --gateway=192.168.0.22 --opt "com.docker.network.bridge.name"="br0" shared_nw $ sudo brctl addif br0 enp1s0f1 $ brctl show bridge name bridge id STP enabled interfaces br0 8000.0242ae6b00cb no enp1s0f1 docker0 8000.0242c3ce6e6b no
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
- WSL2
docker: Error response from daemon: cgroups: cannot find cgroup mount destination: unknown.
- https://web.plus-idea.net/2019/07/docke-cgroups-mount-destination/
- https://github.com/boot2docker/boot2docker/issues/1301
- Windowsの場合、ホスト側のVMにcgroups用のディレクトリが無いため
$ sudo mkdir /sys/fs/cgroup/systemd $ sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd
MySQLを動かす
- https://hub.docker.com/_/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>
© 2006 矢木浩人