docker 1.12 版本 docker swarm 叢集

丶小炒肉發表於2016-06-23

   docker 1.12 版本 的新特性

(1)docker swarm:叢集管理,子命令有init, join, leave, update

(2)docker service:服務建立,子命令有create, inspect, update, remove, tasks

(3)docker node:節點管理,子命令有accept, promote, demote, inspect, update, tasks, ls, rm

(4)docker stack/deploy:試驗特性,用於多應用部署, 類似與 docker-compose 中的特性。

 


我在使用的時候還是 測試版本,所以使用

wget -qO- https://test.docker.com/ | sh

進行安裝配置

安裝完畢以後:

 

[root@swarm-manager ~]# docker version
Client:
 Version:      1.12.0-rc2
 API version:  1.24
 Go version:   go1.6.2
 Git commit:   906eacd
 Built:        
 OS/Arch:      linux/amd64

Server:
 Version:      1.12.0-rc2
 API version:  1.24
 Go version:   go1.6.2
 Git commit:   906eacd
 Built:        
 OS/Arch:      linux/amd64

 

 

一、 我們首先來看看 1.12 中 新特性裡面的 內建 swarm 命令 (swarmkit採用raft協議構建叢集)

 

[root@swarm-manager ~]# docker swarm --help

Usage: docker swarm COMMAND

Manage Docker Swarm

Options:
--help Print usage

Commands:
init Initialize a Swarm
join Join a Swarm as a node and/or manager
update Update the Swarm
leave Leave a Swarm
inspect Inspect the Swarm

Run 'docker swarm COMMAND --help' for more information on a command.

 


這裡 命令有 5個

Commands:
init Initialize a Swarm
join Join a Swarm as a node and/or manager
update Update the Swarm
leave Leave a Swarm
inspect Inspect the Swarm

 



1. init 初始化,一個 Swarm 叢集,執行效果:

[root@swarm-manager ~]# docker swarm init
Swarm initialized: current node (0vwpni05mew2j84i6gjet44iu) is now a manager.

 

這裡顯示 初始化了一個 Swarm 叢集,並把這機器做為 管理節點。

 

[root@swarm-manager ~]#docker node ls
ID                           NAME                   MEMBERSHIP  STATUS  AVAILABILITY  MANAGER STATUS
0vwpni05mew2j84i6gjet44iu *  swarm-manager          Accepted    Ready   Active        Leader

 

 

執行 docker node ls 可以檢視 Swarm 的叢集情況 (只能在 manager 中執行)

 

[root@swarm-manager ~]# netstat -lan|grep 2377

 

可以看到 群集開放了一這個 2377 的埠。

預設繫結 0.0.0.0:2377 ,當然我們也可以使用 docker swarm init --listen-addr <MANAGER-IP>:<PORT> 進行繫結ip

2377 這個埠是用於 Swarm 中 node 節點加入使使用的。

 


2. join 加入 Swarm 叢集, 可加入做為 node 節點,也可加入 作為 管理節點。

[root@swarm-node-1 ~]#docker swarm join 10.6.0.140:2377
This node joined a Swarm as a worker.

 

這裡在 node-1 裡面執行了 join 命令,加入了 10.6.0.140 這個 manager 這個 Swarm 叢集裡

 

[root@swarm-manager ~]#docker node ls           
ID                           NAME                   MEMBERSHIP  STATUS  AVAILABILITY  MANAGER STATUS
0vwpni05mew2j84i6gjet44iu *  swarm-manager          Accepted    Ready   Active        Leader
4mqsmp0gzlqeicit98ce8wh2q    swarm-node-1           Accepted    Ready   Active

 


這裡可以看到 node-1 已經加入到 swarm 的叢集裡面來了。

 


3. update 命令, 只提示 updated ,具體作用尚不明白,應該是立刻重新整理 swarm 的群集資訊

[root@swarm-manager ~]#docker swarm update
Swarm updated.

 

4. leave 命令, 離開 Swarm 叢集, 一個docker 只能加入一個node.

[root@swarm-node-1 ~]#docker swarm leave 10.6.0.140:2377  

 

5. inspect 命令, 查詢 Swarm 叢集 的整體資訊。 (只能在 manager 中執行)

 

[root@swarm-manager ~]#docker swarm inspect
[
    {
        "ID": "c052zw5ll0ugw08shg2xf7ajp",
        "Version": {
            "Index": 11
        },
        "CreatedAt": "2016-06-23T02:09:18.935434519Z",
        "UpdatedAt": "2016-06-23T02:09:19.155114277Z",
        "Spec": {
            "Name": "default",
            "AcceptancePolicy": {
                "Policies": [
                    {
                        "Role": "worker",
                        "Autoaccept": true
                    },
                    {
                        "Role": "manager",
                        "Autoaccept": false
                    }
                ]
            },
            "Orchestration": {
                "TaskHistoryRetentionLimit": 10
            },
            "Raft": {
                "SnapshotInterval": 10000,
                "LogEntriesForSlowFollowers": 500,
                "HeartbeatTick": 1,
                "ElectionTick": 3
            },
            "Dispatcher": {
                "HeartbeatPeriod": 5000000000
            },
            "CAConfig": {
                "NodeCertExpiry": 7776000000000000
            }
        }
    }
]

 

 

二、 接下來我們來看看 service 命令。

[root@swarm-manager ~]#docker service --help

Usage:  docker service COMMAND

Manage Docker services

Options:
      --help   Print usage

Commands:
  create      Create a new service
  inspect     Inspect a service
  tasks       List the tasks of a service
  ls          List services
  rm          Remove a service
  scale       Scale one or multiple services
  update      Update a service

Run 'docker service COMMAND --help' for more information on a command.

 

 

1. docker create 命令, 既 建立 一個 服務。

[root@swarm-manager ~]#docker service create --help

Usage:  docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]

Create a new service

Options:
      --constraint value             Placement constraints (default [])
      --endpoint-mode string         Endpoint mode(Valid values: VIP, DNSRR)
  -e, --env value                    Set environment variables (default [])
      --help                         Print usage
  -l, --label value                  Service labels (default [])
      --limit-cpu value              Limit CPUs (default 0.000)
      --limit-memory value           Limit Memory (default 0 B)
      --mode string                  Service mode (replicated or global) (default "replicated")
  -m, --mount value                  Attach a mount to the service
      --name string                  Service name
      --network value                Network attachments (default [])
  -p, --publish value                Publish a port as a node port (default [])
      --replicas value               Number of tasks (default none)
      --reserve-cpu value            Reserve CPUs (default 0.000)
      --reserve-memory value         Reserve Memory (default 0 B)
      --restart-condition string     Restart when condition is met (none, on_failure, or any)
      --restart-delay value          Delay between restart attempts (default none)
      --restart-max-attempts value   Maximum number of restarts before giving up (default none)
      --restart-window value         Window used to evalulate the restart policy (default none)
      --stop-grace-period value      Time to wait before force killing a container (default none)
      --update-delay duration        Delay between updates
      --update-parallelism uint      Maximum number of tasks updated simultaneously
  -u, --user string                  Username or UID
  -w, --workdir string               Working directory inside the container
  

 

docker service create 裡面有非常多的 引數。 這裡有很詳細的使用說明。

下面我們來 建立一個 service 試試看

首先pull 一個 nginx 映象 下來 用於 測試

[root@swarm-manager ~]#docker pull nginx

 

建立 2 個 nginx :

[root@swarm-manager ~]#docker service create --name nginx --replicas 2 -p 80:80/tcp nginx


使用 docker service ls 可檢視 服務 啟動情況。

[root@swarm-manager ~]#docker service ls
ID            NAME   REPLICAS  IMAGE  COMMAND
1b9a58mlz330  nginx  1/2       nginx  

 


使用 tasks 命令 可檢視 nginx 的情況。

[root@swarm-manager ~]#docker service tasks nginx
ID                         NAME     SERVICE  IMAGE  LAST STATE           DESIRED STATE  NODE
56er48j3hin9ysdi3sb1chbn1  nginx.1  nginx    nginx  Preparing 2 minutes  Running        swarm-node-1
e7vtvpkbstznoi8ogihaao1f5  nginx.2  nginx    nginx  Running 2 minutes    Running        swarm-manager

 

這裡 顯示 swarm-node-1 節點中 last state 的狀態為 preparing .

原因是 swarm-node-1 節點並沒有 nginx 的映象


在 node-1 節點pull nginx 映象。

[root@swarm-node-1 ~]#docker pull nginx


node-1 節點pull 完畢以後,在使用 service ls 檢視, 服務已經自動 啟動了。

Swarm模式下的引擎擁有自組織與自修復特性,意味著它們能夠識別我們定義的應用,並在出現差錯時持續檢查並修復環境。

舉例來說,如果大家關閉某臺執行有Nginx例項的裝置,則另一節點上會自動啟動一套新的容器。

如果關閉Swarm內半數裝置所使用的網路交換機,則另外一半裝置會頂替而上,接管對應工作負載。

[root@swarm-manager ~]#docker service ls
ID            NAME   REPLICAS  IMAGE  COMMAND
1b9a58mlz330  nginx  2/2       nginx

 

[root@swarm-manager ~]#docker service tasks nginx
ID                         NAME     SERVICE  IMAGE  LAST STATE          DESIRED STATE  NODE
56er48j3hin9ysdi3sb1chbn1  nginx.1  nginx    nginx  Running 32 minutes  Running        swarm-node-1
e7vtvpkbstznoi8ogihaao1f5  nginx.2  nginx    nginx  Running 32 minutes  Running        swarm-manager

 


2. docker service scale 命令, 這個命令是批量生成已有容器。

直接對 nginx=10 既可讓 nginx 的容器生成10個。

[root@swarm-manager ~]#docker service scale nginx=10
nginx scaled to 10

 


使用 tasks 可以看到,已經在 2個 節點中生成了10個 nginx 容器

[root@swarm-manager ~]#docker service tasks nginx
ID                         NAME      SERVICE  IMAGE  LAST STATE            DESIRED STATE  NODE
56er48j3hin9ysdi3sb1chbn1  nginx.1   nginx    nginx  Running 43 minutes    Running        swarm-node-1
e7vtvpkbstznoi8ogihaao1f5  nginx.2   nginx    nginx  Running 43 minutes    Running        swarm-manager
9vqxcmskj1nawo8wl0fqr32j2  nginx.3   nginx    nginx  Preparing 20 seconds  Running        swarm-manager
0vbqoyestm7ob6r1zq9jwj6il  nginx.4   nginx    nginx  Running 20 seconds    Running        swarm-node-1
13jf9mkl4k5e57pq4hoeb68ru  nginx.5   nginx    nginx  Running 20 seconds    Running        swarm-node-1
a0tk6ni6a02diuo5u3t870qk7  nginx.6   nginx    nginx  Running 20 seconds    Running        swarm-manager
cwplvo5wfqp3rn5ynvxv9wv90  nginx.7   nginx    nginx  Running 20 seconds    Running        swarm-manager
7feil5xqc5hdkseasthkq2nyx  nginx.8   nginx    nginx  Running 20 seconds    Running        swarm-node-1
8jt5yovxoz7t89edinb9ydao1  nginx.9   nginx    nginx  Starting 20 seconds   Running        swarm-node-1
dst4ydun1upham0o7e8a9hj3w  nginx.10  nginx    nginx  Running 20 seconds    Running        swarm-manager

 


當我們想 縮容 時間, 也可以使用 scale nginx=2 讓容器變成2個。

[root@swarm-manager ~]#docker service scale nginx=2
nginx scaled to 2

 


在執行 nginx=2 時可以看到 容器已經縮小為 2個 。

當我們使用 docker ps 檢視,會發現容器被 stop 而非 rm 。

當我們使用 docker service rm nginx 的時候,所有的容器都會被 刪除,請注意。

[root@swarm-manager ~]#docker service tasks nginx
ID                         NAME     SERVICE  IMAGE  LAST STATE          DESIRED STATE  NODE
0vbqoyestm7ob6r1zq9jwj6il  nginx.4  nginx    nginx  Running 12 minutes  Running        swarm-node-1
13jf9mkl4k5e57pq4hoeb68ru  nginx.5  nginx    nginx  Running 12 minutes  Running        swarm-node-1

 

 

3. docker service update 命令。 可對 服務的啟動 引數 進行 更新/修改。

上面我們新建了一個服務,命令為:

[root@swarm-manager ~]#docker service create --name nginx --replicas 2 -p 80:80/tcp nginx

 

如果我們先新加入了一個 node 想讓 nginx 分佈在 3個 node 上面, 我們可以使用 update 命令。

 

[root@swarm-manager ~]#docker service update --replicas 3 nginx
nginx

 


更新完畢以後 我們可以檢視到 REPLICAS 已經變成 3/3

[root@swarm-manager ~]#docker service ls
ID            NAME   REPLICAS  IMAGE  COMMAND
1b9a58mlz330  nginx  3/3       nginx  

 


docker service update 命令,也可用於直接 升級 映象等。

 

[root@swarm-manager ~]#docker service tasks nginx
ID                         NAME     SERVICE  IMAGE  LAST STATE           DESIRED STATE  NODE
0vbqoyestm7ob6r1zq9jwj6il  nginx.4  nginx    nginx  Running 41 minutes   Running        swarm-node-1
340e1u31vadq3jtebzeddmatt  nginx.5  nginx    nginx  Preparing 5 seconds  Running        swarm-manager

 

上面我們使用了 nginx 映象啟動了 任務。 使用 update --image 可直接對 image 進行更新。

[root@swarm-manager ~]#docker service update --image nginx:new nginx 
nginx


可以看到 IMAGE 已經變成 nginx:new

 

[root@swarm-manager ~]#docker service tasks nginx
ID                         NAME     SERVICE  IMAGE      LAST STATE          DESIRED STATE  NODE
2ba3utpk6icf0w449kcwgxmnm  nginx.4  nginx    nginx:new  Running 49 seconds  Running        swarm-manager
5wmmneiueeool09fs8d2g1ncq  nginx.5  nginx    nginx:new  Running 49 seconds  Running        swarm-node-1

 

 

掛載目錄, mount 


docker service create --mount type=bind,target=/container_data/,source=/host_data/- 本地目錄:     target = 容器裡面的路徑, source = 本地硬碟路徑
docker service create --name nginx --mount type=bind,target=/usr/share/nginx/html/,source=/opt/web/ --replicas 2 --publish 80:80/tcp nginx


docker service create
--mount type=volume,source=<VOLUME-NAME>,target=<CONTAINER-PATH>,volume-driver=<DRIVER>, 例 - 掛載volume卷: source = volume 名稱 , traget = 容器裡面的路徑 docker service create --name nginx --mount type=volume,source=myvolume,target=/usr/share/nginx/html,volume-driver=local --replicas 2 --publish 80:80/tcp nginx

 

 

 

 

 

 

 

 


三、 下面是 node , node命令用於節點管理:

[root@swarm-manager ~]#docker node --help

Usage:  docker node COMMAND

Manage Docker Swarm nodes

Options:
      --help   Print usage

Commands:
  accept      Accept a node in the swarm
  demote      Demote a node from manager in the swarm
  inspect     Inspect a node in the swarm
  ls          List nodes in the swarm
  promote     Promote a node to a manager in the swarm
  rm          Remove a node from the swarm
  tasks       List tasks running on a node
  update      Update a node

Run 'docker node COMMAND --help' for more information on a command.

 

 


1. 首先是 docker node accept 命令, 這個命令用於 同意 申請加入 swarm 叢集。

在使用 docker swarm init 的時候,如果使用了 --auto-accept none 的話,需要使用 docker node accept 來通過申請。

在沒有通過申請之前,節點 MEMBERSHIP 狀態為 Pending 狀態。

--auto-accept 可以設定三種角色 分別為 (worker, manager, or none) 。


使用 docker node accept + 節點 ID 既可通過申請。


2. docker node promote 與 docker node demote 命令。

docker node promote 是 將 worker 普通節點,提升為 manager 節點。

docker node demote 是 將 manager 管理節點,降級為 worker 節點。

 

3. docker node inspect 可檢視節點的具體資訊
docker node rm 可刪除一個節點
docker node tasks 可檢視節點中執行的 service 任務。

 


四、 docker stack/deploy 目前 stack 還處於 測試階段。

https://github.com/docker/docker/blob/master/experimental/docker-stacks-and-bundles.md

目前 docker 1.12.0-rc2 版本還沒有這個命令, 等待 正式版 的到來。

 

相關文章