1. 概述

问题:如果要使用 Docker 运行 LNMP 架构,那么 NginxMySQLPHPLinux三个服务运行在一个容器里,还是运行在多个容器里呢?

答案是都可以。

  • 你可以分别放在三个容器中
  • 也可以全部放在一个容器中
  • 还可以 PHPLinuxNginx共用一个容器,MySQL 单独一个容器
  • 甚至还可以分别做多个容器,实现更复杂的架构

如果实现一个容器架构(微服务架构),一个个的 docker run 启动很麻烦,更麻烦的是容器之间的连接与交互。所以我们需要用到容器编排。

2. 使用步骤

Docker Compose 将所管理的容器分为三层:

  • 工程(project)
  • 服务(service)
  • 容器(contaienr)

Docker Compose 运行的目录下的所有文件(docker-compose.ymlextends 文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。

一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、关系,一个服务当中可包括多个容器实例。

使用 Compose 基本上分为三步:

  1. Dockerfile 定义应用的运行环境(镜像)
  2. docker-compose.yml 定义组成应用的各服务
  3. docker-compose up -d 构建并启动整个应用

​Docker Compose 是一个由 Python 编写的软件,在拥有 Python 运行环境的机器上,我们可以直接运行它,不需要其它的操作。

3. 安装

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$
$ sudo docker-compose version
docker-compose version 1.21.2, build a133471
docker-py version: 3.3.0
CPython version: 3.6.5
OpenSSL version: OpenSSL 1.0.1t  3 May 2016

我们也能够通过 Python 的包管理工具 pip 来安装 Docker Compose

$ sudo pip install docker-compose

4. 常见语法

Docker Compose 使用 Yaml 格式文件来编排。

参考: https://docs.docker.com/compose/compose-file/

Dockerfile 采用 Dockerfile 这个名字作为镜像构建定义的默认文件名一样,Docker Compose 的配置文件也有一个缺省的文件名,也就是 docker-compose.yml,如非必要,我建议大家直接使用这个文件名来做 Docker Compose 项目的定义。

4.1 build

指定镜像构建时的 dockerfile 目录,格式一般为绝对路径目录或相对路径目录(dockerfile需要命名为 Dockerfile):

build: /path/to/build/dir
或者
build: ./dir

4.2 image

指定要启动容器的镜像:

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd

如果镜像不存在,Compose 尝试拉它。

如果指定了构建,可以使用指定的选项构建它,并使用指定的 tag 进行标记。

4.3 environment

设置镜像变量,它可以保存变量到镜像里面,也就是说启动的容器也会包含这些变量设置。

environmentDockerfile 中的 ENV 指令一样,会把变量一直保存在镜像、容器中。

格式

environment:RACK_ENV: developmentSHOW: 'true'
或
environment:- RACK_ENV=development- SHOW=true

4.4 expose:

这个标签与 Dockerfile 中的 EXPOSE 指令一样,用于指定暴露的端口,但只将端口暴露给连接的服务,而不暴露给主机。

expose:- "3000"- "8000"

4.5 ports

映射端口,可以使用 HOST:CONTAINER 的方式指定端口,也可以指定容器端口(选择临时主机端口),宿主机会随机映射端口。

ports:- "3000"- "3000-3005"- "8000:8000"- "9090-9091:8080-8081"- "49100:22"- "127.0.0.1:8001:8001"- "127.0.0.1:5000-5010:5000-5010"- "6060:6060/udp"

4.6 restart

指定 Docker 容器的重启策略。

默认值为 no,即在任何情况下都不会重新启动容器

  • 当值为 always 时,容器退出时总是重新启动(会随着 Docker 服务启动而启动容器)
  • 当值为 on-failure 时,当出现 on-failure 报错(非正常退出,退出状态非 0),才会重启容器
  • 当值为 unless-stopped 时,在容器退出时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了的容器
restart: "no"
restart: always
restart: on-failure
restart: on-failure:3
restart: unless-stopped

4.7 volume

数据卷挂载,可以直接使用 HOST:CONTAINER 这样的格式,或者使用 HOST:CONTAINER:ro 这样的格式,ro 代表数据卷是只读的。

volumes:### 只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)。- /var/lib/mysql### 使用绝对路径挂载数据卷- /opt/data:/var/lib/mysql### 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。- ./cache:/tmp/cache### 使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。- ~/configs:/etc/configs/:ro### 已经存在的命名的数据卷。- datavolume:/var/lib/mysqlvolumes:### 只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)。- /var/lib/mysql### 使用绝对路径挂载数据卷- /opt/data:/var/lib/mysql### 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。- ./cache:/tmp/cache### 使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。- ~/configs:/etc/configs/:ro### 已经存在的命名的数据卷。- datavolume:/var/lib/mysql

4.8 depends_on

此标签解决了容器的依赖、启动先后的问题。

version: '3'
services:web:build: .depends_on:- db- redisredis:image: redisdb:image: mysql

使用 docker-compose up web 启动,会先启动 RedisDB,再启动 Web

4.9 links

链接到其它服务的中的容器,与 link 连接一样效果,会连接到其它服务中的容器。

web:links:- db- db:database- redis

5. 综合案例:容器化应用部署实践

5.1 环境配置

在宿主机上打开 ip_forward,为我们下面要映射容器的端口到宿主机,只有打开 ip_forward 才能映射成功。

### vim /etc/sysctl.conf
net.ipv4.ip_forward=1
### sysctl -p

5.2 部署 WordPress 应用

  1. 创建一个名为 wordpress 的 project(工程):
[root@daniel ~]### mkdir -p /docker-compose/wordpress
[root@daniel ~]### cd /docker-compose/wordpress
  1. 创建 docker-compose.yml:
[root@daniel wordpress]### vim docker-compose.yml
version: '3'
services:db:image: mysql:5.7volumes:- "./data:/var/lib/mysql"restart: alwaysenvironment:MYSQL_ROOT_PASSWORD: wordpressMYSQL_DATABASE: wordpressMYSQL_USER: wordpressMYSQL_PASSWORD: wordpressexpose:- "3306"wordpress:depends_on:- dbimage: wordpress:latestlinks:- dbports:- "8010:80"restart: alwaysenvironment:WORDPRESS_DB_HOST: db:3306WORDPRESS_DB_PASSWORD: wordpress

说明:这个应用定义了两个容器服务:dbwordpress

db 容器通 mysql:5.7 镜像启动:

  • MySQL 的数据目录挂载到当前目录 ./data,此目录不存在会自动创建
  • 容器重启策略为 always
  • 设置了连接 MySQL 的 4 个变量

wordpress 容器通过 wordpress:latest 启动:

  • 需要 db 容器先启动再启动 wordpress 容器
  • wordpress 容器要 link 连接 db 容器
  • wordpress 容器将 80 端口映射到宿主机的 8010 端口
  • 容器重启策略为 always
  • 设置连接数据库的变量
  1. 启动:

对于开发来说,最常使用的 Docker Compose 命令就是 docker-compose updocker-compose down 了。

docker-compose up 命令类似于 Docker Engine 中的 docker run,它会根据 docker-compose.yml 中配置的内容,创建所有的容器、网络、数据卷等等内容,并将它们启动。与 docker run 一样,默认情况下 docker-compose up 会在“前台”运行,我们可以用 -d 选项使其“后台”运行。事实上,我们大多数情况都会加上 -d 选项。

[root@daniel wordpress]### docker-compose up -d

如果本地没有镜像,下载的两个镜像比较大。

[root@daniel wordpress]### docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               5.7                 e9c354083de7        3 days ago          373MB
wordpress           latest              4ba1e63bd20c        8 days ago          501MB

需要注意的是,docker-compose 命令默认会识别当前控制台所在目录内的 docker-compose.yml 文件,而会以这个目录的名字作为组装的应用项目的名称。如果我们需要改变它们,可以通过选项 -f 来修改识别的 Docker Compose 配置文件,通过 -p 选项来定义项目名。

docker-compose -f ./compose/docker-compose.yml -p myapp up -d

docker-compose up 相反,docker-compose down 命令用于停止所有的容器,并将它们删除,同时消除网络等配置内容,也就是几乎将这个 Docker Compose 项目的所有影响从 Docker 中清除。

 docker-compose down
  1. 安装与访问

在浏览器端,访问容器主机的 8010 端口,安装访问,最终效果如下:

6. 容器命令

Docker Engine 中,如果我们想要查看容器中主进程的输出内容,可以使用 docker logs 命令。而由于在 Docker Compose 下运行的服务,其命名都是由 Docker Compose 自动完成的,如果我们直接使用 docker logs 就需要先找到容器的名字,这显然有些麻烦了。我们可以直接使用 docker-compose logs 命令来完成这项工作。

$ sudo docker-compose logs nginx

docker-compose logs 衔接的是 Docker Compose 中所定义的服务的名称。

同理,在 Docker Compose 还有几个类似的命令可以单独控制某个或某些服务。

通过 docker-compose createdocker-compose startdocker-compose stop 我们可以实现与 docker createdocker startdocker stop 相似的效果,只不过操作的对象由 Docker Engine 中的容器变为了 Docker Compose 中的服务。

$ sudo docker-compose create webapp
$ sudo docker-compose start webapp
$ sudo docker-compose stop webapp

https://gitbook.cn/books/5fb91715f25ffc2d3e3d2983/index.html

Docker compose 容器编排相关推荐

  1. Docker学习(六):docker compose容器编排

    Docker-compose 实现对容器集群的快速编排 多服务部署的管理工具 定义docker-compose.yml文件,写好容器之间的调用关系,通过命令完成多个容器的同时启动关闭 解决了容器与容器 ...

  2. Docker Compose 容器编排基础使用

    Compose 是用于定义和运行多容器 Docker 应用程序的工具.通过 Compose,可以使用 YML 文件来配置应用程序需要的所有服务.然后,使用一个命令,就可以从 YML 文件配置中创建并启 ...

  3. Docker Compose容器编排

    Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用.你需要定义一个 YAML 格式的配置文件docker-compose.yml, 写好多个容器之间 ...

  4. 这就是你日日夜夜想要的docker!!!---------Docker Compose容器编排理论+实操

    文章目录 一.Compose简介 1.在Compose中有两个重要的概念 2.docker,dockerfile与docker-compose区别 二.Compose安装与卸载 1.Centos系统安 ...

  5. Docker 多容器编排Swarm(六)

    docker swarm简介 Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机 ...

  6. 浅述 Docker 的容器编排

    作者 | 天元浪子 来源 | CSDN博客 概述 作为容器引擎,Docker为容器化的应用程序提供了开放标准,使得开发者可以用管理应用程序的方式来管理基础架构,实现快速交付.测试和部署代码.随着容器的 ...

  7. docker Swarm容器编排工具

    目录 一.什么是docker swarm 二.Docker Swarm 基本结构 三.Swarm的几个关键概念 四.swarm的调度策略 五.Swarm Cluster模式特性 六.搭建docker ...

  8. dockers-系统学习-docker compose服务编排

    dockers-系统学习-docker compose服务编排 一.服务编排 1.1.概念 按照一定的业务规则批量管理容器 1.2.问题 微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会 ...

  9. 基于 Docker Compose 容器化搭建 Wordpress

    基于 Docker Compose 容器化搭建 Wordpress 最近由于业务需求帮公司搞了几个 Wordpress 作为官网,中间也是踩了不少坑,倒不是搭建 wordpress 难,主要是 wor ...

最新文章

  1. css( div和span)——读书笔记
  2. 树莓派400键盘计算机发布!全新的电路板布局,更快,更酷!
  3. 面试常考:Synchronized 有几种用法?
  4. Ant远程部署到Tomcat
  5. Android开发之API29以上Environment.getExternalStoragePublicDirectory废弃的问题
  6. pythonopencv显示图像_OpenCV-Python 读取显示图像 | 五
  7. 【kafka】kafka_2.11-1.1.0 配置 SASL_PLAINTEXT 认证方式
  8. utilities(matlab)—— 图像加噪
  9. Java和JavaScript中使用Json方法大全
  10. myeclipse 配置 SVN
  11. 【CS229机器学习】作业 Problem Set #1 有监督学习
  12. MapGIS制图学习(1)
  13. TCP通信调试助手===wireshark使用
  14. Matlab:厄米-高斯光束合成拉盖尔-高斯光束
  15. 豆瓣8.0高分电影~渣男人格之《剧场》追剧后感
  16. 【无标题】智慧校园管理系统-毕设项目(包含数据库)
  17. Internet Explorer无法打开Internet站点
  18. NO.83 常用二维码对比(QR、PDF417、DM、汉信码)
  19. 评论回复功能 asp.net_LR2021颜色分级功能让照片调色简单有趣好玩!最新尝鲜测试...
  20. scrcpy投屏教程、及无线投屏

热门文章

  1. 前端Vue学习之路(二)-Vue-router路由
  2. debian10 简单的bash脚本监控apache运行状态
  3. 【Linux系统】基础总结
  4. spark,hadoop区别
  5. ?:在正则表达式中什么意思
  6. relay.build调用关系
  7. 自动调试用于移动GPU的卷积网络
  8. 降低数值精度以提高深度学习性能
  9. 人工智能微控制器体系结构
  10. 模型压缩95%:Lite Transformer,MIT韩松等人