Docker compose 容器编排
1. 概述
问题:如果要使用 Docker
运行 LNMP
架构,那么 Nginx
、MySQL
、PHP
、 Linux
三个服务运行在一个容器里,还是运行在多个容器里呢?
答案是都可以。
- 你可以分别放在三个容器中
- 也可以全部放在一个容器中
- 还可以
PHP
、Linux
、Nginx
共用一个容器,MySQL
单独一个容器 - 甚至还可以分别做多个容器,实现更复杂的架构
如果实现一个容器架构(微服务架构),一个个的 docker run
启动很麻烦,更麻烦的是容器之间的连接与交互。所以我们需要用到容器编排。
2. 使用步骤
Docker Compose
将所管理的容器分为三层:
- 工程(project)
- 服务(service)
- 容器(contaienr)
Docker Compose
运行的目录下的所有文件(docker-compose.yml
、extends
文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。
一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、关系,一个服务当中可包括多个容器实例。
使用 Compose
基本上分为三步:
Dockerfile
定义应用的运行环境(镜像)docker-compose.yml
定义组成应用的各服务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
设置镜像变量,它可以保存变量到镜像里面,也就是说启动的容器也会包含这些变量设置。
environment
和 Dockerfile
中的 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
启动,会先启动 Redis
和 DB
,再启动 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 应用
- 创建一个名为 wordpress 的 project(工程):
[root@daniel ~]### mkdir -p /docker-compose/wordpress
[root@daniel ~]### cd /docker-compose/wordpress
- 创建 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
说明:这个应用定义了两个容器服务:db
、wordpress
。
db
容器通 mysql:5.7
镜像启动:
MySQL
的数据目录挂载到当前目录./data
,此目录不存在会自动创建- 容器重启策略为
always
- 设置了连接
MySQ
L 的 4 个变量
wordpress
容器通过 wordpress:latest
启动:
- 需要
db
容器先启动再启动wordpress
容器 wordpress
容器要link
连接db
容器wordpress
容器将80
端口映射到宿主机的8010
端口- 容器重启策略为
always
- 设置连接数据库的变量
- 启动:
对于开发来说,最常使用的 Docker Compose
命令就是 docker-compose up
和 docker-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
- 安装与访问
在浏览器端,访问容器主机的 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 create
,docker-compose start
和 docker-compose stop
我们可以实现与 docker create
,docker start
和 docker 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 容器编排相关推荐
- Docker学习(六):docker compose容器编排
Docker-compose 实现对容器集群的快速编排 多服务部署的管理工具 定义docker-compose.yml文件,写好容器之间的调用关系,通过命令完成多个容器的同时启动关闭 解决了容器与容器 ...
- Docker Compose 容器编排基础使用
Compose 是用于定义和运行多容器 Docker 应用程序的工具.通过 Compose,可以使用 YML 文件来配置应用程序需要的所有服务.然后,使用一个命令,就可以从 YML 文件配置中创建并启 ...
- Docker Compose容器编排
Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用.你需要定义一个 YAML 格式的配置文件docker-compose.yml, 写好多个容器之间 ...
- 这就是你日日夜夜想要的docker!!!---------Docker Compose容器编排理论+实操
文章目录 一.Compose简介 1.在Compose中有两个重要的概念 2.docker,dockerfile与docker-compose区别 二.Compose安装与卸载 1.Centos系统安 ...
- Docker 多容器编排Swarm(六)
docker swarm简介 Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机 ...
- 浅述 Docker 的容器编排
作者 | 天元浪子 来源 | CSDN博客 概述 作为容器引擎,Docker为容器化的应用程序提供了开放标准,使得开发者可以用管理应用程序的方式来管理基础架构,实现快速交付.测试和部署代码.随着容器的 ...
- docker Swarm容器编排工具
目录 一.什么是docker swarm 二.Docker Swarm 基本结构 三.Swarm的几个关键概念 四.swarm的调度策略 五.Swarm Cluster模式特性 六.搭建docker ...
- dockers-系统学习-docker compose服务编排
dockers-系统学习-docker compose服务编排 一.服务编排 1.1.概念 按照一定的业务规则批量管理容器 1.2.问题 微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会 ...
- 基于 Docker Compose 容器化搭建 Wordpress
基于 Docker Compose 容器化搭建 Wordpress 最近由于业务需求帮公司搞了几个 Wordpress 作为官网,中间也是踩了不少坑,倒不是搭建 wordpress 难,主要是 wor ...
最新文章
- css( div和span)——读书笔记
- 树莓派400键盘计算机发布!全新的电路板布局,更快,更酷!
- 面试常考:Synchronized 有几种用法?
- Ant远程部署到Tomcat
- Android开发之API29以上Environment.getExternalStoragePublicDirectory废弃的问题
- pythonopencv显示图像_OpenCV-Python 读取显示图像 | 五
- 【kafka】kafka_2.11-1.1.0 配置 SASL_PLAINTEXT 认证方式
- utilities(matlab)—— 图像加噪
- Java和JavaScript中使用Json方法大全
- myeclipse 配置 SVN
- 【CS229机器学习】作业 Problem Set #1 有监督学习
- MapGIS制图学习(1)
- TCP通信调试助手===wireshark使用
- Matlab:厄米-高斯光束合成拉盖尔-高斯光束
- 豆瓣8.0高分电影~渣男人格之《剧场》追剧后感
- 【无标题】智慧校园管理系统-毕设项目(包含数据库)
- Internet Explorer无法打开Internet站点
- NO.83 常用二维码对比(QR、PDF417、DM、汉信码)
- 评论回复功能 asp.net_LR2021颜色分级功能让照片调色简单有趣好玩!最新尝鲜测试...
- scrcpy投屏教程、及无线投屏