Docker的最佳实践建议:一个容器只运行一个进程。而实际的应用会由多个组件构成,要运行多个组件就需要运行多个容器,这就需要对这多个容器进行编排。
所谓编排:主要就是多个docker容器的自动配置、协作和管理服务的过程。Docker提供了docker-compose工具来实现。
compose是用来定义和运行一个或多个容器应用的工具,使用python开发,通过yml文件来定义多个容器应用,非常适合在单机环境下部署一个或多个容器,并自动把多个容器互相关联起来。
其实,docker-compose做的就相当于解析配置文件,然后按照配置去执行一系列的docker命令。
官方安装文档:https://docs.docker.com/compose/install/
Docker-compose基本示例
1:准备好要启动的镜像,虽然可以直接在compose里面build镜像,建议还是先准备好
2:编写docker-compose.yml
3:然后就docker-compose up -d,启动就好了
4:docker-compose.yml示例如下:
version: '2'
services:
mysqldb:
image: 'mysql:latest'
environment:
- MYSQL_ROOT_PASSWORD=cc
volumes:
- /ccuse/programes/mysqldata:/var/lib/mysql
privileged: true
web:
image: 'cctomcat:9.0'
ports:
- "9080:8080"
volumes:
- /ccuse/programes/tomcat9docker/webapps/test:/usr/local/tomcat/webapps/test
privileged: true
links:
- mysqldb:dblink
1:一份标准配置文件可以包含 version、services、networks 三大部分,详细的参照指南见官方网站: https://docs.docker.com/compose/compose-file/
2:version目前是有1,2,3这么三个
3:srvices常见的配置有:
(1)服务名称:用来表示一个服务,自定义的
(2)image:指定服务的镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像,Build和image必须使用一个。
(3)build:
服务除了可以基于指定的镜像,还可以基于一份 Dockerfile,在使用 up 启动之时执行构建任务,这个构建标签就是 build,它可以指定 Dockerfile 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器。
如果你同时指定了 image 和 build 两个标签,那么 Compose 会构建镜像并且把镜像命名为 image 后面的那个名字。
(4)args:
类似Dockerfile 中的 ARG 指令,可以在构建过程中指定环境变量,构建成功后取消
(5)command:使用 command 可以覆盖容器启动后默认执行的命令
(6)container_name:自定义容器的名称
(7)links:指定与其它容器的连接,与Docker client的–link一样效果
(8)volumes:将host主机上的路径或文件,挂载到容器中
(9)ports:将host主机的端口映射到容器的某个端口
(10)environment:设置环境变量, 与Dockerfile 中的 ENV 指令一样会把变量一直保存在镜像、容器中,类似 docker run -e 的效果
(11)privileged:设置挂载目录的权限
(12)depends_on:一般项目容器启动的顺序是有要求的,可以用depends_on来解决容器的依赖、启动先后的问题。
……还有很多,可以查阅官方文档。
Docker-compose 的networks配置
容器间的通讯,除了使用–link外,现在更推荐使用自定义网络,然后利用服务名进行通讯。每个自定义网络都可以配置很多东西,包括网络所使用的驱动、网络地址范围等设置。例如:
networks:
frontend:
backend:
1:你会看到frontend、backend后面是空的,这是指一切都使用默认,换句话说,在单机环境中,将意味着使用 bridge 驱动;而在 Swarm 环境中,使用 overlay 驱动,而且地址范围完全交给 Docker 引擎决定。
2:然后在每个services配置里面,也有一个networks,用来指定服务要连接到哪些网络上,可以指定多个,例如:
services:
nginx:
…
networks:
- frontend
web:
…
networks:
- frontend
- backend
mysql:
…
networks:
- backend
3:连接到同一个网络的容器,可以进行互连;而不同网络的容器则会被隔离。
4:处于同一网络的容器,可以使用服务名访问对方
5:给前面的例子添加networks的配置,如下:
version: '2'
services:
mysqldb:
image: 'mysql:latest'
environment:
- MYSQL_ROOT_PASSWORD=cc
volumes:
- /ccuse/programes/mysqldata:/var/lib/mysql
privileged: true
networks:
- frontend
web:
image: 'cctomcat:9.0'
ports:
- "9080:8080"
volumes:
- /ccuse/programes/tomcat9docker/webapps/test:/usr/local/tomcat/webapps/test
privileged: true
links:
- mysqldb:dblink
networks:
- frontend
networks:
frontend:
backend:
1:compose:用来组装多个容器构成应用的工具
2:machine
machine是一个简化Docker安装的命令行工具,支持多平台安装docker,可以方便的在各种环境,比如笔记本、云平台、数据中心里安装docker。
machine本质上就是一个docker host主机和经过配置的docker client的结合体。
3:swarm
docker社区原生提供的容器集群管理工具,可以把多个docker主机组成的系统转换成为单一的虚拟docker主机
###1.2.2 Kubernetes(K8S)
google推出的开源的Kubernetes,用于跨主机群集自动部署,扩展和操作应用程序容器,提供以容器为中心的基础架构。利用Kubernetes能很方便管理多台Docker主机中的容器。 主要功能如下:
1:将多台Docker主机抽象为一个资源,以集群方式管理容器,包括任务调度、资源管理、弹性伸缩、滚动升级等功能。
2:使用编排系统快速构建容器集群,提供负载均衡,解决容器直接关联及通信问题
3:自动管理和修复容器,简单说,比如创建一个集群,里面有十个容器,如果某个容器异常关闭,那么会尝试重启或重新分配容器,始终保证有十个容器在运行。
4:类似的主流工具还有: Apache的Mesos等