Docker

Bu makalemizde docker service komutunu ve nasıl kullanılacağını örneklerle açıklayacağım. Bu konuda yeterli türkçe kaynak olmadığı için paylaşma gereği duydum. Konu ile ilgili daha ayrıntılı bilgi almak isterseniz https://docs.docker.com/engine/reference/commandline/service/ adresinizi ziyaret etmenizi öneririm.

docker service:

docker service create : Bu komutla yeni bir servis oluşturabilirsiniz. Örnek olarak bir nginx servisi oluşturalım:

docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
docker create volume-nginx
docker service create --name proxy \
-p 80:80 -p 443:443 \
--replicas=1 \
 --mount type=volume,source=volume-nginx,destination=/etc/nginx \
nginx:alpine 

Yukarıdaki komutla nginx servis olarak 1 replica olarak 80 ve 443 portundan /etc/nginx dizinini mount ederek başlayacaktır. service argumanları ile ilgili olarak https://docs.docker.com/engine/reference/commandline/service_create/ üzerinden detaylı bilgi alınabilir.

docker service update: Bu komutla çalışan bir servis üzerinde değişiklikler ve güncellemeler yapılabilir.

docker service update [OPTIONS] SERVICE

imaj güncelleme
docker service update --image jenkins:2.209 jenkins

environment ekleme(çalışacağı nodu belirledik)
docker service update --env-add  NODE_ID="{{.Node.ID}}"

Bu komut çok fazla argumanla yönetilme özelliğine sahiptir. network ekleme kaldırma, port ekleme kaldırma, volume ekleme kaldırma gibi bir çok özelliği yönetebilirsiniz. Bir kaç örnekle açıklamaya çalışalım.

#CPU limiti verelim
docker service update --limit-cpu 2 redis

#volume verip kaldıralım
$ docker service create \
    --name=myservice \
    --mount \
      type=volume,source=test-data,target=/somewhere \
    nginx:alpine \
    myservice

myservice

$ docker service update \
    --mount-add \
      type=volume,source=other-volume,target=/somewhere-else \
    myservice

myservice

$ docker service update --mount-rm /somewhere myservice

myservice

#port ekleyelim
$ docker service update \
  --publish-add published=8080,target=80 \
  myservice

#Network ekleyip kaldıralım.
$ docker service update \
  --network-rm my-network \
  --network-add name=my-network,alias=web1 \
  myservice

Konu ile ilgili olarak ayrıntılı bir arguman için resmi sitesi olan https://docs.docker.com/engine/reference/commandline/service_update/ adresindeki diğer argumanları kontrol edebilirsiniz.

docker service inspect: Bu komutla çalışan servis ile ilgili ayrıntılara ulaşılabilir. Örnek hangi node üzerinde çalışıyor hangi ip aldı veya volume olarak nereleri bağladı hangi network üzerinde gibi detayları bu komut ile görmek mümkün. Bir örnek yapalım.

docker service inspect [OPTIONS] SERVICE [SERVICE...]

docker service inspect jenkins

[
    {
        "ID": "2xwn80c74g687bd8fnzh8mhbz",
        "Version": {
            "Index": 657105
        },
        "CreatedAt": "2019-01-14T14:28:22.11872827Z",
        "UpdatedAt": "2019-12-19T14:11:23.218258356Z",
        "Spec": {
            "Name": "jenkins",
            "Labels": {},
            "TaskTemplate": {
                "ContainerSpec": {
                    "Image": "jenkins/jenkins:[email protected]:62023fd81d9ae4f9a53187134d60fa3aba81ac0e3f82c3d38702154732d6a03f",
                    "Env": [
                        "JENKINS_SLAVE_AGENT_PORT=50001"
                    ],
                    "Mounts": [
                        {
                            "Type": "volume",
                            "Source": "jenkins",
                            "Target": "/var/jenkins_home",
                            "VolumeOptions": {
                                "DriverConfig": {
                                    "Name": "local"
                                }
                            }
                        }
                    ],
                    "StopGracePeriod": 10000000000,
                    "DNSConfig": {},
                    "Isolation": "default"
                },
                "Resources": {
                    "Limits": {},
                    "Reservations": {}
                },
                "RestartPolicy": {
                    "Condition": "any",
                    "Delay": 5000000000,
                    "MaxAttempts": 0,
                    "Window": 0
                },
                "Placement": {
                    "Constraints": [
                        "node.role==manager"
                    ],
                    "Platforms": [
                        {
                            "Architecture": "amd64",
                            "OS": "linux"
                        }
                    ]
                },
                "ForceUpdate": 9,
                "Runtime": "container"
            },
            "Mode": {
                "Replicated": {
                    "Replicas": 1
                }
            },
            "UpdateConfig": {
                "Parallelism": 1,
                "FailureAction": "pause",
                "Monitor": 5000000000,
                "MaxFailureRatio": 0,
                "Order": "stop-first"
            },
            "RollbackConfig": {
                "Parallelism": 1,
                "FailureAction": "pause",
                "Monitor": 5000000000,
                "MaxFailureRatio": 0,
                "Order": "stop-first"
            },
            "EndpointSpec": {
                "Mode": "vip",
                "Ports": [
                    {
                        "Protocol": "tcp",
                        "TargetPort": 8080,
                        "PublishedPort": 4981,
                        "PublishMode": "ingress"
                    },
                    {
                        "Protocol": "tcp",
                        "TargetPort": 50001,
                        "PublishedPort": 50001,
                        "PublishMode": "ingress"
                    }
                ]
            }
        },
        "PreviousSpec": {
            "Name": "jenkins",
            "Labels": {},
            "TaskTemplate": {
                "ContainerSpec": {
                    "Image": "jenkins/jenkins:[email protected]:48384d6b22c2a544fb04251c0776e2071ca0c2c0c98f6c4189877b808509fc34",
                    "Env": [
                        "JENKINS_SLAVE_AGENT_PORT=50001"
                    ],
                    "Mounts": [
                        {
                            "Type": "volume",
                            "Source": "jenkins",
                            "Target": "/var/jenkins_home",
                            "VolumeOptions": {
                                "DriverConfig": {
                                    "Name": "local"
                                }
                            }
                        }
                    ],
                    "Isolation": "default"
                },
                "Resources": {
                    "Limits": {},
                    "Reservations": {}
                },
                "RestartPolicy": {
                    "Condition": "any",
                    "Delay": 5000000000,
                    "MaxAttempts": 0,
                    "Window": 0
                },
                "Placement": {
                    "Constraints": [
                        "node.role==manager"
                    ],
                    "Platforms": [
                        {
                            "Architecture": "amd64",
                            "OS": "linux"
                        }
                    ]
                },
                "ForceUpdate": 9,
                "Runtime": "container"
            },
            "Mode": {
                "Replicated": {
                    "Replicas": 1
                }
            },
            "UpdateConfig": {
                "Parallelism": 1,
                "FailureAction": "pause",
                "MaxFailureRatio": 0,
                "Order": "stop-first"
            },
            "EndpointSpec": {
                "Mode": "vip",
                "Ports": [
                    {
                        "Protocol": "tcp",
                        "TargetPort": 8080,
                        "PublishedPort": 4981,
                        "PublishMode": "ingress"
                    },
                    {
                        "Protocol": "tcp",
                        "TargetPort": 50001,
                        "PublishedPort": 50001,
                        "PublishMode": "ingress"
                    }
                ]
            }
        },
        "Endpoint": {
            "Spec": {
                "Mode": "vip",
                "Ports": [
                    {
                        "Protocol": "tcp",
                        "TargetPort": 8080,
                        "PublishedPort": 4981,
                        "PublishMode": "ingress"
                    },
                    {
                        "Protocol": "tcp",
                        "TargetPort": 50001,
                        "PublishedPort": 50001,
                        "PublishMode": "ingress"
                    }
                ]
            },
            "Ports": [
                {
                    "Protocol": "tcp",
                    "TargetPort": 8080,
                    "PublishedPort": 4981,
                    "PublishMode": "ingress"
                },
                {
                    "Protocol": "tcp",
                    "TargetPort": 50001,
                    "PublishedPort": 50001,
                    "PublishMode": "ingress"
                }
            ],
            "VirtualIPs": [
                {
                    "NetworkID": "v8ahpm6pn9qnsp2gxsax3cru6",
                    "Addr": "10.255.2.70/16"
                }
            ]
        },
        "UpdateStatus": {
            "State": "paused",
            "StartedAt": "2019-12-19T14:11:15.11613206Z",
            "Message": "update paused due to failure or early termination of task wgizq5m2pn23ix96xgpuu10ik"
        }
    }
]

Görüldüğü gibi servis hakkında tüm detayları buradan görebiliyoruz. Daha fazla bilgi için https://docs.docker.com/engine/reference/commandline/service_inspect/ resmi sitesini ziyaret edebilirsiniz.

docker service logs: Bu komut ile çalışan servisimiz ile ilgili işlem ve akış loglarına ulaşabiliriz. Servisimizde olası hataları gözlemleme düzelte, debug etme gibi işleri yaparken bu komut bize çok büyük kolaylık sağlayacaktır. Bir örnek yapalım.

docker service logs [OPTIONS] SERVICE|TASK

docker service logs -f jenkins
-f veya --follow logun akışını sağlar ve anlık görme şansı tanır.

komutla ilgili olarak farklı argumanlar kullanmak mümkün. Daha fazla bilgiyi resmi sitesi olan https://docs.docker.com/engine/reference/commandline/service_logs/ adresi üzerinden edinebilirsiniz.

docker service ls: Bu komut çalışan servisleri listeler. Basit olarak o an çalışan servisleri ve replica durumunu görüntüleyebilirsiniz.

docker service ls [OPTIONS]

Çok fazla argumanı yoktur ama yinede kendi resmi sitesinden https://docs.docker.com/engine/reference/commandline/service_ls/ takip edebilirsiniz.

docker service ps: Bu komutun docker service ls ile arasındaki fark ayrıntı vermesidir. Kaç sefer durdu en son ne zaman run oldu durma nedenleri nelerdir gibi ayrıntılar verir.

docker service ps [OPTIONS] SERVICE [SERVICE...]

docker service ps jenkins
ID                  NAME                IMAGE                   NODE                DESIRED STATE       CURRENT STATE           ERROR                              PORTS
amwh893xh6iz        jenkins.1           jenkins/jenkins:2.209   teleskoplocal       Running             Running 17 hours ago                                       
3j4bonms7ggx         \_ jenkins.1       jenkins/jenkins:2.209   teleskoplocal       Shutdown            Rejected 17 hours ago   "No such image: jenkins/jenkin…"   
no1ds497mw9d         \_ jenkins.1       jenkins/jenkins:2.209   teleskoplocal       Shutdown            Rejected 17 hours ago   "No such image: jenkins/jenkin…"   
uwlidk3c39q6         \_ jenkins.1       jenkins/jenkins:2.209   teleskoplocal       Shutdown            Rejected 17 hours ago   "No such image: jenkins/jenkin…"   
nfmzimlijvpa         \_ jenkins.1       jenkins/jenkins:2.209   teleskoplocal       Shutdown            Rejected 17 hours ago   "No such image: jenkins/jenkin…"   

Konu ile ilgil olarak argumanları kendi resmi sitesi olan https://docs.docker.com/engine/reference/commandline/service_ps/ inceleyerek bakabilirsiniz.

docker service rm: Bu komut ilgil servisi kaldırmak için kullanılır.

Önemli Not: Bu komut asla onay beklemez direk uygular o neden emin olmadan servisi kaldırmayın

$ docker service rm redis

redis

$ docker service ls

ID  NAME  MODE  REPLICAS  IMAGE

docker service rollback: Bu komut update olan bir imajın hatalı veya sıkıntılı olması durumunda bir önceki sürümüne geçmek için kullanılır. Ya da replica setini 1 ile başlatıp sonra 3 e alıp tekrar 1 e döndürmek için kullanılır. Örnekle anlatalım.

docker service rollback [OPTIONS] SERVICE

#Tek replica nginx açalım
$ docker service create --name my-service -p 8080:80 nginx:alpine
$ docker service ls

ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
xbw728mf6q0d        my-service          replicated          1/1                 nginx:alpine        *:8080->80/tcp

Şimdi bu replicayı update edelim.

$ docker service update --replicas=3 my-service

$ docker service ls

ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
xbw728mf6q0d        my-service          replicated          3/3                 nginx:alpine        *:8080->80/tcp

Şimdi rollback komutu ile replica setimizi tekrar 1 node şekline çekelim.

$ docker service rollback my-service

$ docker service ls

ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
xbw728mf6q0d        my-service          replicated          1/1                 nginx:alpine        *:8080->80/tcp

Argumanlarla ilgili olarak resmi sitesi olan https://docs.docker.com/engine/reference/commandline/service_rollback/ adresini ziyaret edebilirsiniz.

docker service scale: Bu komut çalışan bir servisin sayısını arttırmak düşürmek veya kapatmak için kullanılır.

docker service scale SERVICE=REPLICAS [SERVICE=REPLICAS...]

$ docker service scale frontend=50

frontend scaled to 50

Burada önemli olan global modda bu komutun hata vereceğidir. Buna mutlaka dikkat edilmesi gerekiyor. Yani eğer servisi replica set ile ayağı kaldırmıyorsanız servisi scale etme şansınız olmayacaktır.

$ docker service create --mode global --name backend backend:latest

b4g08uwuairexjub6ome6usqh

$ docker service scale backend=10

backend: scale can only be used with replicated mode

Docker service scale komutu ile bir çok servisi aynı anda yönetme şansına sahipsiniz. Örnek aşağıdadır.

$ docker service scale backend=3 frontend=5

backend scaled to 3
frontend scaled to 5

$ docker service ls

ID            NAME      MODE        REPLICAS  IMAGE
3pr5mlvu3fh9  frontend  replicated  5/5       nginx:alpine
74nzcxxjv6fq  backend   replicated  3/3       redis:3.0.6

Share: