一、Docker Compose概念
Docker Compose (可简称Compose)是一个定义与运行复杂应用程序的 Docker 工具,是 Docker 官
方 编排(Orchestration) 项目之一,负责快速在集群中部署分布式应用。
1、为什么要使用 Docker Compose部署容器
仅使用docker命令部署和管理多容器:应用程序时往往需要编写若干脚本文件,使用的命令可能会变得
冗长,包括大量的选项和参数,配置过程比较复杂,而且容易发生差错。
Docker Compose 实质:不是通过脚本和各种docker命令将多个容器组织起来,而是通过一个声明式
的配置文件描述整个应用程序,从而让用户使用一条命令即可完成整个应用程序的部署。
Docker Compose 功能:将逻辑关联的多个容器编排为一个整体进行统一管理,提高了应用程序部署效
率。
2、Docker Compose项目概念
Docker Compose 以项目为单位管理应用程序的部署。按从上到下依次分为以下三个层次。
项目(project):一组关联的容器组成一个完整的业务单位,实现一个应用程序,涵盖应用程序所需的所有资源。在 docker-compose.yml 文件中定义。
服务(service):具体定义容器运行的镜像.可以包括若干运行相同镜像的容器实例。
容器(container):指的是服务的副本。每个服务可以以多个容器实例的形式运行。
3、使用Docker Compose的基本步骤
1. 使用 Dockerfile 定义应用程序的环境,以便可以在任何地方分发。Compose编排主要是用于多容器的复杂应用程序,但是镜像还是要基于Dockerfile构建。
2. 使用Compose文件 docker-compose.yml 定义组成应用程序的服务。文件声明的配置,可以定义包含多个相关互联的容器的程序(服务)。
3. 执行 docker-compose up 命令启动整个应用程序。
二、Docker Compose基本操作
1、安装 Compose
从GITHUB上的Docker Compose 仓库下载docker-compose二进制文件进行安装。
1.curl命令从GitHub上的Docker Compose仓库下载二进制文件
语法:curl -L "https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
2.为该二进制文件添加可执行权限
语法: chmod +x /usr/local/bin/docker-compose
3.进行命令测试
语法:docker-compose --version
2、卸载Compose
两种不同的安装方式,使用不同的卸载方法如下:
- # 如通过 pip 安装,则可以以如下方式删除
$ pip uninstall docker-compose - # 二进制包安装,则删除二级制文件即可
[root@hecs-hqs-01 ~]# rm /usr/local/bin/docker-compose
3、使用Docker Compose 部署 WordPress
WordPress是个人博客系统,逐步演化成一款内容管理系统软件。使用PHP和mysql开发。
以部署 WordPress 为例示范使用 Compose进行容器编排的完整过程。
1.定义项目,切换到该项目目录
[root@hecs-hqs-01 ~]# mkdir my_wordpress && cd my_wordpress
[root@hecs-hqs-01 ~]# mkdir my_wordpress && cd my_wordpress //创建目录
2.创建并编辑docker-compose.yml 的compose文件来定义项目
[root@hecs-hqs-01 my_wordpress]# vi docker-compose.yml
version: '3.3' //compose版本
services: //指定了db,wordpress两个服务
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on: //将wordpress和db服务相依赖
- db
image: wordpress:latest //指定镜像
ports: //指定端口
- "8000:80"
restart: always //设置自启动
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes: //卷
db_data: {}
3.项目目录中执行docker-compose命令构建项目
[root@hecs-hqs-01 my_wordpress]# docker-compose up -d
[+] Running 34/34
⠿ wordpress Pulled
⠿ 42c077c10790 Pull complete
...略
4.执行命令查看运行中的容器
[root@hecs-hqs-01 my_wordpress]# docker ps
CONTAINER ID IMAGE COMMAND CREATED
49b78626c20c wordpress:latest "docker-entrypoint.s…" About a minute a
fecf57f4dfd8 mysql:5.7 "docker-entrypoint.s…" About a minute
5.在浏览器访问Wordpress
在浏览器访问:http://192.168.200.103:8000/
注册账号,完成登录后,可以进入wordpress首页。
6.关闭和清理
[root@localhost my_wordpress]# docker-compose down --volumes //删除容器、默认网络、卷
[+] Running 4/4
⠿ Container my_wordpress-wordpress-1 Removed 1.
⠿ Container my_wordpress-db-1 Remov... 1.
⠿ Volume my_wordpress_db_data Remov... 0.
⠿ Network my_wordpress_default Remo...
三、编写Compose文件
模板文件是使用 Compose 的核心,大部分指令和 docker run 相关参数含义类似。
默认的模板文件名称为 docker-compose.yml ,格式为YAML格式。
1、YAML文件格式
YAML 是一种可读性很强的数据序列化格式,简洁、易于阅读,特别适合用来表示数据。
YAML 语法特点:
- 可读性强: YAML 使用缩进和空格来结构化数据,方便轻松阅读和编写,避免了复杂符合或标记。
- 结构: 通过层级结构组织数据,通过缩进来定义结构。
缩进时不允许使用 Tab 键,只允许使用空格。
缩进的空格数不重要,但同级元素必须左侧对齐。 - 注释: YAML 允许使用注释在数据中提供额外的信息和解释。注释以 # 字符开头,直到行尾结束。
- 每个冒号与后面所跟的参数之间都需要有一个空格。
- 大小写敏感。
(1)YAML数据类型
1. 标量(Scalar): 标量是简单的原子值,相当于常量,是YAML数据最小单位。
YAML 支持以下标量类型:
字符串(Strings):可以使用引号括起来,也可以不使用引号。
(1)YAML数据类型
1. 标量(Scalar): 标量是简单的原子值,相当于常量,是YAML数据最小单位。
YAML 支持以下标量类型:
- 布尔值(Boolean):表示真或者假, true 或 false 。
- 整数(Integers):表示整数值,如 '42'。
- 浮点数(Floats):表示浮点数值,如'3.14'。
- Null:表示空值,如 'null' 或 '-'。
- 时间:时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
- 日期:使用ISO 8601格式,即yyyy-MM-dd
查看代码
boolean:
- TRUE #true,True都可以
- FALSE #false,False都可以
float:
- 3.14
- 6.8523015e+5 #可以使用科学计数法
int:
- 123
- 0b1010_0111_0100_1010_1110 #二进制表示
null:
nodeName: 'node'
parent: ~ #使用~表示null
string:
- 哈哈
- 'Hello world' #可以使用双引号或者单引号包裹特殊字符
- newline
newline2 #字符串可以拆成多行,每一行会被转化成一个空格
date:
- 2018-02-17 #日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime:
- 2018-02-17T15:02:31+08:00 #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
2. 序列(Sequences): 序列是一组有序的值,用短横线( - )加空格表示一个序列项
示例:
查看代码
- 苹果
- 橙子
- 香蕉
3. 映射(Mappings): 映射是一组键值对,用冒号( : )表示,
示例:
查看代码
键: 值
名称: 红苹果
数量: 10
4. 多行文本块(Block Scalars): 多行文本块可以保留换行符和缩进,用管道符(| )表示,
示例:
查看代码
描述: |
这是一个多行
的描述文件
这些数据类型可以组合和嵌套在一起,以创建复杂的数据结构。
2、Compose文件结构
默认的模板文件名称为 docker-compose.yml ,格式为YAML格式。
compose可以包含4节:version,network,service,volume.采用缩进结构“<键>:<选项>:<值>”定义其配置,键也被称为字段.
版本2相比版本1,添加了版本信息,所有的服务放在 services 根下。案例如下:
version: "2" //compose文件格式版本
services: //定义服务的节
webapp:
image: examples/web
ports:
- "80:80"
network: //定义网络的节
volumes: //定义卷的节
- "/data"
注意:
- 每个服务都必须通过 image 指令指定镜像,或用 build 指令指定 Dockerfile 所在文件夹路径自动构建生成镜像。
- version 节必须指定,且总是位于文件第一行,没有任何下级节点。
- 版本2和版本3的 Compose 文件结构基本相同。
3、服务定义语法
在 services 节中定义服务,每个服务实际上就是一个容器,需要基于镜像运行。
在 Compose 文件中,必须通过 image 或 build 键提供镜像。
(1)image
image 键用于指定启动容器的镜像,可以是镜像名称或镜像ID
services:
foo:
image: busybox
environment:
- COMPOSE_PROJECT_NAME
command: echo "I'm running ${COMPOSE_PROJECT_NAME}"
注意:若镜像本地不存在, Docker Compose 会尝试从镜像注册中心拉取镜像。
(2)build
build 键用于定义构建镜像时的配置,可以定义包括构建上下文环境的字符串也可以定义一个对象。
build 键可以使用的选项:
context:定义构建上下文路径,可以是包括 Dockerfile 的目录,也可以是访问GIT仓库的URL。
dockerfile:指定 Dockerfile。
args:指定构建参数,仅在构建阶段访问的环境变量,允许是空值。
实例:
查看代码
1)上下文环境的字符串(相对路径)
services:
webapp:
build: ./dir
2)上下文环境(git 仓库URL)
services:
webapp:
build: https://github.com/mycompany/example.git#branch_or_tag:subdirectory
3)上下文环境指定路径的对象
build:
context: .
dockerfile: webapp.Dockerfile
4)同时指定 image 和 build ,将构建镜像并将镜像命名为 image 键定义的名称
services:
frontend:
image: awesome/webapp
build: ./webapp
backend:
image: awesome/database
build:
context: backend
dockerfile: ../backend.Dockerfile
(3)depends_on
该键定义服务之间的依赖,解决容器依赖、启动先后的问题。
示例:
version: "3.7"
services:
web:
build:
depends_on:
- db
- redis //使db和redis两个服务相依赖
redis:
image: redis
db:
image: postgre
上例中服务依赖效果:
- 按依赖顺序启动服务:db和redis先于web启动。
- 若执行 docker-compose up web(服务名) 会自动创建并启动db和redis。
- 停止服务时,按依赖顺序停止服务,web先于db和redis停止。
(4)networks
默认情况, Docker Compose 会为应用程序自动创建名为 [项目名]_default 的默认网络,服务的每个容器都加入默认网络。
注意:
- 该网络上容器间可以互访
- 可以通过主机名(与容器名称相同)互访
每个服务,也可以使用 network 键指定要连接的网络,需要使用 network 节中定义的网络名。
示例:
查看代码
services:
frontend:
image: awesome/webapp
networks:
- front-tier
- back-tier
networks:
front-tier:
back-tier:
aliases 选项比较特别,用来设置服务在该网络上的别名。
- 同网络的其他容器可通过服务名称或别名连接该服务的容器
- 同一服务可在不同网络上有不同别名
查看代码
version: "3.7"
services:
web:
image: "nginx:alpine"
networks:
- new
worker:
image: "my-worker-image:latest"
networks:
- legacy
db:
image: mysql
networks:
new:
aliases:
- database //db服务在new网络中的别名为database
legacy:
aliases:
- mysql //db服务在legacy网络中的别名为mysql
networks:
new:
legacy:
注意:以上的例子,web服务(其他服务)可以通过database和mysql别名访问到db服务
(5)volumes
此处 volumes 是服务的下级键,用于定义要挂载的主机路径或命名卷。
- 挂载主机路径作为单个服务定义一部分,不用在 volumes 节中定义卷
- 多个服务用一个卷,要在 volumes 节中定义卷,另外在服务中用 volumes 键引用。
volumes 键的定义有两种格式:
长格式:使用多个选项定义
示例:
# 案例:backend服务中分别进行了卷挂载和绑定挂载,db-data卷在volume节中定义
services:
backend:
image: awesome/backend
volumes:
- type: volume //卷挂载
source: db-data //指定卷
target: /data //目的文件路径
volume:
nocopy: true
- type: bind //绑定挂载
source: /var/run/postgres/postgres.sock //源地址
target: /var/run/postgres/postgres.sock //目的
volumes:
db-data:
短格式:直接使用 主机:容器 格式指定主机上的路径,或者使用 主机:容器:ro 格式定义访问模式
示例:
volumes:
# 仅定义一个路径,让docker引擎自动创建一个匿名卷
- /var/lib/mysql
# 定义一个绑定挂载
- /opt/data:/var/lib/mysql
# 定义主机上相当于compose文件路径
- ./cache:/tmp/cache
# 定义相对于用户的路径
- ~、configs:/etc/configs/:ro
# 命名卷
- datavolume:/var/lib/mysql
长格式语法:
查看代码
type:挂载类型 volume 、 bind 、 tmpfs 、 npipe
source:挂载的源(主机路径或卷),不适用于 tmpfs 挂载
target:挂载目标(容器中挂载路径)
read_only:将卷设置为只读模式
bind:配置绑定挂载选项
propagation:传播模式
create_host_path:若主机无内容,在源路径创建目录;若有内容,则不做任务事
selinux:SElinux 重新标识 选项 z(共享)、Z(私有)
volume:配置卷选项
nocopy:创建卷时禁止从容器复制数据
tmpfs:配置tmpfs选项
size:tmpfs挂载的大小,单位为字节
mode:tmpfs挂载文件模式以八进制数作为UNIX权限位
consistency:挂载的一致性要求
短格式语法:
查看代码
volume:主机路径或卷名
container_path:容器挂载卷的路径
access_mode:访问模式,rw读写模式、ro只读模式、z(selinux配置挂载主机内容在容器间共享)、Z(selinux配置挂载主机内容私有)
4、Django/PostgreSQL程序案例 ---待了解
准备上下文环境和相关文件:
查看代码
[root@master ~]# mkdir django && cd django
# 编辑Dockerfile
[root@master django]# vi Dockerfile
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple &&
COPY . /code/
# 编辑requirements.txt文件
[root@master django]# vi requirements.txt
Django>=2.0,<3.0
psycopg2>=2.7,<3.0
# 编辑docker-compose.yml文件
[root@master django]# cat docker-compose.yml
version: '3'
services:
db:
image: postgres
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
volumes:
- db_data:/var/lib/postgresql
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
volumes:
db_data: {}
创建项目和修改配置:
查看代码
# 创建Django项目
[root@master django]# docker-compose run web django-admin startproject myexample
# 查看所创建的项目内容
[root@master django]# ls
docker-compose.yml Dockerfile manage.py myexample requirements.txt
# 修改settings.py
[root@master django]# vi myexample/settings.py
ALLOWED_HOSTS = ['*']
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': 'postgres',
'HOST': 'db',
'PORT': 5432
}
}
# 启动程序
[root@master myexample]# docker-compose up
# 访问http://192.168.200.103:8000/ 可查看Django首页信息。
标签:容器,compose,--,db,Compose,wordpress,Docker,docker From: https://www.cnblogs.com/sleep24/p/18179759