docker-swarmのボリュームをどのように設定すればよいですか

docker-swarmのボリュームをどのように設定すればよいですか

マルチノード用に 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-swarmvolumesこのようには機能せず、サービスは起動しません。

(なるほど…ノードがたくさんあるかもしれないので、それは理解できます。)

いくつか変更を加えるべきだと思います。

グーグルで調べてみたら、このような設定があることがわかりました。

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 ソリューションとボリューム マウントを使用してこれを行うこともできますが、ファイルのロックと高いレイテンシに対処する必要があることに注意してください。

関連情報