docker-compose
这章以实例为主,学习他的语法,以及docker-compose的使用思路。下面简单的例子可以通过docker-compose官网获得。该🌰涉及的语法不是全部,但是理解他的设计架构后后面的一些参数也能自行学习了。
Docker-compose文件讲解
-
Docker-compos默认使用docker-compose.yml为文件名,或者用-f参数指定定义文件。
-
Docker-compose使用YAML文件来定义
多服务应用
,YAML是json的子集,所以也可以用json编写。 -
下面的例子包含两个服务:web-fe 和 redies 。此例子用来运行一个对访问者计数并保存到redies的简单web服务,🌰如下。
version: '3.5'
services:
web-fe:
build: .
command: python app.py
ports:
- target: 5000
published: 5000
networks:
- counter-net
volumes:
- type: volume
source: counter-vol
target: /code
redis:
image: "redis:alpine"
networks:
counter-net:
networks:
counter-net:
volumes:
counter-vol:
结构分析
上述例子包含4个一级key:
- version
- 总是定义在第一行,用于指定compose文件格式(只要是API)的版本,建议使用最新版。
- version不是定义Docker-compose或者docker引擎版本号。若有兼容性问题,搜索“Compose file”。
- services:用于定义不同的应用服务,Docker Compose会将每个服务部署在各自容器中。 例子中有两个服务,也都将部署在各自的容器中
- networks: 用于指引Docker创建新的网络,默认 Docker-compose会创建
bridge网络
,该网络是一种单主机网络,只能实现同一个主机上容器连接。(计算机网络基础是真的薄弱,后面会更新计算机网络的博客,暂时用下面张图理解下桥接)
想要修改网络模式,使用driver指定不同的网络类型。以下代码创建Overlay网络,允许独立的容器,连接到该网络上。
networks:
over-net:
driver: overlay
attachable: true
- volumes
- 用于创建数据卷
接着分析一级key下面的描述
- version
- 服务名:
- build: . 指定当前目录下的Dockerfile中定义的指令来构建新镜像
- command:指定docker容器中执行的命令。
- ports:指定-target的端口映射到主机的published端口
- networks: 使得Docker将服务连接到指定网络。counter-net是自己取的网络的名字。我们可以看到web-fe和redies指定的网络名字是一样的,所以他们可以进行网络互通。如果该网络不存在,则需要在一级key中的networks定义。如果网络类型为Overlay,则还需要定义attachable,如此独立的两个容器才能互联。
- volumes: 可以将vounter-vol卷(source:)挂载到容器内的/code(target:)中。vounter-vol卷如果不存在需要在文件下方一级key,volumes中指定。
如何看数据卷存放位置
,执行docker volume inspect [卷标名称]就可以看到。
- 服务名:
docker-compose命令
启动docker-compose
docker-compose定义完毕后,接下来就看如何利用命令行进行使用吧。
docker-compose up
- 该命令用于启动,执行定义文件中的内容,执行后会构建所需要的镜像,创建网络和卷,启动容器。
- 该命令会默认查找docker-compose.yml文件,让然也可以指定yaml文件进行执行:
docker-compose -f xxxxxx.yml up
. - 在命令后添加-d 可在后台启动应用。
执行完毕后查看的镜像:
- 其中counter-app_web-fe、redis是我们定义的服务产生的镜像,python是在构建web-fe过程中使用的基础镜像。
- 这里提醒下,counter-app是项目名,web-fe是服务名,部署后构建的镜像名字会遵循 项目名_服务名这种规范。redis不是我们构建的,所以不用遵循。
查看启动的容器:
查看网络:
查看数据卷:
至此,应用部署完毕。
使用命令行管理Docker Compose起的应用的生命周期
关闭删除应用:docker-compose down
- 关闭应用做了一下几个动作:1、关闭启动的容器;2、定义的网络被删除;
- 值得注意的是,数据卷没有被删除,卷的生命周期与容器是完全节后的,卷内的内容是原容器中的数据,当然也不会被删除。
显示服务内运行的进程:docker-compose top
停止应用docker-compose stop
- 该命令只会停止任务,不会删除资源
删除已停止的Compose应用:docker-compose rm 应用名
重启应用:docker-compose restart
————————————————————————————————————————
end:
晚安! my lovers,有你们狠幸福。