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
- Docker swarm(스웜 클래식) vs Swarm Mode(대세)
- 스웜 클래식
- zookeeper, etcd와 같은 별도의 분산 코디네이터를 두고 이를 통해 노드, 컨테이너 들의 정보를 관리한다. 또한 컨테이너의 정보를 확인하기 위하여 각 노드에 agent를 두고 이를 통해 통신하게 된다.
- 스웜 모드
- manager 자체에 분산 코디네이터가 내장되어 있어 추가 설치 패키지등이 없다. 일반적으로 이야기하는 스웜 클러스터는 스웜 모드를 지칭한다.
- 롤링업데이트
- 동작중인 컨테이너를 새로운 컨테이너로 업데이트할 수 있다.
- 컨테이너 내부의 내용을 바꾸는 것이 아니라, 기존 컨테이너는 중지되고 새로운 컨테이너로 대체되는 것이다.
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
:
- compose 파일이나 Dockerfile에서 변수 지정(-e MYSQL_DATABASE...)을 한 적이 있다. 해당 내용은 민감한 정보를 포함하고 있음에도 이미지에서 해당 내용을 직접 볼 수 있다는 단점이 있다.
- 모든 사용자별로 별도의 환경변수, index.html, DB password를 다르게 하고 싶다면 그때마다 별도의 이미지를 만들어야 하는 불편함이 있다. 이 경우 사용자별로 별도의 config, secret을 사용하면 추가 이미지를 생성하는 작업 없이 패스워드나 변수 전달이 가능해진다.
- config: 변수, 파일
- secret: password, key
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
컨테이너에서는 보인다.
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
사용자 정의 네트워크: 전 클러스터에 걸쳐있는 오버레이 네트워크 생성하기