[Docker] Swarm Mode 클러스터 구성2 - 컨테이너 배포, config, secret 설정

Hoon·2022년 8월 25일
0

Docker

목록 보기
10/13
post-thumbnail
  • docker service create --name web --constraint node.role!=manager --replicas 3 -p 80:80 nginx
  • replicas 3: 최소 컨테이너 3개 이상
    • docker container rm -f로 worker에서 컨테이너를 삭제해도 다시 만들어서 세 개를 유지한다.
    • 확인
  • Global로 Nginx 배포
  • docker service create --name web --constraint node.role!=manager --mode global -p 80:80 nginx

swarm은 두 가지 모드가 있다.

  • Docker swarm(스웜 클래식) vs Swarm Mode(대세)
  • 스웜 클래식
    • zookeeper, etcd와 같은 별도의 분산 코디네이터를 두고 이를 통해 노드, 컨테이너 들의 정보를 관리한다. 또한 컨테이너의 정보를 확인하기 위하여 각 노드에 agent를 두고 이를 통해 통신하게 된다.
  • 스웜 모드
    • manager 자체에 분산 코디네이터가 내장되어 있어 추가 설치 패키지등이 없다. 일반적으로 이야기하는 스웜 클러스터는 스웜 모드를 지칭한다.
  • 롤링업데이트
    • 동작중인 컨테이너를 새로운 컨테이너로 업데이트할 수 있다.
    • 컨테이너 내부의 내용을 바꾸는 것이 아니라, 기존 컨테이너는 중지되고 새로운 컨테이너로 대체되는 것이다.

Simple Quiz)

docker hub의 저장소로 들어가서
repository name: myweb, tag: blue, green 생성
Answer)
Docker hub 저장소로 들어가서 myweb repository 생성

mkdir blue green
touch blue/index.html green/index.html
echo "<h2>BLUE PAGE</h2>" > blue/index.html
echo "<h2>GREEN PAGE</h2>" > green/index.html

vi blue/Dockerfile

From httpd
ADD index.html /usr/local/apache2/htdocs/index.html
CMD htppd -D FOREGROUND
cat blue/Dockerfile > green/Dockerfile
rapa@manager:~/0824/green$ docker build -t hyunshoon/myweb:green .
Sending build context to Docker daemon  3.072kB
Step 1/3 : From httpd
 ---> f2a976f932ec
Step 2/3 : ADD index.html /usr/local/apache2/htdocs/index.html
 ---> 938fff40f123
Step 3/3 : CMD htppd -D FOREGROUND
 ---> Running in 2de0e0a66548
Removing intermediate container 2de0e0a66548
 ---> de6b2beccd60
Successfully built de6b2beccd60
Successfully tagged hyunshoon/myweb:green
rapa@manager:~/0824/green$ docker push hyunshoon/myweb:green
The push refers to repository [docker.io/hyunshoon/myweb]
72f367f4323d: Pushed 
0c2dead5c030: Layer already exists 
54fa52c69e00: Layer already exists 
28a53545632f: Layer already exists 
eea65516ea3b: Layer already exists 
92a4e8a3140f: Layer already exists 
green: digest: sha256:3ab37f0e4c79e20a9f05c6c4f91dc82001e8724a71e3f1995b79f8e56bfc8451 size: 1573

blue도 같은 작업 실행

업데이트를 하게 되면 기존에 동작하고 있던 컨테이너는 down 상태가 되고 새로운 이미지로 생성한 컨테이너가 외부에 서비스를 제공하게 된다. 기존 컨테이너의 내용을 업데이트 하는
docker service create --name web --replicas 6 --update-delay 3s --update-parallelism 3 --constraint node.role==worker -p 80:80 dustndus8/myweb:blue: 1 task에 동시에 3개의 컨테이너를 업데이트하고 3초를 쉰 뒤 다음 테스트를 진행한다.
docker service rollback web:

config/secret

  • compose 파일이나 Dockerfile에서 변수 지정(-e MYSQL_DATABASE...)을 한 적이 있다. 해당 내용은 민감한 정보를 포함하고 있음에도 이미지에서 해당 내용을 직접 볼 수 있다는 단점이 있다.
  • 모든 사용자별로 별도의 환경변수, index.html, DB password를 다르게 하고 싶다면 그때마다 별도의 이미지를 만들어야 하는 불편함이 있다. 이 경우 사용자별로 별도의 config, secret을 사용하면 추가 이미지를 생성하는 작업 없이 패스워드나 변수 전달이 가능해진다.
  • config: 변수, 파일
  • secret: password, key

secret 생성하기

echo "test123" | docker secret create mysql_password - echo 값을 - 뒤에 삽입
docker service create --name sql --secret source=mysql_password,target=mysql_root_password --secret source=mysql_password,target=mysql_password -e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/mysql_root_password" -e MYSQL_PASSWORD_FILE="/run/secrets/mysql_password" -e MYSQL_DATABASE="testdb" mysql:5.7

rapa@manager:~/0824$ docker container ls --all
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                 NAMES
c977960afae5   mysql:5.7   "docker-entrypoint.s…"   25 minutes ago   Up 25 minutes   3306/tcp, 33060/tcp   sql.1.p3ahxia43fnjih2u6vy50fyb0
rapa@manager:~/0824$ docker container exec c977960afae5 ls /run/secrets/
mysql_password
mysql_root_password
rapa@manager:~/0824$ docker container exec c977960afae5 cat /run/secrets/mysql_password
test123
rapa@manager:~/0824$ docker container exec c977960afae5 cat /run/secrets/mysql_root_password
test123

컨테이너에서는 보인다.

config 사용하기

rapa@manager:~/0824$ echo "hello world" > index.html
rapa@manager:~/0824$ docker config create webcfg index.html
b5r0n3i3d85dn78hq7whpumoq
rapa@manager:~/0824$ docker config inspect webcfg 
[
    {
        "ID": "b5r0n3i3d85dn78hq7whpumoq",
        "Version": {
            "Index": 10979
        },
        "CreatedAt": "2022-08-24T08:06:47.281845014Z",
        "UpdatedAt": "2022-08-24T08:06:47.281845014Z",
        "Spec": {
            "Name": "webcfg",
            "Labels": {},
            "Data": "aGVsbG8gd29ybGQK"
        }
    }
]
rapa@manager:~/0824$ echo aGVsbG8gd29ybGQK | base64 -d
hello world

docker service create --replicas 1 --constraint node.role==manager --name webcfg -p 8888:80 --config source=webcfg,target=/usr/share/nginx/html/index.html nginx

클러스터에서의 네트워크

  • docker_gwbridge bridge local
    • 각 호스트에서만 영향을 미친다
    • 스웜에서 오버레이 네트워크 사용
    • 외부로 나가는 통신 및 오버레이 네트워크 트래픽의 종단 점 역할
      ingress overlay swarm
    • 클러스터 전체에 하나의 네트워크로 동작한다.
    • 로드밸런싱과 라우팅 메시지에 사용되며 서비스 내의 컨테이너에 대한 접근을 라운드 로빈 방식으로 분산하는 로드밸런싱을 담당한다.
  • 스웜모드로 생성된 모든 서비스의 컨테이너가 외부로 노출되기 위해서는 무조건 ingress 네트워크를 사용해야 하는 것은 아니다. docker run -p를 사용해 외부에 노출했던 것 처럼 특정 포트를 사용하도록 설정 할 수도 있다.
    • 다음은 ingress를 사용하지 않고 호스트의 8888 포트를 직접 컨테이너의 80 포트에 연결하는 방식이다.
    • docker service create --publish mode=host,target=80,published=8080,protocol=tcp --name web nginx

사용자 정의 네트워크: 전 클러스터에 걸쳐있는 오버레이 네트워크 생성하기







0개의 댓글