docker-compose.yml 파일 내용은 다음과 같다.
version: "3.2"
services:
registry:
image: 'registry:latest'
ports:
- '5000:5000'
volumes:
- /var/lib/registry:/var/lib/registry
- ./.htpasswd:/etc/docker/registry/.htpasswd
environment:
REGISTRY_AUTH: 'htpasswd'
REGISTRY_AUTH_HTPASSWD_REALM: 'systemv'
REGISTRY_AUTH_HTPASSWD_PATH: '/etc/docker/registry/.htpasswd'
deploy:
restart_policy:
condition: any
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
update_config:
delay: 2s
portainer:
image: portainer/portainer
networks:
- frontend
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
deploy:
restart_policy:
condition: any
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
update_config:
delay: 2s
labels:
- "traefik.enable=true"
- "traefik.backend=portainer"
- "traefik.docker.network=frontend"
- "traefik.port=9000"
- "traefik.frontend.rule=PathPrefixStrip: /portainer"
loadbalancer:
image: traefik
command: --docker \
--docker.swarmmode \
--docker.watch \
--web
ports:
- 80:80
- 8080:8080
volumes:
- /var/run/docker.sock:/var/run/docker.sock
deploy:
restart_policy:
condition: any
mode: replicated
replicas: 1
update_config:
delay: 2s
placement:
constraints: [node.role == manager]
networks:
- frontend
networks:
frontend:
external:
name: frontend
volumes:
portainer_data:
위와같이 내용을 작성하고 YAML 파일로 저장한다. 저장한 파일 이름이 docker-frontend.yml 이라고 한다면 이것을 이용해서 다음과 같이 docker stack 을 deploy 한다.
$ docker stack deploy --compose-file=docker-frontend.yml dockerInfra
stack 이 생성 정상적으로 생성되면 3개의 Service가 생성된다. 각각 Traefik, Portainer, Registry 이며 Portainer 는 Traefik 에 URI Reverse 로 연결된다. Portainer 의 URL 은 http://<IP>/portainer 이다.
Registry 에 .htpasswd 파일은 다음과 같이 생성하면 된다.
docker run --entrypoint htpasswd registry:latest -Bbn admin 1234 > .htpasswd
위 내용은 Traefik 를 앞에 두고 뒤에 Portainer 를 /portainer URI 로 접속하도록 한다. registry 서비스는 Traefik 와 별도로 작동되도록 하였다.