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

Docker

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

| Docker コマンド | Docker ネットワーク | WSL | Kubernetes |

Docker

| 仮想化 | Kubernetes |

インストール

設計

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

コマンド

ネットワーク

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