Docker-compose

发布于:2024-10-17 ⋅ 阅读:(12) ⋅ 点赞:(0)

一、docker-compose 简介

我们知道使用一个Dockerfile模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排。服务编排有很多种技术方案,今天给大家介绍 Docker 官方产品 Docker Compose 。

Dockerfile可以让用户管理一个单独的应用容器;

而Compose则允许用户在一个模板(YAML格式)中定义一组相关联的应用容器(被称为一个 project,即项目),例如一个 Web 服务容器再加上后端的数据库服务容器等。


1.1、Docker-compose 简介

Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。

Docker-Compose将所管理的容器分为三层,

  • 工程(project)
  • 服务(service)
  • 容器(container)

Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。

一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。

一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡,比如 Consul。

Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。

使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

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

Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API, 就可以在其上利用Compose来进行编排管理。

二、compose 部署

2.1、Docker Compose 环境安装

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

下载

curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

或者在前置资源

cd  /usr/local/bin/

文件放到里面

安装
chmod +x /usr/local/bin/docker-compose
查看版本
docker-compose --version

新的版本下载地址(不推荐用最新版本)
sudo curl -L "https://github.com/docker/compose/releases/download/2.26.0/docker-compose-linux-aarch64" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

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

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

使用 YAML 时需要注意下面事项:

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

eg:name: "Hi,\nTom"

数据结构:

  • 对象映射: 键值对的字典

animal: pets

  • 序列数组: 一组按次序排列的列表

- Cat
- Dog
- Goldfish

["Cat", "Dog", "Goldfish"]

  • 布尔值

debug: true
debug: false

示例:
# yaml 格式
languages:       #序列的映射
  - Java
  - Golang
  - Python
websites:        #映射的映射
  cpu: 2
  memory: 1024M
  swap: 2048M
  disk: 60G 

2.3、Docker Compose配置常用字段

字段 描述
build 指定 Dockerfile 文件名。要指定 Dockerfile 文件需要在 build 标签的子级标签中使用 dockerfile 标签指定。
dockerfile 构建镜像上下文路径。可以是 Dockerfile 的路径,或者是指向 git 仓库的 URL 地址。
context 构建镜像时指定的上下文路径或 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、on-failure、unless-stopped 等。
                                 no,默认策略,在容器退出时不重启容器。
                                 on-failure,在容器非正常退出时(退出状态非0),才会重启容器。
                                 on-failure:3,在容器非正常退出时重启容器,最多重启3次。
                                 always,在容器退出时总是重启容器。
                                 unless-stopped,在容器退出的容器时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了。

depends_on

在使用 Compose 时,用于解决容器的依赖、启动先后的问题。

在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,可能会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题。

2.4、Docker Compose 常用命令

字段 描述
build 重新构建服务
ps 列出容器
up 创建和启动容器
exec 在容器里面执行命令
scale 指定一个服务容器启动数量
top 显示容器进程
logs 查看容器输出
down 删除容器、网络、数据卷和镜像(注意:这通常是在使用Docker Compose时的一个命令,用于停止并移除由docker-compose.yml文件定义的所有服务、网络、卷和镜像,但默认情况下不会删除外部创建的卷和自定义网络)
stop 停止服务(即停止一个或多个正在运行的容器)
start 启动服务(即启动一个或多个已停止的容器)
restart 重启服务(即先停止再启动一个或多个容器)

三、部署

3.1、Docker Compose 文件结构

yum install -y tree
tree /opt/compose_nginx
/opt/compose_nginx/
├── docker-compose.yml                #创建模板脚本
├── nginx
│?? ├── Dockerfile                    #创建容器脚本
│?? ├── nginx-1.12.0.tar.gz            #复制源码包
│?? └── run.sh                        #启动服务脚本

│?? └── CentOS-Base.repo       #源
└── wwwroot
    └── index.html                    #站点网页


(1)准备依赖文件
mkdir -p /opt/compose_nginx/nginx /opt/compose_nginx/wwwroot

echo "<h1>this is test web</h1>" > /opt/compose_nginx/wwwroot/index.html

cd /opt/compose_nginx/nginx

把nginx-1.12.0.tar.gz上传在到文件目录里

(用方法二才需要这个shell脚本)

vim run.sh

#!/bin/bash
/usr/local/nginx/sbin/nginx

vim Dockerfile

#基于基础镜像
FROM centos:7
#用户信息
MAINTAINER this is nginx image <YC>
#改变源
ADD CentOS-Base.repo /etc/yum.repos.d/
RUN yum clean all && yum makecache
#添加环境包
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
#上传nginx软件压缩包,并解压
ADD nginx-1.12.0.tar.gz /usr/local/src/
#指定工作目录
WORKDIR /usr/local/src/nginx-1.12.0
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
#指定http和https端口
EXPOSE 80
EXPOSE 443
//方法一:
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf			#关闭 nginx 在后台运行
#添加宿主机中run.sh到容器中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
//方法二:
ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]

(2)编写配置文件docker-compose.yml

vim /opt/compose_nginx/docker-compose.yml

  • version: '3':指定了 Docker Compose 文件的版本为 3。Docker Compose 文件格式有多个版本,每个版本都引入了新的特性和对旧特性的弃用。版本 3 是相对较新且广泛支持的版本。
  •  services::定义了要运行的服务列表。
  • my_custom_nginx:这是服务的名称,在这个例子中,它运行一个 my_custom_nginx容器。
  • container_name: web1:为容器指定了一个名称 web1。如果不指定,Docker Compose 会自动生成一个名称。就是docker容器的name

  • hostname: nginx:设置了容器的主机名为 nginx

  • build::定义了构建镜像的上下文和 Dockerfile。

  • context: ./nginx:指定了构建上下文为当前目录下的 nginx 文件夹。Docker 会在这个文件夹中查找 Dockerfile。

  • dockerfile: Dockerfile:指定了 Dockerfile 的名称(在这个例子中,它是默认的 Dockerfile,因此这个选项实际上是可选的,我们一般不改)。

  • ports::将容器的端口映射到主机的端口。

    • - 1216:80:将容器的 80 端口映射到主机的 1216 端口。

    • - 1217:443:将容器的 443 端口映射到主机的 1217 端口。

  • networks::定义了容器要连接的网络。

    • lnmp::指定了网络的名称为 lnmp

      • ipv4_address: 172.18.0.10:为容器在 lnmp 网络中分配了一个静态 IP 地址 172.18.0.10
  • volumes::定义了挂载到容器的卷。

    • - ./wwwroot:/usr/local/nginx/html:将主机上的 wwwroot 目录挂载到容器内的 /usr/local/nginx/html 目

网络

  • networks::定义了 Docker Compose 应用中使用的网络。

    • lnmp::定义了名为 lnmp 的网络。

      • driver: bridge:指定了网络模式为 bridge,这是 Docker 的默认网络模式。

      • ipam::定义了 IP 地址管理(IP Address Management)配置。

        • config::定义了网络的子网。

          • - subnet: 172.18.0.0/16:指定了网络子网为 172.18.0.0/16,这意味着网络地址从 172.18.0.1 到 172.18.255.254(注意,.0 和 .255 地址通常保留不用)。
version: '3'
services:
   my_custom_nginx:
    container_name: web1
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 1216:80
      - 1217:443
    networks:
      lnmp:
        ipv4_address: 172.19.0.10
    volumes:
      - ./wwwroot:/usr/local/nginx/html
networks:
  lnmp:
   driver: bridge
   ipam:
     config:
	   - subnet: 172.19.0.0/16

cd /opt/compose_nginx/
docker-compose -f docker-compose.yml up -d

  • docker-compose:这是 Docker Compose 的命令行工具,用于定义和运行多容器 Docker 应用程序。

  • -f docker-compose.yml-f 或 --file 选项允许你指定要使用的 Docker Compose 配置文件。在这个例子中,配置文件被命名为 docker-compose.yml,这是 Docker Compose 的默认配置文件名,因此如果文件名是默认的,并且位于当前目录中,你可以省略 -f 选项和文件名。

  • up:这个命令用于创建并启动容器。它会根据 docker-compose.yml 文件中的定义来创建服务、网络、卷和容器。如果容器已经存在,docker-compose up 会尝试重新启动它们(除非它们有特定的重启策略)。

  • -d:这个选项表示“detached”模式,意味着容器将在后台运行。没有 -d 选项时,docker-compose up 会显示容器的输出,并保持在前台运行,直到你手动停止它。

docker ps -a
CONTAINER ID   IMAGE                 COMMAND     CREATED              STATUS              PORTS                                         NAMES
b48dceee248f   compose_nginx_nginx   "/run.sh"   About a minute ago   Up About a minute   0.0.0.0:1216->80/tcp, 0.0.0.0:1217->443/tcp   compose_nginx_nginx_1

cd /opt/compose_nginx/
docker-compose ps                    #必须在docker-compose.yml所在目录执行此命令

浏览器访问:http://192.168.88.20:1216

3.2、nginx + tomcat docker-compose编排


网站公告

今日签到

点亮在社区的每一天
去签到