
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/DockerfileFrom httpd ADD index.html /usr/local/apache2/htdocs/index.html CMD htppd -D FOREGROUNDcat blue/Dockerfile > green/Dockerfilerapa@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: 1573blue도 같은 작업 실행
업데이트를 하게 되면 기존에 동작하고 있던 컨테이너는 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.7rapa@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
사용자 정의 네트워크: 전 클러스터에 걸쳐있는 오버레이 네트워크 생성하기