マルチノード用に docker-compose を docker-swarm に移行する予定です。
docker-compose
私は以下のように使用しました
version: '3'
services:
python:
container_name: python
build: ./python
command: uwsgi --socket :8001 --module myapp.wsgi --py-autoreload 1 --logto /tmp/mylog.log
volumes:
- ./src:/code
- ./src/static:/static
ports:
- "8082:8082"
expose:
- "8001"
nginx:
image: nginx:1.13
container_name: nginx
ports:
- "8000:8000"
volumes:
- ./nginx/conf:/etc/nginx/conf.d
- ./nginx/uwsgi_params:/etc/nginx/uwsgi_params
- ./static:/static
depends_on:
- python
Django ホストではうまく動作します。
そして今は を使おうとしていますdocker-swarm
。
docker-compose
見た目はdocker-swarm
似ていますが、疑問が1つあります。
ローカルドライブをこのようにマウントしました
- ./src:/code
- ./src/static:/static
or here
- ./nginx/conf:/etc/nginx/conf.d
- ./nginx/uwsgi_params:/etc/nginx/uwsgi_params
- ./static:/static
ただし、 ではdocker-swarm
、volumes
このようには機能せず、サービスは起動しません。
(なるほど…ノードがたくさんあるかもしれないので、それは理解できます。)
いくつか変更を加えるべきだと思います。
グーグルで調べてみたら、このような設定があることがわかりました。
services:
python:
volumes:
- src:/code
volumes:
src:
driver: local
しかし、これをどのように使用すればいいのか分かりません...
ソースコードや設定ファイルはどこに置けばいいのでしょうか?
docker-swarm のよく使用されるファイルのベストプラクティスは何ですか?
答え1
スウォーム モードで複数のノードにイメージをデプロイする場合、ソース コードはイメージ内にあり、そのイメージはレジストリにプッシュされる必要があります。ソース コードをボリュームとしてマウントすることは、開発プロセスを高速化する方法ですが、COPY
ボリューム マウントなしで使用できるように、テスト対象のイメージは、Dockerfile 内のコマンドでそのソース コードを含めてビルドする必要があります。
したがって、compose ファイルへの変更は、独自のリポジトリを指すイメージ名を追加することです (バージョン タグを使用することをお勧めします)。その後、各イメージに Dockerfile が作成され、スタックを展開する前にビルドされてレジストリにプッシュされます。
container_name、depends_on、build は swarm モードでは無効であることに注意してください。ハードコードされたコンテナー名への依存関係をすべて削除する必要があります (DNS ベースの検出にはサービス名を使用します)。依存関係は、アプリケーションによって、最大限度までの何らかの指数バックオフによる接続テストを行うか、wait-for-it.sh
エントリポイントにスクリプトなどを追加して、アプリケーションを起動する前に依存関係が利用可能であることを確認することで理想的に処理する必要があります。ビルドは通常、compose ファイルから CI/CD システムに移動されます。その後、compose ファイルは、その CI/CD ツールから現在のタグ名を変数として受け取ります。
永続的なデータにはボリュームを使用しますが、コンテナがノード間で移行するときにデータを永続化したい場合は、そのボリュームはデフォルトのローカルファイルシステムではなく、NFSなどのネットワークファイルシステム上に配置する必要があります。この例を以下に示します。私の答えはここにあります。
Swarm クラスター内のコンテナー間でデータを共有するには、理想的にはネットワーク API (すべての REST ベースのマイクロサービスなど) を使用します。また、Swarm の外部で実行されているデータベース、またはコンテナー環境用に設計されたデータベース (CNCF のランドスケープにいくつかあります) にデータを外部化することもできます。同じ NFS ソリューションとボリューム マウントを使用してこれを行うこともできますが、ファイルのロックと高いレイテンシに対処する必要があることに注意してください。