본문 바로가기

Micro Service Architecture/Docker

8. [docker] swarm : service create

반응형

1. Nginx Service 올려보기

## Nginx 이미지를 이용하여 서비스 생성
## 80포트를 연결하고 이름을 nginx_test로 생성
[root@docker1 bin]# docker service create -p 80:80 --name nginx_test nginx
lojirqir4tjvy370y2fpevrec
 
 
## 서비스 확인
## 서비스가 생성되었고 REPLICAS 항목이 0/1로 현재 replica는 1개이고 active 0개 라는 의미
[root@docker1 bin]# docker service ls
ID            NAME        MODE        REPLICAS  IMAGE
lojirqir4tjv  nginx_test  replicated  0/1       nginx:latest
 
 
## 이미지확인
## 이미지가 없으며 아직 pull 받고 있는 중이다.
[root@docker1 bin]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
 
 
## 시간이 지나면 아래와 같이 이미지가 보이며 서비스도 올라간다
[root@docker1 bin]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/nginx     <none>              8cf1bfb43ff5        8 days ago          132 MB
 
## 서비스 확인
## REPLICAS 항목이 0/1 -> 1/1 로 변경
[root@docker1 bin]# docker service ls
ID            NAME        MODE        REPLICAS  IMAGE
lojirqir4tjv  nginx_test  replicated  1/1       nginx:latest
 
## 서비스 컨테이너 확인
[root@docker1 bin]# docker service ps nginx_test
ID            NAME          IMAGE         NODE     DESIRED STATE  CURRENT STATE           ERROR  PORTS
znombp0f4jt4  nginx_test.1  nginx:latest  docker1  Running        Running 34 seconds ago        
 
 
## 컨테이너 확인
[root@docker1 bin]# docker ps
CONTAINER ID        IMAGE                                                                           COMMAND                  CREATED             STATUS              PORTS        NAMES
639fbc9f521a        nginx@sha256:0e188877aa60537d1a1c6484b8c3929cfe09988145327ee47e8e91ddf6f76f5c   "/docker-entrypoin..."   41 seconds ago      Up 38 seconds       80/tcp       nginx_test.1.znombp0f4jt4lqn9mv2av4we5
 
## docker2에서 확인
## 구동 중인 컨테이너 없음.
[root@docker2 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
 
 
## 서비스 목록에는 나타남
[root@docker2 ~]# docker service ls
ID            NAME        MODE        REPLICAS  IMAGE
lojirqir4tjv  nginx_test  replicated  1/1       nginx:latest
 
 
## 서비스 컨테이너에 docker1에서 구동중이라고 나타남.
[root@docker2 ~]# docker service ps nginx_test
ID            NAME          IMAGE         NODE     DESIRED STATE  CURRENT STATE          ERROR  PORTS
znombp0f4jt4  nginx_test.1  nginx:latest  docker1  Running        Running 7 minutes ago       
 
 
## 이미지 없음
[root@docker2 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

 

2. Overlay Network

## docker1의 Network 목록을 보면
## swarm으로 생성된 ingress overlay를 확인 할 수 있다.
[root@docker1 bin]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
96f05d3a943e        bridge              bridge              local
776df03d1724        docker_gwbridge     bridge              local
3daaa3fe6b88        host                host                local
niczy19plszi        ingress             overlay             swarm
d795e4a16e00        none                null                local
 
## service inspect 확인
## VirtualIPs 항목을 보면 ingress overlay network로 등록된 id 가 일치하며 ip주소가 할당 되어 있다.
[root@docker1 bin]# docker service inspect nginx_test
[
    -- 중략 --
            "Ports": [
                {
                    "Protocol": "tcp",
                    "TargetPort": 80,
                    "PublishedPort": 80,
                    "PublishMode": "ingress"
                }
            ],
            "VirtualIPs": [
                {
                    "NetworkID": "niczy19plszie048piggwmm65",
                    "Addr": "10.255.0.2/16"
                }
            ]
        },
        "UpdateStatus": {
            "StartedAt": "0001-01-01T00:00:00Z",
            "CompletedAt": "0001-01-01T00:00:00Z"
        }
    }
]
 
## 따라서 생성된 overlay 네트웍에 의해 VIP가 공유 되며 docker2:80, docker3:80으로 접속해도 docker1:80 VIP로 해당 패킷은 포워딩된다.

 

3. nginx 다른 이미지 생성 

## nginx 다른 이미지를 생성 하여 네트워크 등을 살펴봄
[root@docker1 bin]# docker service create -p 90:80 --name nginx_test2 nginx
pd2vwa4o8h5ub2t79jsz49353
 
 
## 아직 생성중
[root@docker1 bin]# docker service ls
ID            NAME         MODE        REPLICAS  IMAGE
lojirqir4tjv  nginx_test   replicated  1/1       nginx:latest
pd2vwa4o8h5u  nginx_test2  replicated  0/1       nginx:latest
 
## docker3에 할당 되었으며 준비중
## 생성은 docker1에서 replica 1개로 했지만 swarm 내 docker3 으로 task가 할당됨
[root@docker1 bin]# docker service ps nginx_test2
ID            NAME           IMAGE         NODE     DESIRED STATE  CURRENT STATE             ERROR  PORTS
ifb9ywlfmlmb  nginx_test2.1  nginx:latest  docker3  Running        Preparing 15 seconds ago        
 
 
 
## inspect 확인
[root@docker1 bin]# docker service inspect nginx_test2
[
-- 중략 --
            "Ports": [
                {
                    "Protocol": "tcp",
                    "TargetPort": 80,
                    "PublishedPort": 90,
                    "PublishMode": "ingress"
                }
            ],
            "VirtualIPs": [
                {
                    "NetworkID": "niczy19plszie048piggwmm65",
                    "Addr": "10.255.0.7/16"
                }
            ]
        },
        "UpdateStatus": {
            "StartedAt": "0001-01-01T00:00:00Z",
            "CompletedAt": "0001-01-01T00:00:00Z"
        }
    }
]
 
## nginx_test와 같은 ingress overlay 네트웍에 할당되어 swarm내 어느 노드에 접속해도 연결이 된다.

 

4. service scale 

## nginx_test, nginx_test2는 replica 1로 생성되어져 있는 것을 각각 2,3개로 scale out 함.
[root@docker1 bin]# docker service scale nginx_test=2
nginx_test scaled to 2
[root@docker1 bin]# docker service scale nginx_test2=3
nginx_test2 scaled to 3
 
 
## service 확인
[root@docker1 bin]# docker service ls
ID            NAME         MODE        REPLICAS  IMAGE
lojirqir4tjv  nginx_test   replicated  1/2       nginx:latest
pd2vwa4o8h5u  nginx_test2  replicated  2/3       nginx:latest
 
## service container 확인
## nginx_test는 docker1,2에 nginx_test2는 docker1,2,3에 할당됨.
[root@docker1 bin]# docker service ps nginx_test
ID            NAME          IMAGE         NODE     DESIRED STATE  CURRENT STATE             ERROR  PORTS
znombp0f4jt4  nginx_test.1  nginx:latest  docker1  Running        Running 26 minutes ago          
7je6gwr1hpiv  nginx_test.2  nginx:latest  docker2  Running        Preparing 26 seconds ago        
[root@docker1 bin]# docker service ps nginx_test2
ID            NAME           IMAGE         NODE     DESIRED STATE  CURRENT STATE             ERROR  PORTS
ifb9ywlfmlmb  nginx_test2.1  nginx:latest  docker3  Running        Running 10 minutes ago          
rc1xjza5ih0s  nginx_test2.2  nginx:latest  docker1  Running        Running 24 seconds ago          
wbioegg3k8br  nginx_test2.3  nginx:latest  docker2  Running        Preparing 24 seconds ago        
 
 
 
## 3개의 Node에 3개의 scale이 아닌 10개의 scale로 했을경우 3:3:4 정도의 비율로 컨테이너 분배 될것이다.
## 이때 nginx의 경우 80포트를 사용하는데 1개의 노드에 3~4개의 컨테이너가 같이 80포트를 사용하게 되면 문제가 발생되지 않을까?
## 개념이 다른것이 10개의 컨테이너에 트래픽이 밸런싱되므로 동일 포트는 의미가 없다.
반응형