반응형
SMALL
순서대로 따라하기
12.3 Docker Swarm 구성
우리는 도커 위의 도커(컨테이너) 5개를 올릴 것이다! (Doker in Doker 안의 컨테이너들)
- registry
- manager
- worker01
- worker02
- worker03
12.3.1 registry 컨테이너
도커 레지스트리 역할의 컨테이너
manager / worker 컨테이너가 사용하는 컨테이너
registry:latest
이미지 이용이걸 왜 사용하지?
- 따라서 외부 도커에 저장된 이미지를 먼저 registry 컨테이너에 등록했다가 registry에서 manager 및 worker 컨테이너로 이미지를 받아가게 하기 위함
- 즉, dind 끼리는 파일시스템 통해 파일 이동이 쉽다는 뜻
- 임시 저장소
- registry의 데이터를 호스트에 마운트하여 사용
- 데이터의 persistency(지속성)을 위하여
- 실무에서는 허브나 별도로 구축한 레지스트리 사용
12.3.2 manager 컨테이너
- 스웜 클러스터 전체를 제어하는 역할
docker:19.03.5-dind
이미지 이용
12.3.3 worker 컨테이너
- 추가 작업 컨테이너
docker:19.03.5-dind
이미지 이용
12.4 Docker Swarm 구축해보기
1. 허브에서 도커 이미지 받아오기
$ docker pull docker:10.03.5-dind
2. docker-compose.yml
만들기
- swarm 폴더를 만들고 그 안에
docker-compose.yml
파일 만들기
version: "3"
services:
registry:
container_name: registry
image: registry:latest
ports:
- 5000:5000
volumes:
- "./registry-data:/var/lib/registry"
manager:
container_name: manager
image: docker:19.03.5-dind
privileged: true
tty: true
ports:
- 8000:80
- 9000:9000
depends_on:
- registry
expose:
- 3375
command: "--insecure-registry registry:5000"
volumes:
- "./stack:/stack"
worker01:
container_name: worker01
image: docker:19.03.5-dind
privileged: true
tty: true
depends_on:
- manager
- registry
expose:
- 7946
- 7946/udp
- 4789/udp
command: "--insecure-registry registry:5000"
worker02:
container_name: worker02
image: docker:19.03.5-dind
privileged: true
tty: true
depends_on:
- manager
- registry
expose:
- 7946
- 7946/udp
- 4789/udp
command: "--insecure-registry registry:5000"
worker03:
container_name: worker03
image: docker:19.03.5-dind
privileged: true
tty: true
depends_on:
- manager
- registry
expose:
- 7946
- 7946/udp
- 4789/udp
command: "--insecure-registry registry:5000"
- depends_on
- 모두 registry에 의존
- command
--insecure-registry registry:5000
- 보통 레지스트리에는 HTTPS로 접근하는데 여기서는 HTTP를 이용하기때문에 레지스트리 접근을 위해 커맨드를 추가적으로 써주어 HTTP로도 이미지 받을 수 있게해줌
- volume
./stack:/stack
- <호스트폴더>:<컨테이너폴더>
- 호스트(윈도우)에서 현재 위치에
stack
폴더가 존재한다면 이 폴더랑 컨테이너 안의stack
폴더랑 마운트 시키겠다는 코드
- 호스트(윈도우)에서 현재 위치에
- <호스트폴더>:<컨테이너폴더>
- expose
- 외부로 나갈 포트
3. 컴포즈 실행하기
- 5대의 dind 컨테이너가 실행만 된 상태
$ docker-compose up
## 로그창으로 변함
4. IP 주소 조사하기
- worker 3대의 dind 컨테이너에 접속하여 각각의 IP 주소를 조사해놓기
- 해당 컨테이너를 실행하여 접속 후 거기서 IP 주소 조사해야 함
swarm 폴더에서
$ docker exec -it 6648afd159f7 sh
> hostname -i
172.24.0.3
- 위의 방법 말고 이름 사용 가능
Dockerfile
에서 container_name (서비스 아래 항목 이름들)을 달아놨기 때문에 ID가 아닌 그 이름을 써줘도 접속 가능
$ docker exec -it worker01 sh
> hostname -i
172.24.0.3
- 커맨드 한줄로 처리하기
$ docker exec -it worker01 hostname -i
172.24.0.3
5. swarm 설정하기
5.1 manager에게 클러스터 관리 역할 부여하기 (스웜 설정)
manager 컨테이너 실행하여 접속 후 명령어 실행
- 명령어 실행 후 나오는 커맨드 복사해놓기
매니저 $ docker swarm init ## 현재 컨테이너(호스트)가 스웜 리더가 될겁니다 라는 뜻 docker swarm join --token SWMTKN-1-4ohdajqs183g1700suw6ph08td7r1ivpf23dki6kst10ig0vji-2kkbf8gy8vhexmj90izyy28ii 172.26.0.3:2377 ## 복사
** ERROR 발생!
$ docker exec -it manager docker swarm init Error response from daemon: could not find the system's IP address - specify one with --advertise-addr
- 컴포즈 동기화가 안된 문제!
- 컴포즈 down 후 다시 up
- init 재시도
5.2 스웜 상태 확인
Leader
가 매니저이고 스웜 클러스터 관리자라는 뜻
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY
7lrnq4tipy2ptcetaueii3syc * bbba929897c1 Ready Active Leader 19.03.5
5.3 클러스터 형성
manager에 여러 대의 worker 컨테이너 등록하여 클러스터 형성
- 각 woker 컨테이너 실행하여 접속
$ docker exec -it worker01 sh >
5.1
에서 복사해놓은 join token 을 커맨드에 입력해준다.- worker01~03 같은 작업 해주기
> docker swarm join --token SWMTKN-1-4ohdajqs183g1700suw6ph08td7r1ivpf23dki6kst10ig0vji-2kkbf8gy8vhexmj90izyy28ii 172.26.0.3:2377 This node joined a swarm as a worker. ## 등록 완료
5.4 스웜 상태 확인
- manager 컨테이너에서 스웜 클러스터 확인
- worker 추가된 것 확인(스웜 클러스터가 잘 형성됐는지 확인)
- 4개 모두 잘 떠있음
- worker 추가된 것 확인(스웜 클러스터가 잘 형성됐는지 확인)
매니저
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ud9dt4nzyeuzslrdweujejg6i 5c08b11c6f88 Ready Active 19.03.5
fhzcfzl14zrweyp8yydv8ubn7 aed40f88b205 Ready Active 19.03.5
7lrnq4tipy2ptcetaueii3syc * bbba929897c1 Ready Active Leader 19.03.5
ws16rujl1lfy1ftqljohdad2x e1c9cc908e2c Ready Active 19.03.5
6. swarm 삭제하는 방법
- 스웜 삭제
매니저
$ docker swarm leave --force
Node left the swarm.
- 다시 스웜 설정하려면?
- 매니저에 등록했던 worker 들도 해당 컨테이너로 가서 스웜 설정했던 것 일단 다 삭제해줘야 함
- 그러고나서 다시
5
번 과정 진행
7. 도커 registry
에 이미지 등록하기
- 외부 도커에서 빌드한 이미지는 레지스트리를 통해서만 안쪽 도커에서 사용할 수 있기에 이 과정이 필요
현재 외부 도커(제일 바깥 도커)에 가지고 있는 이미지 중 하나로 테스트 함
7.1 접근 태그 붙이기
윈도우
$ docker tag registry:latest localhost:5000/registry:latest
registry:latest
이미지에localhost:5000/registry:latest
라는 태그를 붙임localhost:5000/
- 이미지를 등록하거나 내려받는 레지스트리를 의미
- 호스트에서
localhost:5000
로 접근 가능
7.2 push 하기 (이미지 올리기)
registry
컨테이너를 만들 때 포트를 5000 이라고 지정해줬으므로 이 과정을 통해registry
컨테이너에 이미지가 올라가는 것
$ docker push localhost:5000/registry:latest
7.3 웹브라우저에서 확인하기
- 웹브라우저로
localhost:5000
- 우리가 올린 이미지가 보임
{"repositories":["registry"]}
8. 도커 registry
에서 이미지 다운받아보기
- manager / worker 아무데서나 들어가서
$ docker images
$ docker pull localhost:5000/registry:latest
Error response from daemon: Get http://localhost:5000/v2/: dial tcp 127.0.0.1:5000: connect: connection refused
** ERROR 발생!
localhost 연결 불가능!
- localhost:5000 은 윈도우 입장에서 localhost 지만 현재 dind 컨테이너에 들어가있으니까 dind 입장에서 localhost는 컨테이너 자신을 의미
- 자기 자신은 포트포워딩 안되어있기 때문에 연결 불가능
** 해결 방법!
dind 끼리 통신하자!
- registry의 IP를 사용하거나 이름을 사용해야 함
registry:5000
$ docker pull registry:5000/registry:latest
- registry의 IP를 사용하거나 이름을 사용해야 함
$ docker pull registry:5000/registry:latest
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry:5000/registry latest f32a97de94e1 10 months ago 25.8MB
## 성공적으로 받아온다.
반응형
LIST
'Docker' 카테고리의 다른 글
[Docker] 스택(stack) 이용하기 (0) | 2020.04.03 |
---|---|
[Docker] Swarm 서비스 실습 (서비스 관련 명령어) (0) | 2020.03.31 |
[Docker] 스웜이란? (What is Docker Swarm?) / 도커 인 도커 (DinD) (0) | 2020.03.29 |
[Docker] 도커 네트워크 종류 (0) | 2020.03.28 |
[Docker] MongoDB 설치하기 (0) | 2020.03.27 |