想学习更全面的docker知识可以点击右侧: Docker的概念及基本指令学习(全)
docker 服务编排
- docker 服务编排也叫docker compose,它的出现是应来解决使用docker部署大型应用的业务场景的问题。通常在生产环境中,使用docker部署一个应用需要使用多个容器,例如部署前端、后端、依赖服务、数据库等。如果每个容器都需要手工使用shell来启动则效率过于低下,所以在这样的场景中,我们可以采用docker compose来进行docker容器的编排工作。
第一步:下载docker compose
curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
第二步:修改docker compose让其有可执行权限
chmod 744 /usr/local/bin/docker-compose
第三步:测试
docker-compose -version
第四部:docker-compose.yml文件的编写
在docker-compose.yml文件中可以编写相关的配置属性,用来管理compose的构建过程,主要的属性包括:
1)version 代表compose文件格式版本,按照官网的实例,建议目前采用‘3.9’版本
2)services 该属性是compose文件中的核心属性,在该属性之下,可以配置compose启动的各种服务。主要是需要compose启动的各种容器信息。也是compose文件中主要的开发内容。
常用属性:
属性名称 |
说明 |
image |
当前服务使用什么镜像文件 |
ports |
当前容器需要映射的端口信息 - ”8080:80“ |
enviroments |
当前镜像需要传递的参数 |
volumes |
当前镜像的挂在点 |
tty:true |
代表使用-it模式启动服务 |
build |
指定dockerfile所在的路径,当使用docker compose编排一个容器,而且该容器需要构建的时候需要使用该参数 |
container_name |
指定编排容器的名称 |
restart:always |
在docker服务重启后,该容器是否自动重启 |
depends_on: 服务名 |
设定服务依赖关系,通过该配置可以决定服务的启动顺序 |
env_file |
指定配置文件 |
context |
指定上下文 |
dockerfile |
指定需要使用的dockerfile文件 |
3)networks
例子1:在service中配置简单的服务信息,编写compose文件,启动一个nginx容器
version: '3.9'
services:
my_nginx:
image: "nginx"
ports:
- "8080:9090"
volumes:
- "/root/docker_vol/web/dist:/usr/share/nginx/html:ro"
- "/root/docker_vol/web/conf/nginx.conf:/etc/nginx/nginx.conf:ro"
- 使用docker-compose up命令 启动容器编排,需要注意的是,容器启动成功后,默认会占用当前的终端用来输出日志信息。我们可以重新打开一个终端,使用docker ps命令查看,发现docker中多了一个容器名字叫做 **my_nginx_1.这就是compose替我们启动的容器。
- 在上面的例子中,my_nginx是一个服务的名字,也可以理解为是生成容器名字的其中一部分,image属性代表要使用什么镜像,ports 代表需要映射的端口,前边是宿主机的端口,而后面是容器内的端口。volumns代表要进行的文件挂载。
- 此外,使用docker network ls命令可以发现,compose启动后,自动给我们创建了一个网络,通过 docker inspect 命令发现使用当前compose文件启动的容器默认都加入到了,新创建的网络中。
例子2:在tomcat-compose文件中构建一个服务,在本地docker中不存在有对应的镜像
version: '3.9'
services:
my_tomcat:
image: "tomcat"
- 如果在compose中包含本地docker中不存在的镜像,则在运行compose的过程中会自动下载对应的镜像。理论上在一台安装有docker以及docker
- compose的宿主机上,在保证网络畅通的前提下,我们只需要依靠docker-compose文件就可以直接安装对应的系统。
- 此外,在当前的例子中,我们将compose文件认为的修改为
tomcat-compose.yml,如果不使用默认的文件名,则需要在执行docker-compose up命令的时候加上 -f 参数,手工指定对应的yml文件。
例子3:一次启动多个容器
version: '3.9'
services:
my_tomcat:
image: "tomcat"
my_nginx:
image: "nginx"
ports:
- "8080:9090"
volumes:
- "/root/docker_vol/web/dist:/usr/share/nginx/html:ro"
- "/root/docker_vol/web/conf/nginx.conf:/etc/nginx/nginx.conf:ro"
docker-compose命令
在之前的例子中,我们使用了docker-compose up命令来启动一个容器编排,接下来,我们详细了解一下,在docker-compose中常用的命令以及参数使用
- docker-compose命令
常用参数:
-f
默认docker-compose会在当前文件夹下询招Dockercompose.yml文件,如果需要自定义文件名,可以使用-f 文件名 形式来指定
-p
指定项目名称 指定项目后,通过compoose创建的所有容器都会自动添加项目名称前缀
-v
查看当前docker-compose的版本信息
- docker-compose 环境变量
docker compose 默认的环境变量为.env,在其中我们可以使用对应的键值对模式给compose传递值 --env-file 参数可以动态制动compose需要使用的配置文件位置
- docker-compose up 启动一个容器编排
常用参数: `
参数名称 |
说明 |
-d |
后台运行 |
–force-recreate |
强制更新已经存在的容器 |
–remove-orphans |
删除在compose文件中没有定义的容器,通常使用在修改了compose文件的场景下使用服务名 单独启动compose中的某一个服务,如果服务存在依赖,则被依赖的服务也会被启动 |
docker-compose down |
删除对应的容器,网络服务 |
docker-compose stop |
停止compose对应的所有服务 |
docker-compose start |
启动所有的服务容器 |
docker-compose ps |
查看与当前compse相关的服务容器 |
-q |
只列出id值,其他值不显示 |
docker-compose logs |
读取日志信息 |
docker-compose pull |
拉取服务对应的镜像 |
docker-compose build |
构建compose中的所有镜像、 |
docker-compose images |
查看所有的镜像信息 |
docker-compose config |
查看配置文件信息 |
docker-compose restart |
重启服务 |
docker-compose exec 服务名 |
进行指定服务的容器 |
docker-compose rm |
删除所有已经停止的服务容器 |
以上命令涉及到某个服务的时候均可以通过:命令:服务名对相应的服务进行操作 |
看左面 |
docker compose 网络管理
- 默认场景下,使用docker compose编排服务,会自动创建对应的网络。可以使用docker network ls
以及docker inspect 网络id 进行相关的查询。
- 可以在compose文件中,使用networks
定义一个网络,并在服务中使用networks属性加入一个自定义网络。这时候有三种结果,如果所有的服务都加入到了自定义网络,则docker,会创建自定义网络,并将所有的服务容器添加到对应的网络中,如果没有任何服务声明加入自定义网络,则docker会创建默认网络,然后将容器添加到默认网络,而不会创建自定义网络,如果有的服务声明添加到自定义网络,而有的服务没有声明,则docker会创建两个网络,一个是自定义网络,而另一个是默认网络,并将对应的容器添加到对应的网络中。
- 使用固定ip策略
version: '3.3'
services:
cslcp_web:
image: "cslcp_web_image:v01"
ports:
- "19090:8080"
build:
context: "../web/"
dockerfile: "Dockerfile"
networks:
- "cslcp_net"
cslcp_mysql:
image: "mysql"
networks:
cslcp_net:
ipv4_address: 192.168.13.100
ports:
- "13306:3306"
environment:
MYSQL_ROOT_PASSWORD: 'root'
cslcp_centos:
container_name: 'test_centos'
image: "centos"
tty: true
networks:
cslcp_net:
ipv4_address: 192.168.13.11
networks:
cslcp_net:
ipam:
config:
- subnet: "192.168.13.0/24"
gateway: "192.168.13.1"
- 使用服务策略
当compose启动成功后可以直接使用ping 访问服务名
- 使用网络别名策略
networks:
cslcp_net:
ipam:
config:
- gateway: 192.168.13.1
subnet: 192.168.13.0/24
services:
cslcp_centos:
container_name: test_centos
depends_on:
cslcp_web:
condition: service_started
image: centos
links:
- cslcp_web:cw
networks:
cslcp_net:
ipv4_address: 192.168.13.11
tty: true
cslcp_mysql:
environment:
MYSQL_ROOT_PASSWORD: root
image: mysql
networks:
cslcp_net:
ipv4_address: 192.168.13.100
ports:
- published: 13306
target: 33064
cslcp_web:
build:
context: /root/docker/dockercompose/cslcp/web
dockerfile: Dockerfile
image: cslcp_web_image:v01
networks:
cslcp_net: null
ports:
- published: 19090
target: 8080
version: '3.3'
- 使用container 策略
version: '3.3'
services:
cslcp_web:
image: "cslcp_web_image:v01"
build:
context: "../web/"
dockerfile: "Dockerfile"
depends_on:
- "cslcp_centos"
network_mode: "service:cslcp_centos"
cslcp_mysql:
image: "mysql"
environment:
MYSQL_ROOT_PASSWORD: 'root'
depends_on:
- "cslcp_centos"
network_mode: "service:cslcp_centos"
cslcp_centos:
container_name: 'test_centos'
image: "centos"
tty: true
ports:
- "17070:8080"
- "13306:3306"
networks:
cslcp_net:
ipv4_address: 192.168.13.11
networks:
cslcp_net:
ipam:
config:
- subnet: "192.168.13.0/24"
gateway: "192.168.13.1"
制作整理不易,以上内容均为原创(参考了部分官方文档和老师整理的案例)。如要引用请附上本文链接,如有疑问可以在评论区畅所欲言,作者看到会第一时间回复,欢迎交流!