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한 가지 질문이 있습니다.

이렇게 로컬 드라이브를 마운트했습니다.

  - ./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의 명령에 포함된 해당 소스 코드로 빌드되어야 합니다.

따라서 작성 파일에 대한 변경 사항은 바람직하게는 버전이 지정된 태그를 사용하여 자신의 저장소를 가리키는 이미지 이름을 추가하는 것입니다. 그런 다음 각 이미지에는 Dockerfile이 있으며 스택을 배포하기 전에 빌드되어 레지스트리에 푸시됩니다.

Swarm 모드에서는 컨테이너_이름, 종속_온 및 빌드가 유효하지 않습니다. 하드코딩된 컨테이너 이름에 대한 모든 종속성을 제거해야 합니다(DNS 기반 검색에는 서비스 이름 사용). 종속성은 최대 제한까지 일종의 지수 백오프를 사용하여 연결 테스트를 통해 애플리케이션에서 이상적으로 처리되거나 wait-for-it.sh애플리케이션을 시작하기 전에 종속성을 사용할 수 있는지 확인하기 위해 진입점에 스크립트와 같은 항목을 추가하여 이상적으로 처리되어야 합니다. 빌드는 일반적으로 작성 파일에서 CI/CD 시스템으로 이동됩니다. 그런 다음 작성 파일은 해당 CI/CD 도구에서 현재 태그 이름을 변수로 받습니다.

영구 데이터의 경우 볼륨을 사용하지만 컨테이너가 노드 간에 마이그레이션될 때 데이터가 지속되도록 하려면 해당 볼륨이 기본 로컬 파일 시스템이 아닌 NFS와 같은 네트워크 파일 시스템에 있어야 합니다. 이에 대한 예는 다음과 같습니다.내 대답은 여기.

스웜 클러스터의 컨테이너 간에 데이터를 공유하는 경우 이상적으로는 네트워크 API(예: 모든 REST 기반 마이크로서비스)를 사용하여 수행됩니다. 또한 이를 스웜 외부에서 실행되거나 컨테이너 환경용으로 설계된 데이터베이스로 외부화할 수도 있습니다(CNCF에는 일부가 있음). 동일한 NFS 솔루션과 볼륨 마운트를 사용하여 이 작업을 수행할 수 있지만 파일 잠금 및 더 높은 대기 시간을 처리해야 할 수도 있습니다.

관련 정보