클래식 LAPP 스택의 구성원인 하나의 PHP-FPM 컨테이너(7.2)는 다음과 함께 실행될 때 포트 9000을 올바르게 노출합니다.docker-compose
하지만 Docker Swarm이 시작하면 아무것도 없습니다.. 컨테이너가 실행 중이라고 언급해야 하며(아래 출력 참조) 컨테이너에서 TTY bash를 시작할 수 있습니다.
따라서 docker-compose
웹 애플리케이션은 완벽하게 작동하지만 Swarm을 사용하면 Apache는 503 Service Unavailable을 발행합니다. 다른 엔진을 사용한 테스트 간에는 아무 것도 변경되지 않습니다. 이 동작에 대한 단서가 있습니까?
docker-compose.yml
version: '3.5'
services:
postgres:
env_file: ./.env
image: "postgres:9.5.24"
volumes:
- database:/var/lib/postgresql/data
networks:
- internal
adminer:
image: adminer
networks:
- internal
- traefik-public
deploy:
labels:
- "traefik.enable=true"
- "traefik.http.routers.adminer.rule=Host(`adminer.example.com`)"
- "traefik.http.routers.adminer.entrypoints=websecure"
- "traefik.http.routers.adminer.tls.certresolver=letsencryptresolver"
- "traefik.http.services.adminer.loadbalancer.server.port=8080"
- "traefik.port=80"
apache:
env_file: ./.env
image: visio_rdv_apache:latest
build:
context: docker/images/apache2.4
dockerfile: Dockerfile
args:
UID: ${HOST_UID}
ROOT_URL: ${ROOT_URL}
ports:
- 8000:80
environment:
FPM_HOST: php:9000
ROOT_URL: ${ROOT_URL}
volumes:
- ${LOGS_DIR}/apache/:/var/log/httpd/
- ${RELATIVE_APP_PATH}:/var/www/html
links:
- postgres
- php
networks:
- internal
- traefik-public
deploy:
labels:
- "traefik.enable=true"
- "traefik.http.routers.visio_rdv.rule=Host(`test.example.com`)"
- "traefik.http.routers.visio_rdv.entrypoints=websecure"
- "traefik.http.routers.visio_rdv.tls.certresolver=letsencryptresolver"
- "traefik.http.services.visio_rdv.loadbalancer.server.port=80"
- "traefik.port=80"
php:
env_file: .env
links:
- ftp
image: visio_rdv_php:latest
build:
context: docker/images/php
dockerfile: Dockerfile
args:
UID: ${HOST_UID}
TIMEZONE: ${TIMEZONE}
PROXY: ${http_proxy}
volumes:
- ftp_data:/var/www/ftp:rw
- ${RELATIVE_APP_PATH}:/var/www/html
networks:
- internal
ftp:
env_file: .env
image: "fauria/vsftpd:latest"
ports:
- "9520:20"
- "9521:21"
- "21100-21110:21100-21110"
environment:
FTP_USER: ${FTP_USER}
FTP_PASS: ${FTP_PASS}
PASV_MIN_PORT: 21100
PASV_MAX_PORT: 21100
volumes:
- ftp_data:/home/vsftpd/${AUTOMATION_CLIENT_NAME}:rw
networks:
- internal
volumes:
ftp_data:
database:
networks:
traefik-public:
external: true
internal:
external: false
도커 스웜(Docker Swarm)과 함께
아파치 로그:
[Wed Aug 04 07:35:16.382246 2021] [proxy:error] [pid 11] (111)Connection refused: AH00957: FCGI: attempt to connect to 10.0.4.93:9000 (*) failed
[Wed Aug 04 07:35:16.382314 2021] [proxy_fcgi:error] [pid 11] [client 10.0.0.2:1035] AH01079: failed to make connection to backend: php, referer: http://test.example.com/
스웜 서비스 목록:
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
um2txtpz8534 traefik_reverse-proxy replicated 1/1 traefik:v2.4
ahf7uukapxbr my_stack_adminer replicated 1/1 adminer:latest
ue8qekmg0ff0 my_stack_apache replicated 1/1 my_stack_apache:latest my_stack*:8000->80/tcp
x9igaslhsx11 my_stack_ftp replicated 1/1 fauria/vsftpd:latest *:9520-9521->20-21/tcp, *:21100-21110->21100-21110/tcp
jpk4qzqs1tfx my_stack_php replicated 1/1 my_stack_php:latest
ih67rh82vp9e my_stack_postgres replicated 1/1 postgres:9.5.24
.net-tools
nc
동일한 결과로 php
컨테이너 인스턴스 IP는 올바르게 확인되지만 포트 9000에 대한 모든 TCP 연결은 거부됩니다.
나는 많은 환경 변수를 사용하고 Swarm에서 누락된 기능을 완화하기 위해 docker-compose config
명령 출력을 사용하여 전체 파일을 생성합니다 docker-compose.yml
.
와 함께docker-compose
Name Command State Ports
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
my_stack_adminer_1 entrypoint.sh docker-php-e ... Up 8080/tcp
my_stack_apache_1 /bin/sh -c apachectl -D FO ... Up 0.0.0.0:8000->80/tcp
my_stack_ftp_1 /usr/sbin/run-vsftpd.sh Up 0.0.0.0:9520->20/tcp, 0.0.0.0:9521->21/tcp, 0.0.0.0:21100->21100/tcp, 0.0.0.0:21101->21101/tcp, 0.0.0.0:21102->21102/tcp,
0.0.0.0:21103->21103/tcp, 0.0.0.0:21104->21104/tcp, 0.0.0.0:21105->21105/tcp, 0.0.0.0:21106->21106/tcp, 0.0.0.0:21107->21107/tcp,
0.0.0.0:21108->21108/tcp, 0.0.0.0:21109->21109/tcp, 0.0.0.0:21110->21110/tcp
my_stack_php_1 php-fpm -R -F Up 9000/tcp
my_stack_postgres_1 docker-entrypoint.sh postgres Up 5432/tcp
답변1
- 빌드는 어떻게 만드셨나요?
Swarm은 docker-compose와 다릅니다.배포는 배포다" - 그리고빌드가 아님! (이미지를 배포하기 전에 이미지를 빌드해야 하며 (아마도 사용 가능한) 작성 이미지가 요구 사항을 충족하지 못할 수도 있습니다...)
와 함께:
docker stack deploy -c your-compose-style-code.yml <name-of-your-swarm>
선택한 떼에 기존 이미지를 배포하고 있습니다(이전에 docker-compose를 통해 구축한 이미지를 사용할 가능성이 높습니다...
... swarm의 또 다른 주제는 네트워킹입니다. 구성에서 수행하는 방식으로 "네임스페이스"의 선택된 서비스를 연결하려면 네트워킹 범위(클러스터 또는 swarm 전체 오버레이 또는 "내부" 네트워크의 범위)를 알아야 합니다. ...)
... 그리고 물론 상태 저장 부분(데이터베이스, 사용자가 업로드할 수 있는 파일)의 볼륨은 다른 방식으로 관리해야 합니다(NFS에서 glusterFS, Galera, linbit/LINSTOR... 또는 CockroachDB). 예를 들어 ...), 오케스트라의 상태 비저장 부분의 컨테이너가 이제 다양한 노드에 배포되기 때문입니다.
- 때로는 떼에 "포테이너"를 추가하는 것이 좋은 생각입니다. https://www.portainer.io/solutions/docker...