【云原生 | 从零开始学 Docker】九丶完结篇 Docker Compose
简介
之前在制作 dockerfile 的时候,流程是写完然后 build 然后 run,这还是单个的容器,比如公司有五十个微服务,难道要打包五十个 docker 吗,依赖关系啥的手动操作很麻烦!这个时候使用 dockercompose 高效的管理,可以定义运行多个容器!
定义,运行多个容器。 YAML file 配置文件,single command 命令有哪些。所有环境都可以使用 dockercompose,以及它的三个步骤:
1.定义应用的环境 dockerfile,保证项目在任何地方都可以运行
2.定义一个服务,把应用写在 dockercomposeyml 文件里。
3.启动跟停止项目
个人理解
compose 是 docker 官方的开源项目,需要安装!
dockerfile 让程序在任何地方运行。在一个 web 服务,链接 redis,mysql,nginx 等一个一个启动太麻烦了,compose 为此而生。
docker-compose 是 docker 官方提供的容器编排工具!
官方文档是这样的
compose 重要概念 1.服务 services,容器,应用(web,redis,mysql 都可以想成单独的服务),跑起来是一个完整的项目。2.可以把它想象成一个项目,project。也就是一组关联的容器!下载
有 compose 就完成了。
原理
Compose 项目是由 Python 编写的,实际上就是调用了 Docker 服务提供的 API 来对容器进行管理,因此,只要所在的操作系统的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。
compose 中常常提及的概念:
project
通过 docker compose 管理的一个项目被抽象称为一个 project,它是由一组关联的应用容器组成的一个完整的业务单元。简单点说就是一个 docker-compose.yml 文件定义一个 project。我们可以在执行 docker-compose 命令时通过 -p 选项指定 project 的名称,如果不指定,则默认是 docker-compose.yml 文件所在的目录名称。
service
运行一个应用的容器,实际上可以是一个或多个运行相同镜像的容器。可以通过 docker-compose up 命令的 --scale 选项指定某个 service 运行的容器个数,比如:
compose 流程调用
重新启动 services
前面我们提到当前宿主机已经存在与该应用对应的容器,docker-compose 会进行判断并决定是否重新启动已有服务。
强制 recreate
Recreate 就是删除现有的容器并且重新创建新的容器,为 docker-compose up 命令指定 --force-recreate 选项可以强制 recreate 容器。
创建个别容器
如果应用中的个别 service 对应的容器被删除了,docker-compose up 命令会新建相关的容器。
启动个别容器
与上面类似,如果应用中的个别 service 对应的容器被停止(stop)了,docker-compose up 命令会重新启动相关的容器。
体验
跟着官方来搞一个玩玩
1.创建一个目录然后进入。
2.创建一个文件(app.py)在当前目录下!
然后写一个依赖包 requirements.txt
这是未来 dockerfile 里要用的,单独没啥用写一个 dockerfile
在 compose 里部署一个服务,以前是一个一个 run 服务,现在定义一个 docker-compose.yml
最后 buildandrun 一下就可以了docker-compose up
1.创建网络 2.启动 yaml3.启动服务
正常启动成功有两个服务
docker images 查看 docker compose 的东西全都自动下载了
网络规则只要通过 compose 启动就会生成自己的网络!
比如运行十个服务,要打包成一个项目,这个项目上了之后对内网络十分麻烦,compose 自动帮我们维护了这些(项目中内容都在同一个网络下面。域名访问)
我们现在就可以写 mysql:3306 来访问了!
可能有十个容器实例,都跑的 mysql,十个就是十个 ip 写死了肯定不行,这个时候我们把它们写成 mysql,访问就会通过 mysql 到后面这里。
用 docker network inspect 服务名来查看这个 发现没有问题
如果没有在一个网络下或者没有联通是 ping 不通的 官方这里把 host 改成 redis 了,可以直接通过 redis 访问!如果在同一个网络下就直接通过域名访问,如果服务挂了重新拉就行了,比如这里的 redis 是 03,可能重新拉是 04,重新拉之后连接还是没有问题,这就是好处。
可以通过编写 dockercompose yaml 文件一键启动所有服务!
yaml 规则
docker compose yaml 核心
然后很重要的这个:依赖,我们项目是有启动顺序的,比如 web 启动需要 redis,现在得保证先启动 redis,不然 web 启动会报错,这个时候需要使用 depends_on 保证关系,比如上面 web 依赖于 redis 和 postgres,web 下面要写 depends_on 这两个。
后面 dns,entrypoint,environment 环境都可以配置 比如 mysql 密码
实战 搭建博客
1.创建目录 my_wordpressr 然后进入
2.写 docker-compose.yml
服务里第一个是 db 数据库 第二个是 wordpress,博客,博客下面有 dpon 先启动 db 然后 restart 是否重启 always 总是重启 environment 是键值对(默认规则) 下面的是 image 下载了镜像,然后暴露 8000 端口,然后 env 是怎么连接数据库 密码 名字 用户名等 然后是 volumes 数据卷。
然后可以直接访问 ip:8000 了!可以在后台看到日志信息
docker-compose -d
也是后台启动
写在最后
Docker 篇终于完结了!如果我的文章帮助到你了,希望你可以给我个关注,点赞,收藏支持一下,这将是我更新的动力,感谢你们的支持!咱们 k8s 见!
版权声明: 本文为 InfoQ 作者【泡泡】的原创文章。
原文链接:【http://xie.infoq.cn/article/84b33e5c303cece79e629054f】。未经作者许可,禁止转载。
评论