#author("2022-03-31T12:56:52+00:00","default:admin","admin") #author("2023-04-05T00:28:37+00:00","default:admin","admin") -[[実践 Docker - ソフトウェアエンジニアの「Docker よくわからない」を終わりにする本:https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59]] *基本 [#d4461705] -[[Docker ドキュメント日本語化プロジェクト:http://docs.docker.jp/index.html]] -[[Dockerのすべてが5分でわかるまとめ!(コマンド一覧付き):http://paiza.hatenablog.com/entry/docker_intro]] -[[Dockerについて基本から最近追加された機能までまとめ:http://qiita.com/tigberd/items/b94ae2bf7d78685cd6f5]] -[[(初心者向け)Dockerの使い方:http://qiita.com/butada/items/3e6cd338cb703eef64b4]] -[[そろそろDockerを始めないとやばいと思い始めたあなたへ:http://tech.respect-pal.jp/docker_tutorial/]] -[[Dockerコマンドメモ:http://qiita.com/curseoff/items/a9e64ad01d673abb6866]] -[[Docker チートシート:https://www.qoosky.io/techs/0a0bd52cd3]] -[[Docker ノウハウ集:http://qiita.com/eidera/items/19decbfc290b4776cfc3]] -[[進化を続けるDockerの今を知る 記事一覧:https://thinkit.co.jp/series/4873]] -[[Dockerを知る -周辺ツールと業界動向- 記事一覧:https://thinkit.co.jp/series/5186]] -[[より深くDockerを知る 記事一覧:https://thinkit.co.jp/series/5197]] -[[古賀政純の「攻めのITのためのDocker塾」:http://www.itmedia.co.jp/enterprise/series/1947/]] **注意点 [#f5b7da97] -Dockerではコンテナを削除するとコンテナ内のファイルシステム内に加えた変更点はすべて破棄されてしまう --ボリューム機能やボリュームプラグインを利用する **インストール [#nfda45ad] # yum install docker # chkconfig docker on # service docker start # systemctl enable docker.service *ネットワーク [#j450f144] -[[Docker コンテナ・ネットワークの理解:https://docs.docker.jp/engine/userguide/networking/dockernetworks.html]] -[[network コマンドを使う:https://docs.docker.jp/engine/userguide/networking/work-with-networks.html]] -Docker上のネットワークを確認 # docker network ls NETWORK ID NAME DRIVER SCOPE 68404cfc20d7 bridge bridge local 8734698e49f4 host host local 73a2d6fc1070 none null local -ネットワークの詳細を表示 # docker network inspect bridge [ { "Name": "bridge", "Id": "68404cfc20d79e6884e578fb1666b065d22c6a5168e8d3e311dc368339bc484d", "Created": "2021-05-18T08:39:46.2054623Z", "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": { "66768b3228e486a9cee4377694961978599529f25906ee61b31ec075d5732d7e": { "Name": "flamboyant_lamarr", "EndpointID": "3a4743a6313199658f0d12e8ba97ee0450441b8c0e864e0ba10838860bf935b4", "MacAddress": "02:42:ac:11:00:02", "IPv4Address": "172.17.0.2/16", "IPv6Address": "" } }, "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": {} } ] *頻出イメージ [#e4c05354] -[[Docker Hub:https://hub.docker.com]] -[[DockerHubすぐに使えるコンテナ集:https://www.j74th.com/docker/dockerhub/]] -[[DockerでLaravel+PHP5.6+MySQL5.6+Apacheの環境構築:http://qiita.com/eidera/items/19decbfc290b4776cfc3]] **[[centos:https://hub.docker.com/_/centos/]] [#c0a2244f] -CentOS # docker pull centos # docker run -i -t centos /bin/bash **[[busybox:https://hub.docker.com/_/busybox/]] [#xbff5c0d] -標準UNIXコマンドの主要コマンドをまとめて1つの実行ファイル化したツール **[[greyltc/lamp:https://hub.docker.com/r/greyltc/lamp/]] [#f2e616de] -LAMP環境 # docker pull docker pull greyltc/lamp # docker run --name lamp01 -p 80:80 -p 443:443 -d greyltc/lamp **[[gargron/mastodon:https://hub.docker.com/r/gargron/mastodon/]] [#q0f0aaa8] -Mastodonサーバ -[[Mastodonを構成する要素の概要を理解する:http://qiita.com/ongstar/items/f0d4fc2a620380b527fa]] -[[Mastodonを構成する要素を理解する(docker-compose編):http://qiita.com/ongstar/items/ec3b71c581b2b362aa3d]] -[[Dockerで立ち上げたMastodonのDBを後から永続化する:http://qiita.com/yuu26/items/d4b9df0ba2d46e6b9f69]] *docker-compose [#veab67e0] -[[docker-compose.yml の内容を理解しよう:https://futureys.tokyo/lets-understand-contents-of-docker-compose-yml/]] -[[プラットフォーム依存しない新しい「Docker Compose」マルチコンテナをクラウドに簡単デプロイ:https://logmi.jp/tech/articles/324732]] -[[Docker composerでデータコンテナ分離とバックアップ・リストア:https://academy.gmocloud.com/advance/20160815/3457]] -docker-composeはDockerのコマンドであり、docker-compose.ymlという設定ファイルに基づき複数のコンテナを用いたサービスを従来よりも簡単に管理できるようにするもの -docker-compose.yml と docker-composeコマンドを使うことにより次のようにコンテナ作成を自動化できる --コンテナ上のサービスはサーバ内のファイルやリポジトリを元に作成させられる --サービス起動に必要な環境変数を外部ファイルから読み込める --再起動時のサービスの振る舞いを設定できる --サービス上のデータはデータボリュームを使い保管できる --サービス上のポートをホスト側に繋ぐことが出来る --サービス同士の依存関係が設定できる **インストール [#aeec3c5b] # curl -L https://github.com/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose # chmod +x /usr/local/bin/docker-compose **docker-compose.yml 作成 [#r98d4952] -[[Compose ファイル・リファレンス:http://docs.docker.jp/compose/compose-file.html#volume-configuration-reference]] version: '2' services: # # nginx-proxy # proxy: container_name: proxy image: docker.io/jwilder/nginx-proxy ports: - "8080:80" - "8443:443" volumes: - /var/run/docker.sock:/tmp/docker.sock:ro # # lamp (foobar.fika.pw) # lamp01: container_name: lamp01 depends_on: - proxy image: greyltc/lamp ports: - "8090-8180:80" - "8453-8543:443" environment: VIRTUAL_HOST: foobar.fika.pw volumes: - lamp01_html:/srv/http - lamp01_mysql:/var/lib/mysql volumes: lamp01_html: driver: local lamp01_mysql: driver: local -注意点 --YAMLファイルはタブが使えない。スペースを打て! --コンテナ名を指定したい場合は container_name を指定 --バージョン2のファイル では名前を付けたボリュームを使うにはトップ・レベルの volumes キー を指定する必要がある点に注意 -疑問点 --名前付きデータボリュームXXXの名前が勝手に「docker_XXX」になる *データの永続化 [#r6719dc6] -[[Docker: データボリュームとデータボリュームコンテナ:http://blog.amedama.jp/entry/2016/02/18/011125]] -[[Dockerのボリュームプラグインとストレージドライバ(Dockerの最新機能を使ってみよう:第2回):http://knowledge.sakura.ad.jp/knowledge/5021/]] -データボリュームはそのコンテナ特有のデータを扱う場合に使い、データコンテナは複数のコンテナから参照されるデータを収める場合に使うといいのかも **データボリューム [#c3f06f31] -Dockerホストのディレクトリ(一般に「/var/lib/docker/volumes」)で、ここにコンテナの永続データを格納する -このディレクトリはコンテナ起動時にマウントポイントとして表示され、管理者がこれを指定する -1つまたは複数のコンテナ内に特別に指定されたディレクトリ(コンテナから見た時) -Dockerで1つのオブジェクトとして管理されている -コンテナをまたいで共有と再利用可能である -データボリュームへ変更した結果はすぐに反映される -コンテナ自身が消えてもデータボリュームは消えない -コンテナを作成・起動時にデータボリュームも作成 # docker run -t -i -v testvolume01:/data --name srv01 centos /bin/bash --v [ボリューム名]:[コンテナ側のマウントポイント] -データボリュームのみ作成 # docker volume create --name mysql_data **データボリュームコンテナ [#nd813223] -データボリューム自体は、外部からアクセスができないため、データボリュームコンテナと呼ばれるコンテナを作成し、そこにデータボリュームをマウントする -コンテナをまたいで永続的なデータが共有できる -通常のコンテナと何ら変わらないが、コンテナのイメージはライトなbusyboxなどを使う -[[Docker データボリュームコンテナをつくる:http://unskilled.site/docker-%E3%83%87%E3%83%BC%E3%82%BF%E3%83%9C%E3%83%AA%E3%83%A5%E3%83%BC%E3%83%A0%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8B/]] # docker create -it -v datavol01:/data --name datavol01 busybox # docker run -it --volumes-from datavol01 --name cent01 centos /bin/bash ... cent01 から /data が使える **ボリュームプラグイン [#lde9da50] -Dockerホスト以外のストレージをボリュームとして利用できる -独自のプラグインを開発できるよう仕様も公開されている -[[Use Docker Engine plugins:https://docs.docker.com/engine/extend/legacy_plugins/]] -[[Dockerコンテナがフェイルオーバーしたとき、ストレージも自動的に切り替えてくれる。オープンソースの「REX-Ray」をDell EMCが無償公開中:http://www.publickey1.jp/blog/17/dockerrex-raydell_emcpr.html]] *バックアップツール [#g3b2ff69] **Convoy [#x3040db3] -[[Dockerコンテナ環境のバックアップツール「Convoy」を使う:https://thinkit.co.jp/article/9542]] -[[Docker+Convoyでバックアップ:http://qiita.com/kuri_hei/items/50c50b5430426f04cc25]] -[[第10回 Docker環境におけるバックアップ/リストアの罠 (1/4):http://www.itmedia.co.jp/enterprise/articles/1511/11/news017.html]] -[[第11回 Docker環境のバックアップをラクにする「Convoy」とは? (1/3):http://www.itmedia.co.jp/enterprise/articles/1511/25/news013.html]] -[[第12回 Docker環境のバックアップツール「Convoy」を試す (1/3):http://www.itmedia.co.jp/enterprise/articles/1512/09/news001.html]] -[[DockerでMinecraftサーバを動かし,Convoyでバックアップしてみた:http://windymelt.hatenablog.com/entry/2016/06/16/154614]] -Convoyは数あるボリュームドライバのうちの一つである. -Convoyにはデータボリュームをスナップショット・バックアップ/レストアする機能がある. -Convoyを使うには,データ自体を記録するストレージと,メタデータを記録するストレージがそれぞれ必要である ***インストール [#ga758659] # https://github.com/rancher/convoy/releases/download/v0.5.0/convoy.tar.gz # tar xvf convoy.tar.gz # cp convoy/convoy convoy/convoy-pdata_tools /usr/local/bin/ # mkdir -p /etc/docker/plugins/ # bash -c 'echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec' ***Convoyが利用するボリュームとメタボリュームの作成と設定 [#kb656665] # truncate -s 100G data.vol # truncate -s 1G metadata.vol # losetup /dev/loop5 data.vol # losetup /dev/loop6 metadata.vol -truncate コマンドで [[Sparse File:http://hogem.hatenablog.com/entry/20110215/1298047477]] を作成。Sparse File は見かけ上は指定したサイズのものだが、ディスク消費量は実使用量になる。 -losetup コマンドで [[ループデバイス:http://blog.amedama.jp/entry/2015/09/22/002201]] を登録 ***Convoyのデーモンを起動 [#r33d239f] # convoy daemon --drivers devicemapper --driver-opts dm.datadev=/dev/loop5 --driver-opts dm.metadatadev=/dev/loop6 & *コンテナオーケストレーションツール [#ca3db3d6] -クラスタ構成を自動的に維持してくれる -[[KubernetesとMesos:Dockerのスケジューリングツールの違いを理解する:https://thinkit.co.jp/story/2015/04/10/5855]] **Kubernetes [#e213f584] -[[kubernetesによるDockerコンテナ管理入門:http://knowledge.sakura.ad.jp/tech/3681/]] -[[Kubernetesの主な機能一覧 (v1.5時点):http://qiita.com/tkusumi/items/e37fca3084050ccc74d1]] -[[minikubeでKubernetesのチュートリアルをやってみた:https://hnakamur.github.io/blog/2016/12/31/tried-kubernetes-tutorial-with-minikube/]] -kubernetesが提供する機能 --関連するコンテナのグルーピング --コンテナに割り振られるIPアドレスの管理 --コンテナ間のネットワークルーティング管理 --複数のコンテナを利用した負荷分散 --コンテナに割り当てるストレージの管理 --コンテナの監視 **Mesos [#b2a93329] *Moby [#t45d4b1e] -[[「Moby」ベースとなったオープンソース版Dockerの最新状況:https://knowledge.sakura.ad.jp/11068/]] *Tips [#oc5089e1] -[[dockerのコンテナに固定IPを振る:https://qiita.com/reflet/items/e10442c16834a9ce15b3]]