Docker summit 2015: 以 Docker Swarm 打造多主機叢集環境

37
Docker Swarm 蝨ग़Ԇ秚玵褸絑ह 砇蟴 Network Spooky 獺ᑀ虻懱ҙݣӾ

Transcript of Docker summit 2015: 以 Docker Swarm 打造多主機叢集環境

Docker Swarm

Network

Spooky

Outline‣ Introduce‣ Linking containers together‣ Linking Docker Engine ‣multi-host networking‣Docker Swarm on multiple VM‣Docker Swarm on multiple cloud instance

Docker Orchestration

Linking Containers Together

Linking Containersdocker compose

linksdocker compose

external_linksdocker command

links

1 on 1

server database

Links

browser test case

JCConf 2015 workshop: 透過 docker 進⾏ e2e test,以 Gradle 及 Geb 為例http://blog.trunk-studio.com/jcconf2015/

main: container_name: jcconf_main image: trunk/groovy_gradle command: "/bin/bash -l -c 'gradle remoteFirefoxTest'"

links: - client

volumes: - ./:/jcconf_main

working_dir: /jcconf_main

client: container_name: jcconf_client image: vvoyer/docker-selenium-firefox-chrome

ports: - "4444:4444" - "5999:5999"

docker-compose up -d

Links

external_linksserver

database

server

N on 1

test

preview

https://github.com/TrunkWorkshop/sailsSample

mysql: container_name: mysql image: dgraziotin/mysql

ports: - "3306:3306" environment: MYSQL_ADMIN_PASS: "root" MYSQL_USER_NAME: "nodejsSample" MYSQL_USER_DB: "nodejsSample" MYSQL_USER_PASS: "nodejsSample" CREATE_MYSQL_BASIC_USER_AND_DB: "true"

volumes: - ../database:/var/lib/mysql/

restart: always

web: container_name: sailsSample image: trunk/sails_env command: "/bin/bash -l -c 'npm start'"

ports: - "1337:1337"

working_dir: /sailsSample volumes: - ./:/sailsSample

external_links: - mysql

restart: always

docker-compose up -d mysql docker-compose up -d web

external_links

Linking Docker Engine

Docker Swarmcloud

Docker Swarm Docker Swarm with Network

localDocker Swarm

https://github.com/TrunkWorkshop/docker-swarm-sample/tree/master/local

Swarm Master

Swarm Node

Swarm Node

Docker Machine

Local & Cloud Docker Swarm

docker info

Overlay Network

key-store

consul

Swarm Master

Swarm Node

Docker Machine Container Communication

Docker Engine Control

Docker Engine Register

Cloud Docker Swarm

Digital Ocean

My laptop

Digital Ocean

Google

‣Port allow‣ Docker Engine port (e.g TCP 2375)‣ VXLAN: UDP 4789‣ Serf: TCP + UDP 7946‣ Key-value store ( e.g for Consul TCP 8500)

‣Support Docker Network feature‣ kernel 3.18+

Digital Ocean‣ setup your token

‣ export DIGITALOCEAN_ACCESS_TOKEN=12345

https://github.com/TrunkWorkshop/docker-swarm-sample/tree/master/digitalocean

Google Cloud Platform‣ gcloud auth login https://cloud.google.com/sdk/

‣ create google-project‣ export GOOGLE_PROJECT='project name'

‣ activate Compute Engine API‣ setup firewall-rules

‣ gcloud compute firewall-rules update default-swarm --allow tcp:2376 tcp:2375 tcp:3376 tcp:8500 UDP:4789 TCP:7946 UDP:7946 --source-range 0.0.0.0/0

‣ gcloud compute firewall-rules create default-demo --allow tcp:5000 tcp:27017 tcp:80 --source-range 0.0.0.0/0

https://github.com/TrunkWorkshop/docker-swarm-sample/tree/master/google

Prepare Muti-Host Docker Environment

key-store

consul

Docker Machine

create-machine-keystore:docker-machine create \

--driver digitalocean \--digitalocean-image ubuntu-15-10-x64 \

digitalocean-keystore

run-consul:docker run -d \ -p "8500:8500" \ -h "consul" \ progrium/consul -server -bootstrap

create keystore

Digital Ocean

My laptop

key-store

consulcreate-machine-swarm-master:

docker-machine create \--driver digitalocean \--digitalocean-image ubuntu-15-10-x64 \--swarm --swarm-image="swarm" --swarm-master \--swarm-discovery="consul://$(DOCKER_IP_KEYSTORE):8500" \--engine-opt="cluster-store=consul://$(DOCKER_IP_KEYSTORE):8500" \--engine-opt="cluster-advertise=eth0:2376" \digitalocean-master

Create Swarm Master

Swarm Master

Docker Machine

export DOCKER_IP_KEYSTORE=$(docker-machine ip digitalocean-keystore)

Digital Ocean

My laptop

Digital Ocean

key-store

consulcreate-machine-swarm-node:

docker-machine create \--driver digitalocean \--digitalocean-image ubuntu-15-10-x64 \--swarm --swarm-image="swarm" \--swarm-discovery="consul://$(DOCKER_IP_KEYSTORE):8500" \--engine-opt="cluster-store=consul://$(DOCKER_IP_KEYSTORE):8500" \--engine-opt="cluster-advertise=eth0:2376" \digitalocean-node

Create Swarm NodeSwarm MasterDocker

Machine

export DOCKER_IP_KEYSTORE=$(docker-machine ip digitalocean-keystore)

Swarm Node

Digital Ocean

My laptop

Digital Ocean

Google

Docker Machine ls

Docker Info

Create Overlay Network

create-network-overlay:docker network create --driver overlay cloud-overlay

Overlay Network

key-store

consul

Swarm Master

Swarm Node

Docker Machine

Digital Ocean

My laptop Digital Ocean

Google

Docker Network ls

digitalocean-master

google-note

Run Docker Containers With

Multi-Host Docker Environment

OrchestrationDocker ComposeManual Network

Docker Compose Auto Network

DockerCommand

Docker Commandrun-sample-server:

docker run -itd \--name=web \--net=cloud-overlay \--env="constraint:node==master" \nginx

run-sample-client:docker run -it --rm \--net=cloud-overlay \--env="constraint:node==node" \busybox wget -O- http://web

Overlay Network

key-store

consul

Swarm Master

Swarm Node

Docker Machine

api server

client server

compose_web: container_name: 'compose_web' image: bfirsh/compose-mongodb-demo environment: - "MONGO_HOST=compose_mongo" - "constraint:node==google-node" net: overlay ports: - "80:5000"

Docker Compose Manual Networkcompose_mongo: container_name: 'compose_mongo' image: mongo environment: - "constraint:node==master" net: overlay

Overlay Networkkey-store

consul

Swarm Master

Swarm Node

Docker Machine

server

database

docker-compose up -d

compose_web: container_name: 'compose_web' image: bfirsh/compose-mongodb-demo environment: - "MONGO_HOST=compose_mongo" - "constraint:node==google-node" ports: - "80:5000"

Docker Compose Auto Networkcompose_mongo: container_name: 'compose_mongo' image: mongo environment: - "constraint:node==master"

Overlay Networkkey-store

consul

Swarm Master

Swarm Node

Docker Machine

server

database

docker-compose --x-networking --x-network-driver overlay up -d

cat /etc/hosts

docker network inspect

https://github.com/TrunkWorkshop/docker-swarm-sample

make clean-machine

make create-machine-keystoreeval $(docker-machine env digitalocean-keystore)export DOCKER_IP_KEYSTORE=$(docker-machine ip digitalocean-keystore)make run-consul

make create-machine-swarm-mastermake create-machine-swarm-node

eval $(docker-machine env --swarm digitalocean-master)make create-network-overlaymake run-sample-servermake run-sample-clients

make run-by-compose

High availability in Docker Swarmhttps://docs.docker.com/swarm/multi-manager-setup/

Docker-swarm Dockerhttp://blog.trunk-studio.com/docker-swarm-network/

DockerCon EU 2015 Hands-On Labs https://github.com/docker/dceu_tutorials