【Docker】Docker Compose的配置与部署

文章目录

  • [一、Docker Compose](#一、Docker Compose)
    • [1. Docker Compose 的概述](#1. Docker Compose 的概述)
    • [2. Docker Compose 三大的概念](#2. Docker Compose 三大的概念)
    • [3. Docker Compose 环境安装](#3. Docker Compose 环境安装)
  • [二、YAML 文件格式及编写注意事项](#二、YAML 文件格式及编写注意事项)
    • [1. YAML 文件格式](#1. YAML 文件格式)
    • [2. YAML 格式的注意事项](#2. YAML 格式的注意事项)
    • [3. YAML 数据结构](#3. YAML 数据结构)
      • [3.1 基本类型](#3.1 基本类型)
      • [3.2 实例](#3.2 实例)
      • [3.3 YAML 特殊类型](#3.3 YAML 特殊类型)
  • [三、Docker Compose 配置与命令](#三、Docker Compose 配置与命令)
    • [1. Docker Compose 配置常用字段](#1. Docker Compose 配置常用字段)
    • [2. Docker Compose 常用命令](#2. Docker Compose 常用命令)
  • [四、Docker Compose 的部署](#四、Docker Compose 的部署)
    • [1. Docker Compose 部署 httpd](#1. Docker Compose 部署 httpd)
      • [1.1 准备环境配置](#1.1 准备环境配置)
      • [1.2 编写配置文件 docker-compose.yml](#1.2 编写配置文件 docker-compose.yml)
    • [2. Docker Compose 部署 LNMP](#2. Docker Compose 部署 LNMP)
      • [2.1 准备环境配置](#2.1 准备环境配置)
      • [2.2 编写配置文件 docker-compose.yml](#2.2 编写配置文件 docker-compose.yml)
  • 总结
    • [1. Docker Compose 的作用](#1. Docker Compose 的作用)
    • [2. Docker Compose 三大概念](#2. Docker Compose 三大概念)
    • [3. Docker 重启策略](#3. Docker 重启策略)

一、Docker Compose

1. Docker Compose 的概述

Docker-Compose项目是基于Python开发的Docker官方开源项目,负责实现对Docker容器集群的快速编排。Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API, 就可以在其上利用Compose来进行编排管理。

Docker Compose 是一个用于定义和运行多容器Docker应用程序的工具。它允许用户使用YAML文件来定义应用程序的配置,包括容器的数量、容器之间的依效关系、环境变量、端口映射以及其他设置。然后,用户可以使用docker-compose命令来启动和管理这些容器。

使用 Docker Compose 可以方便地管理多个容器,例如,可以同时启动一个Web服务器容器和一个数据库容器,并在它们之间建立网络连接。Docker Compose 还支持自定义网络,使得容器可以在不同的网络中进行通信。

Docker Compose文件通常包含一个或多个服务,每个服务都由一个或多个容器组成。服务定义了容器应该执行的任务,以及容器之间的依赖关系。例如,一个Web服务器服务可以包含一个或多个web 服务器容器,而这些容器又依赖于一个数据库容器。

2. Docker Compose 三大的概念

Docker-Compose 将所管理的容器分为三层,分别是项目(project)、服务(service)以及容器(container) 。

  • Docker-Compose 运行目录下的所有文件组成一个项目,若无特殊指定项目名即为当前目录名。
  • 一个工程当中可包含多个服务,每个服务都包含一个名称、镜像、端口映射、环境变量、挂载点等信息。
  • Docker-Compose 的项目配置文件默认为 docker-compose.yml,可通过环境变量 COMPSE_FILE-f 参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。

Compose 允许用户通过一个单独的 docker-compose.yml 模板文件(AM格式)来定义一组相关联的应用容器为一个项目(project)。

3. Docker Compose 环境安装

Docker Compose 是 Docker 的独立产品,因此需要安装 Docker 之后在单独安装 Docker Compose。

sql 复制代码
#下载
curl - "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$ (uname -s)-$(uname m)" -o /usr/Local/bin/docker-compose
#安装
chmod +x /usr/local/bin/docker-compose
#查看版本
docker-compose --version

二、YAML 文件格式及编写注意事项

1. YAML 文件格式

YAML 是一种标记语言,它可以很直观的展示数据序列化格式,可读性高。类似于 json数据描述语言,语法比 json简单的很多。YAML 数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号 [ ] 括起来, hash 用花括号 { } 括起来。

2. YAML 格式的注意事项

  • 大小写敏感;
  • 通过缩进表示层级关系;
  • 不支持制表符 tab 键缩进,只能使用空格缩进;
  • 缩进的空格数目不重要,只要相同层级左对齐,通常开头缩进2个空格;
  • # 号注释;
  • 符号字符后缩进1个空格,如冒号 : 、逗号 , 、横杠 -
  • 如果包含特殊字符可以用单引号或者双引号来引用处理,其中单引号 '' 引起来会作为普通字符串处理,双引号""会将特殊字符作为本身想表示的意思。

3. YAML 数据结构

3.1 基本类型

sql 复制代码
对象映射: 键值对的字典			  #冒号后面有空格
animal: pets


数组: 一组按次序排列的列表
pests:						 	#纵向列表
- Cat
- Dog
- Goldfish

pet: ["Cat", "Dog", "Goldfish"]	#横向列表


布尔值
debug: true 					#布尔值类型使用true或者false不需要加引号
debug: false

3.2 实例

sql 复制代码
#Yaml格式
languages:					#序列的映射
  - Java
  - Golang 
  - Python
 
websites:   				#映射的映射
  cpu: 2
  memory: 1024M
  swap: 2048M
  dosk: 60G
sql 复制代码
#Json格式						
{
  languages: [
    'Java',
    'Golong',
    'Python',
  ], 
  websites: {				#Json是通过大括号表示层级关系
 	cpu: ['2'],
  	memory: ['1024M'],
  	swap: ['2048M'],
  	dosk: ['60G']
  }
}

Yaml格式 和 Json格式 都是使用键值对来表示字段。其中Yaml格式用空格缩进表示层级关系,用- 表示纵向列表;而Json格式使用[]数组的方式表示层级的分割,使用逗号来分割同一行内容(逗号用来分行)。

3.3 YAML 特殊类型

文本块

sql 复制代码
# 注意"|"与文本之间须另起一行
# 使用|标注的文本内容缩进表示的块,可以保留块中已有的回车换行

value: |
  hello
  world!
# 输出结果

# hello 换行 world!!
sql 复制代码
# +表示保留文字块末尾的换行
# -表示删除字符串末尾的换行

value: |
hello
value: |-
hello
value: |+
hello

# 输出结果
# hello\n hello hello\n\n
sql 复制代码
# 注意">"与文本之间的空格
# 使用>标注的文本内容缩进表示的块,将块中回车替换为空格最终连接成一行
value: > hello
world!
# 输出结果
# hello 空格 world!

锚点与引用

sql 复制代码
# 复制代码注意*引用部分不能追加内容
# 使用&定义数据锚点,即要复制的数据
# 使用*引用锚点数据,即数据的复制目的地
name: &a yaml
book: *a
books:
   - java
   - *a
   - python

# 输出结果
book: yaml
books:[java, yaml, python]

三、Docker Compose 配置与命令

1. Docker Compose 配置常用字段

字段 描述
build 指定 Dockerfile 文件名,要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定
dockerfile 构建镜像上下文路径
context 可以是 dockerfile 的路径,或者是指向 git 仓库的 url 地址
image 指定镜像
command 执行命令,覆盖容器启动后默认执行的命令
container_name 指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale指定容器数量
deploy 指定部署和运行服务相关配置,只能在 Swarm 模式使用
environment 添加环境变量
networks 加入网络,引用顶级networks下条目
network_mode 设置容器的网络模式,如 host,bridge,...
ports 暴露容器端口,与 -p 相同,但端口不能低于 60
volumes 挂载一个宿主机目录或命令卷到容器,命名卷要在顶级 volumes 定义卷名称
volumes_from 从另一个服务或容器挂载卷,可选参数 :ro 和 :rw,仅版本 '2' 支持
hostname 容器主机名
sysctls 在容器内设置内核参数
links 连接到另外一个容器,- 服务名称[:服务别名]
privileged 用来给容器root权限,注意是不安全的,true | false
restart 设置重启策略,no,always,no-failure,unless-stopped no,默认策略,在容器退出时不重启容器。 always,在容器退出时总是重启容器。 on-failure,在容器非正常退出时(退出状态非0),才会重启容器。 on-failure:3,在容器非正常退出时重启容器,最多重启3次。 unless-stopped,在容器退出时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了的容器。
depends_on 在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,可能会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题。 php: depends_on: - apache - mysql
sql 复制代码
#docker Compose字段			相对于docker run 的命令
image          					镜像:标签
command        					启动命令
container_name 					--name
environment    					--env
networks       					--network
ports          					-p
volumes        					-v
volumes_from					--volumes-from
hostname       					-h
sysctls							--sysctl
links							--link
privileged						--privileged
restart        					--restart

2. Docker Compose 常用命令

字段 描述
build 重新构建服务
ps 列出容器
up 创建和启动容器
exec 在容器里面执行命令
scale 指定一个服务容器启动数量
top 显示正在运行的容器进程
logs 查看服务容器的输出
down 删除容器、网络、数据卷和镜像
stop/start/restart 停止/启动/重启服务

四、Docker Compose 的部署

1. Docker Compose 部署 httpd

1.1 准备环境配置

sql 复制代码
vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1

sysctl -p
net.ipv4.ip_forward = 1
sql 复制代码
#准备compose目录
mkdir -p compose/compose-apache/
#本地已经配置docker,拉取httpd镜像
docker pull httpd
docker run -itd httpd:latest
docker ps -a

1.2 编写配置文件 docker-compose.yml

sql 复制代码
vim /compose/compose-apache/docker-compose.yml
version: '3'

services:
  apache:
    image: httpd:latest
    container_name: httpd-test
    ports:
    - 1314:80
    volumes:
    - ./html:/usr/local/apache2/htdocs
    networks:
      lamp:
        ipv4_address: 172.20.0.10
  #mysql:
   
  #php:
  
networks:
  lamp:
    driver: bridge
    ipam:
      config:
      - subnet: 172.20.0.0/16
sql 复制代码
#准备网页文件
mkdir html
cd html/
echo '<h1>this is docker-compose web!</h1>' > index.html

cat index.html 
<h1>this is docker-compose web!</h1>
sql 复制代码
#运行compose
cd compose/compose-apache/
docker-compose up -d
----------------------------------------------------------------------------------------------------------
-f, --file FILE :使用特定的 compose 模板文件,默认为 docker-compose.yml
-p, --project-name NAME :指定项目名称,默认使用目录名称
-d :在后台运行
----------------------------------------------------------------------------------------------------------
#查看compose
docker-compose ps
sql 复制代码
#浏览器访问
http://192.168.145.15:1314

2. Docker Compose 部署 LNMP

sql 复制代码
#清除之前的 docker 容器以及网络配置
docker rm -f $(docker ps -aq)
docker ps -a
docker network rm 225948bb2fc2
docker network ls

2.1 准备环境配置

sql 复制代码
#将dockerfile部署的lnmp配置文件复制至compose目录下
cd compose/
mkdir compse-lnmp
cd /opt/lnmp/
cp -a nginx/ mysql/ php/ /root/compose/compose-lnmp/
cd /root/compose/compose-lnmp/

2.2 编写配置文件 docker-compose.yml

sql 复制代码
touch docker-compose.yml
vim docker-compose.yml
version: '3'
services:
  nginx:
    build:
        context: ./nginx
        dockerfile: Dockerfile
      container_name: nginx
      ports:
      - 80:80
      volumes:
      - ./nginx/html:/usr/local/nginx/html
      networks:
        lnmp:
          ipv4_address: 172.18.0.10
  mysql:
    #build:
    # context: ./mysgl
    # dockerfile: Dockerfile
    image: mysql:centos7
    container_name: mysql
    ports:
    - 3306:3306
    volumes:
    - db-data:/usr/local/mysgl
    networks:
      lnmp:
        ipv4_address: 172.18.0.20
    privileged: true
  php:
    #build:
    # context: ./php
    # dockerfile: Dockerfile
    image: php:centos
    container_name: php
    ports:
    - 9000:9000
    volumes:
    - db-data:/usr/local/mysgl
    - ./nginx/html:/usr/local/nginx/html
    networks:
      lnmp:
        ipv4_address: 172.18.0.30
    depends on:
    - nginx
    - mysql
  networks:
    lnmp:
      driver: bridge
      ipam:
        config:
        - subnet: 172.18.0.0/16
  volumes:
    db-data:
    #web-data:
sql 复制代码
#启动compose
cd compose/compose-lnmp/
docker-compose up -d
sql 复制代码
#浏览器访问
http://192.168.145.15/wordpress/index.php

总结

1. Docker Compose 的作用

sql 复制代码
实现单机容器集群编排管理(使用一个模板文件定义多个应用容器的启动参数和依赖关系,并使用docker compose来根据这个模板文件的配置来启动容器)

2. Docker Compose 三大概念

sql 复制代码
项目/工程 --> 包含一个或多个 服务  -->  包含一个或多个 容器

默认使用项目的目录名做项目名,支持使用 -p 或者 --project-name 来指定项目名。
在项目的目录中通常会包含一个 docker-compse.yml 模板文件,此文件为项目的默认配置文件(支持使用-f或COMPSE_FILE来指定项目的配置模板文件)。
在默认配置文件里面可以定义项目的要给或多个服务,每个服务包含容器的名称、镜像、端口映射、环境变量、挂载点、依赖关系等配置参数。

3. Docker 重启策略

复制代码
   no,默认策略,在docker退出时不重启容器。
   always,在docker退出时总是重启容器。
   on-failure,在docker非正常退出时(退出状态非0),才会重启容器;在dcoker非正常退出时重启容器,最多重启指定次。
   unless-stopped,在docker退出前根据容器的状态来决定是否重启
相关推荐
yuguo.im20 分钟前
Docker 两大基石:Namespace 和 Cgroups
运维·docker·容器
会飞的土拨鼠呀27 分钟前
docker部署 outline(栗子云笔记)
笔记·docker·容器
Jelly-小丑鱼1 小时前
Linux搭建syslog日志服务器
linux·服务器·docker·日志服务器·syslog服务器
没有bug.的程序员2 小时前
高频IO服务优化实战指南
java·jvm·spring·容器
lisanmengmeng3 小时前
docker 方式安装部署禅道zentao(五)
运维·docker·容器
程序员老赵3 小时前
AdguardHome Docker 容器化部署指南
docker·dns
露临霜4 小时前
Docker安装nginx
nginx·docker·容器
CAFEBABE 347 小时前
安装完docker之后怎么使用
运维·docker·容器
测试人社区—小叶子7 小时前
测试开发面试高频“灵魂八问”深度解析与应答策略
网络·人工智能·测试工具·云原生·容器·面试·职场和发展
全靠bug跑8 小时前
Nacos 入门实战:部署、服务注册与发现全指南
java·spring cloud·docker·nacos