Docker
ナビゲーションに移動
検索に移動
| Docker コマンド | Docker ネットワーク | WSL | Kubernetes | MicroK8s | 機械学習 | Ubuntu | | 仮想化 | Kubernetes |
インストール
CentOS
Windows
Mac
Docker Desktopインストール
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}
一般的に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
- FROMでベースイメージを指定して、RUNやCOPYなどのコマンドでイメージを作成する
- リファレンス
- リポジトリ
- 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
- 固定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 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
- 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>
ASP.Net Core
ASP.NET Coreを動かす
© 2006 矢木浩人