Docker

[Docker] Swarm / DinD 실습 - registry 컨테이너

nang. 2020. 3. 30. 00:01
반응형
SMALL

순서대로 따라하기

12.3 Docker Swarm 구성

  • 우리는 도커 위의 도커(컨테이너) 5개를 올릴 것이다! (Doker in Doker 안의 컨테이너들)

    docker_image_2

    • registry
    • manager
    • worker01
    • worker02
    • worker03

12.3.1 registry 컨테이너

  • 도커 레지스트리 역할의 컨테이너

  • manager / worker 컨테이너가 사용하는 컨테이너

  • registry:latest 이미지 이용

  • 이걸 왜 사용하지?

    docker_image

    • 따라서 외부 도커에 저장된 이미지를 먼저 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개 모두 잘 떠있음
매니저
$ 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

$ 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