一、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 语法特点:

  1. 可读性强: YAML 使用缩进和空格来结构化数据,方便轻松阅读和编写,避免了复杂符合或标记。
  2. 结构: 通过层级结构组织数据,通过缩进来定义结构。
    缩进时不允许使用 Tab 键,只允许使用空格。
    缩进的空格数不重要,但同级元素必须左侧对齐。
  3. 注释: YAML 允许使用注释在数据中提供额外的信息和解释。注释以 # 字符开头,直到行尾结束。
  4. 每个冒号与后面所跟的参数之间都需要有一个空格。
  5. 大小写敏感。

(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

上例中服务依赖效果:

  1. 按依赖顺序启动服务:db和redis先于web启动。
  2. 若执行 docker-compose up web(服务名) 会自动创建并启动db和redis。
  3. 停止服务时,按依赖顺序停止服务,web先于db和redis停止。

(4)networks

默认情况, Docker Compose 会为应用程序自动创建名为 [项目名]_default 的默认网络,服务的每个容器都加入默认网络。

注意:

  1. 该网络上容器间可以互访
  2. 可以通过主机名(与容器名称相同)互访

每个服务,也可以使用 network 键指定要连接的网络,需要使用 network 节中定义的网络名。

示例:

查看代码
 services:
frontend:
image: awesome/webapp
networks:
- front-tier
- back-tier networks:
front-tier:
back-tier:

aliases 选项比较特别,用来设置服务在该网络上的别名。

  1. 同网络的其他容器可通过服务名称或别名连接该服务的容器
  2. 同一服务可在不同网络上有不同别名
查看代码
 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首页信息。

Docker Compose容器编排--项目五的更多相关文章

  1. AspNetCore容器化(Docker)部署(三) —— Docker Compose容器编排

    一.前言 上一篇部署了一个最基础的helloworld应用,创建了两个容器和一个network,还算应付得过来. 如果该应用继续引入mysql.redis.job等若干服务,到时候发布一次得工作量之大 ...

  2. Docker Compose 容器编排 NET Core 6+MySQL 8+Nginx + Redis

    环境: CentOS 8.5.2111Docker 20.10.10Docker-Compose 2.1.0 服务: db  redis  web nginx NET Core 6+MySQL 8+N ...

  3. Docker Compose容器编排

    Compose是Docker官方的开源项目,可以实现对Docker容器集群的快速编排.Compose 中有两个重要的概念:服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实 ...

  4. Docker Compose 容器编排

    1. 前言 Docker Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器. 使用Compose 基本上分为三步: Dockerfile 定义应用 ...

  5. 八、docker compose容器编排

    一. Docker-Compose 1.1. 什么是Docker Compose Compose 项目是 Docker 官方的开源项目,负责实现 Docker 容器集群的快速编排,开源代码在 http ...

  6. asp.net core容器&mysql容器network互联 & docker compose方式编排启动多个容器

    文章简介 asp.net core webapi容器与Mysql容器互联(network方式) docker compose方式编排启动多个容器 asp.net core webapi容器与Mysql ...

  7. docker compose服务编排简介、基于发布包构建多个webapi容器 和 基于镜像实现Nginx反向代理webapi

    一. docker compose服务编排简介 1. 背景 微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大: A. 要创建镜 ...

  8. 物联网架构成长之路(24)-Docker练习之Compose容器编排

    0.前言 一开始学的之后,是想一步到位直接上Kubernetes(K8s)的,后面没想到,好像有点复杂,有些概念不是很懂.因此学习东西还是要循序渐进,慢慢来.先了解单机编排技术Docker Compo ...

  9. Docker系列--容器编排工具Docker Compose详解

    1.Docker Compose 概述 Compose是一个用于定义和运行多容器Docker应用程序的工具.使用Compose,您可以使用Compose文件来配置应用程序的服务.然后,使用单个命令,您 ...

  10. Docker | 第七章:Docker Compose服务编排介绍及使用

    前言 前面章节,我们学习了如何构建自己的镜像文件,如何保存自己的镜像文件.大多都是一个镜像启动.当一个系统需要多个子系统进行配合时,若每个子系统也就是镜像需要一个个手动启动和停止的话,那估计实施人员也 ...

随机推荐

  1. ApacheCon Asia 2022 精彩回顾 | 如何让更多人从大数据中获益?

    点亮 ️ Star · 照亮开源之路 GitHub:https://github.com/apache/dolphinscheduler 在 ApacheCon Asia 2022 Meetup上,有 ...

  2. condition字符串匹配问题

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. fs使用dialplan配置文件执行业务流程,condition条件变量的配置是必然会使用的,这里记录一次配置过程中的错误示范. 环 ...

  3. git的快速入门(含常用指令)

    目录 概念 什么是git git与GitHub有什么区别 提交.仓库.分支 git的使用 从GitHub上下载别人的代码 直接将代码下载到本地 克隆仓库获取代码 将自己的代码上传到GitHub 本文拟 ...

  4. VUE learn

    Vue .js 的官方文档中是这样介绍它的. 简单小巧的核心,渐进式技术拢,足以应付任何规模的应用. 简单小巧是指 vue.js 压缩后大小仅有 17k .所谓渐进式(Progressive ),就是 ...

  5. CRC算法原理、推导及实现

    CRC, Cyclic Redundancy Check, 循环冗余校验 1. 基本原理 CRC的本质是除法,把待检验的数据当作一个很大(很长)的被除数,两边选定一个除数(有的文献叫poly),最后得 ...

  6. Camera | 7.瑞芯微rk3568平台摄像头控制器MIPI-CSI驱动架构梳理

    因为有拍照.录制视频.直播等刚需,现在手机的摄像头基本都是高清,支持高清摄像头的SoC都支持MIPI-CSI. 不同SoC的MIPI-CSI在实现上有一定差别,即使同一厂家设计生产的芯片也都不尽相同. ...

  7. SSM_Spring+SpringMVC+MyBatis学习

    没听过的重点部分 springSecurity 4.0开始默认打开_csrf防护,但是会导致403 forbidden问题,所以可以关闭,但是关了就没有csrf防护了 其中还有传递的token和加密的 ...

  8. 玩客云安装hassio

    docker版 安装hass镜像,首次安装比较慢 需要等几分钟启动(10分钟左右) docker run -d --restart=always --name="home-assistant ...

  9. SSH 免密登录 Windows

    安装并启动 OpenSSH 服务器 在开始之前请确保你的远程 Windows 已经安装了 OpenSSH 服务器.若没有安装,请在 设置 > 系统 > 可选功能 > 添加可选功能 中 ...

  10. Python新手爬虫四:爬取视频

    老样子,先上最后成功源码(在D盘下创建'好看视频'文件夹,直接运行即可获取视频): import sys import re,os import requests from you_get impor ...