本節咱們介紹如何以方便的方式管理service。node
咱們以前提到docker-compose,適用於本地開發,能夠在本機部署,提供了很大的便利。而swarm是一個cluster,可不能夠經過docker-compose來實現定義的application?答案是能夠,可是不推薦。僅僅使用docker命令行就能夠。咱們依然可使用docker-compose.yml文件去定義一個應用,可是咱們通常不用docker-compose去部署,而是直接使用docker命令,並且咱們這個部署只能用於swarm cluster。mysql
version "3.3" services: wordpress: image: wordpress ports: - 8080:80 networks: - overlay deploy: mode: replicated replicas: 2 endpoint_mode: vip placement: constraints: - node.role == manager - engine.labels.operatingsystem == ubuntu 16.04 preferences: - spread: node.labels.zone resources: limites: cpus: '0.50' memory: 50M
上面是一個例子:web
endpoint_mode有兩種取值方式sql
第一種是vip,就是以前介紹的虛擬ip,用戶service之間互相訪問時暴露的VIP,經過虛擬IP訪問時,底層經過LVS將虛擬IP負載均衡成具體的某一個service的ip地址。docker
第二種是dnsrr ,DNS round-robin。這種方式不使用虛擬ip,而是直接使用service的ip地址,咱們知道service的ip地址有不少個,特別是咱們作了橫向擴展以後,每一個service都有本身的ip地址,若是使用dnsrr的時候,咱們不使用IP地址,而是使用dns。ubuntu
默認使用的是vip。vim
mode也有兩種取值方式瀏覽器
第一種是global,表示這個service在全局cluster中只有一個。不能作橫向擴展。app
第二種是replicated,默認值。能夠作橫向擴展。負載均衡
placement
用於設置service的一些限制條件。
例如上面的wordpress service必定會部署到manager節點上
replicas
若是這個service的mode設置成replicated的時候就能夠在初始化的時候定義,須要幾個replicas。
resources
limit表示CPU和memory最多能夠用多少
restart_policy
若是service由於某種緣由中止了,那麼是否須要重啓,以及重啓的一些條件
update_config
要去作一些配置,好比對service作一些更新的時候,要遵循的一些原則。好比設置parallelism:2表示同時最多更新2個replicas,delay每次更新後的延遲時間。
咱們這個實驗環境依舊是使用wordpress。
咱們的docker-compose.yml文件內容以下:
version: '3' services: web: image: wordpress ports: - 8080:80 environment: WORDPRESS_DB_HOST: mysql WORDPRESS_DB_PASSWORD: 123456 networks: - my-network depends_on: - mysql deploy: mode: replicated replicas: 3 restart_policy: condition: on-failure delay: 5s max_attempts: 3 update_config: parallelism: 1 delay: 10s mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: wordpress volumes: - mysql-data:/var/lib/mysql networks: - my-network deploy: mode: global placement: constraints: - node.role == manager volumes: mysql-data: networks: my-network: driver: overlay
這個yml文件適用於使用docker-compose工具在本地部署。那若是要部署到swarm cluster中,用docker-compose是不合適的,緣由一:networks,咱們在本地docker-compose時,咱們的network是bridge,而咱們在swarm中部署時,service是會分佈到不一樣的機器上,因此說networks是不能採用bridge,須要改爲overlay。
上面的配置中,mysql service設置爲:mode:global表示這個mysql服務不容許作replicas。而且限制mysql只能部署到manager節點。
wordpress:運行在replicas模式下,而且初始化replicas=3
咱們要將docker-compose.yml部署到swarm cluster中使用的命令是docker stack
咱們上面的docker-compose定義了一個stack,這個stack就叫wordpress。咱們在wordpress 這個stack中定義了兩個service,一個是wordpress一個是mysql。
執行命令:
iie4bu@swarm-manager:~/ddy/docker-compose-swarm$ vim docker-compose.yml iie4bu@swarm-manager:~/ddy/docker-compose-swarm$ ls docker-compose.yml iie4bu@swarm-manager:~/ddy/docker-compose-swarm$ docker stack deploy wordpress --compose-file=docker-compose.yml Creating network wordpress_my-network Creating service wordpress_web Creating service wordpress_mysql
查看如今stack的狀況:
iie4bu@swarm-manager:~/ddy/docker-compose-swarm$ docker stack ls NAME SERVICES wordpress 2
能夠看到有一個wordpress stack
查看wordpress stack的詳細信息:
iie4bu@swarm-manager:~/ddy/docker-compose-swarm$ docker stack ps wordpress ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS qzpzs6kj1ec5 wordpress_mysql.yd42nx646854nrzyqohwmpgwi mysql:5.7 swarm-manager Running Running about a minute ago se9rn27p694f wordpress_web.1 wordpress:latest swarm-worker2 Running Running 2 minutes ago lz10x51q2on8 wordpress_web.2 wordpress:latest swarm-worker1 Shutdown Failed about a minute ago "starting container failed: fa…" z8tsp0b08uzs \_ wordpress_web.2 wordpress:latest swarm-worker1 Shutdown Failed about a minute ago "starting container failed: fa…" f1dh5i8xqlrf \_ wordpress_web.2 wordpress:latest swarm-worker1 Shutdown Failed about a minute ago "starting container failed: fa…" n3la11ttg30v \_ wordpress_web.2 wordpress:latest swarm-worker1 Shutdown Failed 2 minutes ago "starting container failed: fa…" 8n4gcxt3b1kv wordpress_web.3 wordpress:latest swarm-manager Running Running 2 minutes ago
發現有一個web service沒有啓動成功,緣由未查明。
能夠經過瀏覽器訪問。