docker summit 2015: 以 docker swarm 打造多主機叢集環境
TRANSCRIPT
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
‣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
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
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