Docker Compose容器编排--项目五

一、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首页信息。

 

posted @ 2024-05-08 17:27  在睡觉24  阅读(12)  评论(0编辑  收藏  举报