#DockerCompose
可以通过一个yml文件定义多容器的docker应用
通过一条命令就可以根据yml文件的定义去创建或管理多个容器,通常docker-compose比较适用于本地开发,不太适用于生产环境。
yml包含services、networks、volumes
一个service代表一个container,这个container可以从dockerhub的image来创建,也可以用dockerfile build出来的image来创建
service启动类似docker run,我们可以给其指定network和volume的引用
安装参考官网链接:https://docs.docker.com/compose/install/#install-compose
安装完成后赋权:
sudo chmod +x /usr/local/bin/docker-compose
docker-compose.yml内容如下:
version: '3'
services:
wordpress:
image: wordpress
restart: always
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD: root
networks:
- my-bridge
mysql:
image: mysql:5.6
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- mysql-data:/var/lib/mysql_1
networks:
- my-bridge
volumes:
mysql-data:
networks:
my-bridge:
driver: bridge
这个yml装了两个容器,包含mysql和wordpress,注意mysql中我配置了volumes,当删除了container和network以后,这个volume不会被删除。如果安装过程报错需要重新安装时,需要重新制定volume的路径。这是一个小坑。
Docker Compose 的命令与docker比较类似,
docker-compose ps
docker-compse network ls
docker-compose exec mysql bash
通过dockerfile来build的:
version: '3'
services:
redis:
image:redis
web:
build:
context: .
dockerfile: Dockerfile
ports:
- 8080:5000
environment:
REDIS_HOST: redis
通过scale可以开多个容器,通过docker-compose.yml中的dockercloud/haproxy我们可以定义负载均衡,当然这个只限于本机。
docker-compose up –scale wordpress=3 -d
docker-compose ps
version: '3'
services:
redis:
image: redis
web:
build:
context: .
dockerfile: Dockerfile
# ports:
# - 8080:5000
environment:
REDIS_HOST: redis
lb:
image: dockercloud/haproxy
links:
- web
ports:
- 8080:80
volume:
- /var/run/docker.sock:/var/run/docker.sock
#swarm
docker官方自带的容器编排工具
有三种方式创建测试环境:vagrant,docker-machine,play with docker
可以通过play with docker快速创建环境:
https://labs.play-with-docker.com/
选择一台服务器做为manager,运行:
docker swarm init --advertise-addr=192.168.0.21
复制执行这条命令以后的结果,把这一行复制粘贴到其他的worker上:
docker swarm join --token SWMTKN-1-25goy19ebh4ghrhoq81blak8iu9y2h95ssh51b82euqp90s6rx-bvomawv4kdys69q5rib51fgbw 192.168.0.21:2377
通过在manager中运行下面这条命令查看节点:
docker node ls
#scale
可以通过scale做容器的横向扩展,扩展到5台,会自动平均分配到所有node中:
docker service scale demo=5
docker service ps demo
docker service rm demo # 删除名为demo的service
scale不光可以做横向扩展,会自动灾难恢复, 如果其中有容器down掉,会在其他node中自动生成新的容器。也确保class中的数量有效,
docker network create -d overlay demo
docker network ls
docker service create –name mysql –env MYSQL_ROOT_PASSWORD=root –env MYSQL_DATABASE=wordpress –network demo –mount type=volume,source=mysql-data,destination=/var/lib/mysql mysql
其中env是设置环境变量,mount类似于docker run中的-v参数,
docker service ls # 浏览service
docker service ps mysql #查看这个service在哪个node中
docker service create –name wordpress -p 80:80 –env WORDPRESS_DB_PASSWORD=root –env WORDPRESS_DB_HOST=mysql –network demo wordpress #安装wordpress,映射80端口出来
docker service create --name whoami -p 8000:8000 --network demo -d jwilder/whoami
docker service create --name client -d --network demo busybox sh -c "while true; do sleep 3600; done"
docker service scale whoami=2
docker service ps whoami
可以通过nslookup查看vip及vip下的容器真实地址,注意vip的概念
nslookup whoami
nslookup tasks.whoami
#Routing Mesh的两种体现:
Internal – Container与Container之间的访问通过overlay网络(通过VIP虚拟IP)
Ingress – 如果有服务有绑定接口,则此服务可以通过任意swarm节点的相应接口访问。
LVS – Linux Virtual Server
Internal Load Balancing 负载均衡
Ingress Network
sudo iptables -nL -t nat
ls /var/run/docker/netns
其中netns可以理解成net namespace
sudo nsenter –net=/var/run/docker/netns/ingress_sbox
docker network inspect docker_gwbridge
iptables -nL -t mangle
eth0请求 – iptables NAT tables(DOCKER-INGRESS) – default_gwbridge – Ingress-sbox(iptables managle table)(IPVS) – Ingress network(ingress-overlay-bridge) —-vxlan—- Ingress network(ingress-overlay-bridge) – (Ingress-sbox) or (Container-sbox) – default_gwbridge – iptables NAT tables(DOCKER-INGRESS) – eth0返回
#dockercompose的deploy相关说明
可以参照官网:
https://docs.docker.com/compose/compose-file/#placement
在dockerswarm里通过dockercompose文件部署,我们要用到stack命令:
stack包含了多个service:
docker stack deploy wordpress –compose-file=docker-compose.yml
这里我有一个报错
failed to create service webpress_web: Error response from daemon: rpc error: code = FailedPrecondition desc = service needs ingress network, but no ingress network is present
解决方案,手动添加一个ingress network:
docker network create –ingress –driver overlay ingress
docker stack ls docker stack ps wordpress docker stack service wordpress
#docker Secret Management
存在于swarm Manager节点Raft database里,加密的。
Secret可以assign给一个service,这个service就能看到这个secret。
在container内部,Secret看起来像文件,实际是在内存中。
docker secret create my-pw password # password是存有密码信息的文件
echo “adminadmin” | docker secret create my-pw2 - #直接赋值
docker secret ls
docker secret rm my-pw
secret文件会存在容器的/run/secrests/目录中
通过secret创建mysql的service:
docker service create --name db --secret my-pw -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/my-pw mysql:5.6
我们可以进入service查看
docker service ls
docker service ps db
进入相对应的node,执行:
docker exec -it ContainerID sh
进入container再执行:
cat /run/secret/my-pw
登录mysql验证密码
#Service简单更新
创建环境:
docker network create -d overlay demo
docker service create –name web –publish 8080:5000 –network demo python-flask-demo:1.0
先做scale:
docker service scale web=2
先更新一个docker service update:
docker service update –image image的名字 web # 更新image
docker service update –publish-rm 8080:5000 –publish-add 8088:5000 web # 更新端口
docker stack deploy web –compose-file=docker-compose.yml # stack直接通过deploy更新
docker的监控:
docker top ContainerName 可以查看到容器的监控信息。
docker stats 可以实时打印后台运行的容器占用资源的状态
docker的图形化监控工具 weavescope
sudo curl -L git.io/scope -o /usr/local/bin/scope sudo chmod +x /usr/local/bin/scope
scope launch IPAddress
访问weavescope的web页面: http://IPAddress:4040
![]() |
![]() |