[云原生]Docker-compose:一站式多容器应用部署神器

目录

引言

一、Docker Compose 简介

(一)基本信息

(二)核心特性

(三)文件格式

二、Docker Compose 环境安装

(一)准备安装包

(二)添加执行权限

三、 Docker Compose操作

(一)配置常用字段

(二)常用命令

(三)文件结构

(四)生成nginx镜像及容器

1.准备安装包与配置文件

2.编写Dockerfile文件

3.编写docker-compose.yml文件

4.执行命令生成镜像

5.查看并访问镜像

四、多容器编排

(一)down删除

(二)编排多个容器

1.nginx配置

2.tomcat配置

3.编写docker-comppose.yml文件

4.执行命令生成镜像与容器

5.查看结果


引言

在当今的云原生时代,Docker已经成为应用程序容器化的代名词,它让我们能够将应用及其依赖打包进轻量级、可移植的容器中。然而,随着微服务架构的流行,单个应用往往由多个相互依赖的服务组成,管理这些服务及其配置变得日益复杂。为了解决这一挑战,Docker推出了Docker Compose——一个用于定义和运行多容器Docker应用的工具,它让复杂的多服务应用部署变得简单而高效。

一、Docker Compose 简介

(一)基本信息

Docker Compose 是 Docker 官方提供的一种工具,用于在一个 YAML 文件中定义和配置多个 Docker 容器应用服务,进而实现多容器应用的快速部署和管理。通过 Docker Compose,您可以更方便地定义服务间的依赖关系、网络和卷等,使得在开发和生产环境中部署复杂应用变得简单高效。

(二)核心特性

服务定义:在 docker-compose.yml 文件中,每个服务被定义为一个独立的实体,包含镜像、环境变量、端口映射、挂载卷等配置,使得应用架构清晰明了。

环境无关性:Compose 允许你在任何环境中一致地部署应用,无论是开发、测试还是生产环境,确保了环境的一致性。

一键启动:使用 docker-compose up 命令,可以依据 docker-compose.yml 文件中的定义,一次性启动所有服务及其依赖,大大减少了手动启动容器的复杂性。

编排管理:Docker Compose 能够自动处理服务间的依赖关系,确保服务按照正确的顺序启动和关闭,支持服务的重启、停止、重建等操作。

网络与数据管理:自动创建并管理网络,使得服务间通信变得简单,同时支持数据卷的定义,保证数据的持久化存储。

动态更新:当服务配置发生变化时,通过 docker-compose up --force-recreate 可以重新创建服务,只有配置有变动的服务会被重新创建,保证了资源的有效利用。

可扩展性:Compose 支持变量注入,允许根据不同的环境变量动态调整配置,使得应用在不同环境下灵活部署

(三)文件格式

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

使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。

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

YAML文件格式注意事项

  • 大小写敏感:YAML 对大小写敏感。
  • 缩进:使用空格进行缩进,不能使用 Tab 键。缩进代表层级关系,通常开头缩进2个空格。
  • 数据结构:支持三种主要的数据结构:对象(映射)、数组(序列)和纯量(字符串、数字、布尔值等)。
  • 注释:使用 # 符号进行单行注释。
  • 字符串:通常不需要引号包围,但含有特殊字符或空白字符时需要使用引号
  • 符号字符后缩进1个空格,如冒号 :  、逗号 ,  、横杠符号字符后缩进1个空格,如冒号 :  、逗号 ,  、横杠
  • 如果包含特殊字符用单引号('')引起来会作为普通字符串处理,双引号(""): 特殊字符作为本身想表示的意思

二、Docker Compose 环境安装

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

(一)准备安装包

使用curl命令下载,或者在github官网进行下载

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

(二)添加执行权限

[root@docker ~]#cd  /usr/local/bin
[root@docker bin]#chmod +x docker-compose 
[root@docker bin]#ls
docker-compose
[root@docker bin]#docker-compose --version
docker-compose version 1.25.0-rc4, build 8f3c9c58

三、 Docker Compose操作

(一)配置常用字段

字段描述
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,nounless-st-failure,oped

        no,默认策略,在容器退出时不重启容器。
        on-failure,在容器非正常退出时(退出状态非0),才会重启容器。
        on-failure:3,在容器非正常退出时重启容器,最多重启3次。
        always,在容器退出时总是重启容器。
        unless-stopped,在容器退出的容器时总是重启容器,但是不考虑在 Docker

                                    守护进程启动时就已经停止了

depends_on

depends_on标签用于解决容器的依赖、启动先后的问题

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

(二)常用命令

字段 描述
-f, --file FILE 使用特定的 compose 模板文件,默认为 docker-compose.yml
-p, --project-name NAME 指定项目名称,默认使用目录名称
-d 在后台运行
build重新构建服务
ps列出容器
up创建和启动容器  
exec在容器里面执行命令
scale指定一个服务容器启动数量
top显示容器进程
logs查看容器输出
down删除容器、网络、数据卷和镜像
stop/start/restart 停止/启动/重启服务

(三)文件结构

[root@docker compose]#pwd
/data/compose
[root@docker compose]#tree
.
├── docker-compose.yml           #创建模板脚本
├── html                         #站点目录
│   └── index.html               #自定义站点文件
└── nginx
    ├── Dockerfile               #创建容器脚本
    ├── nginx-1.18.0.tar.gz      #复制源码包
    └── nginx.conf               #自定义配置文件,也可使用默认文件

(四)生成nginx镜像及容器

1.准备安装包与配置文件

2.编写Dockerfile文件

FROM centos:7
#指定基础镜像为CentOS 7。
 
MAINTAINER this is nginx image <nginx>
#声明镜像作者及联系信息
 
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make;useradd -M -s /sbin/nologin nginx
#通过yum包管理器安装编译Nginx所需的依赖包
#创建一个名为nginx的系统用户,并禁止其登录shell
 
ADD nginx-1.18.0.tar.gz /usr/local
#将名为nginx-1.18.0.tar.gz的Nginx源代码压缩包解压到容器内的/usr/local目录下。
 
WORKDIR /usr/local/nginx-1.18.0
#设置工作目录为解压后的Nginx源代码目录。
 
RUN ./configure ... ;make -j4 && make install
#在Nginx源代码目录下执行配置、编译和安装操作。编译使用了4个线程(-j 4)以提高速度。
 
ENV PATH /usr/local/nginx/sbin:$PATH
#设置环境变量PATH,将Nginx的sbin目录加入到PATH中,使得在容器内可以直接执行Nginx的命令。
 
EXPOSE 80 和 EXPOSE 443
#分别声明容器运行时将公开80端口(HTTP)和443端口(HTTPS),表示Nginx将在这些端口上提供服务。
 
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
#设置容器启动时默认执行的命令,即启动Nginx服务器,并指定运行在前台模式(防止容器启动后立即退出)
#通过-g "daemon off;"参数禁用了Nginx的守护进程模式
#这意味着当启动容器时,Nginx将以非守护进程形式运行,并且容器的生命周期与Nginx服务绑定在一起。

3.编写docker-compose.yml文件

[root@docker compose]#vim  docker-compose.yml 
[root@docker compose]#cat  docker-compose.yml 
version: "3"
#指定了该文件遵循的Docker Compose配置文件格式版本为3。这个版本支持多网络、配置覆盖等高级特性
services:                                  #开始定义服务
  nginx:                                   #定义服务名称
    container_name: nginx                  #定义容器名称
    hostname: nginx                        #定义内部主机名
    build:                                 #构建服务的镜像方式
      context: ./nginx                     #定义生成镜像的路径为当前目录下的nginx目录
      dockerfile: Dockerfile               #Dockerfile的相对路径
    ports:
      - 10000:80                           #将宿主机的10000端口映射到容器的80端口
      - 10001:443                          #将宿主机的10001端口映射到容器的443端口
    networks:                              #定义容器网络部分
      vae:                                 #定义容器加入的网络
        ipv4_address: 172.30.0.10          #定义容器IP地址为172.30.0.10
    volumes:                               #定义容器的挂载目录
      - ./html:/usr/local/nginx/html       #将当前目录下的html目录,挂载到nginx的站点目录
networks:                                  #添加自定义网络
  vae:                                     #网络名称为vae
    driver: bridge                         #定义网络类型为bridge
    ipam:                                  #IP地址管理配置
      config:
        - subnet: 172.30.0.0/16            #指定网络的子网掩码,用于自动分配或静态指定IP

4.执行命令生成镜像

[root@docker compose]#docker-compose -f docker-compose.yml up -d

-f    #指定需要加载的文件,如果不指定 -f,Docker Compose 默认查找同名文件
up    #创建与启动容器
-d    #以守护进程(detached)模式运行服务。命令会立即返回,而服务则在后台继续运行。
      #如果不加 -d,Docker Compose 会在当前终端会话中输出服务的日志

5.查看并访问镜像

四、多容器编排

可以通过Docker Compose进行多个容器编排,同时生成多个镜像与容器,让复杂的多服务应用部署变得简单而高效

(一)down删除

使用down选项,会停止并删除docker-compose.yml生成的所有容器,镜像等

删除镜像需要添加--rmi参数

删除数据卷:如果你想同时删除与服务关联的数据卷,可以使用 -v 或 --volumes 参数

指定镜像删除策略:如果你想在停止服务的同时删除镜像,可以使用 --rmi 参数。
它接受 'all' 或 'local' 作为值。例如,删除所有由当前服务使用的镜像

(二)编排多个容器

同时编辑生成nginx与tomcat两个容器,并直接做到动静分离

1.nginx配置

首先自定义nginx的配置文件

修改nginx的docker文件,使用ADD指令,将自定义的nginx文件复制到nginx服务的配置文件目录下,覆盖原配置文件,或者在docker-compose.yml文件中通过volumes指令,将配置文件挂载到容器当中,在此选择挂载的方式,将nginx.conf文件,挂载到nginx的配置文件目录下,实现持久化

其它信息与上述生成nginx镜像配置保持不变

2.tomcat配置

2.1 准备软件包

2.2 创建访问页面

2.3 编写Dockerfile文件


FROM centos:7
#表示新镜像是基于CentOS 7的基础镜像构建。
 
MAINTAINER this is tomcat <tomcat>
#指定镜像的作者和联系方式
 
ADD jdk-8u291-linux-x64.tar.gz /usr/local/:
#将本地名为jdk-8u291-linux-x64.tar.gz的Java开发工具包压缩包解压到容器内的/usr/local/目录下。
 
WORKDIR /usr/local/
#设置工作目录为/usr/local/。
 
RUN mv jdk1.8.0_291 /usr/local/java:
#将解压后的Java目录重命名为/usr/local/java,作为Java安装路径。
 
环境变量设置:
ENV JAVA_HOME /usr/local/java
#设置Java主目录环境变量。
ENV JRE_HOME ${JAVA_HOME}/jre
#设置Java运行时环境(JRE)目录环境变量。
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
#设置类路径环境变量,包含当前目录和其他Java库目录。
ENV PATH $JAVA_HOME/bin:$PATH
#把Java的bin目录添加到系统的PATH环境变量中,以便全局执行Java命令。
 
ADD apache-tomcat-9.0.16.tar.gz /usr/local/
#将Apache Tomcat 9.0.16的tar.gz压缩包解压至/usr/local/目录。
 
WORKDIR /usr/local/
#再次确认工作目录为/usr/local/。
 
RUN mv apache-tomcat-9.0.16 /usr/local/tomcat
#将解压后的Tomcat文件夹重命名为/usr/local/tomcat,作为Tomcat的安装路径。
 
EXPOSE 8080、EXPOSE 8009 和 EXPOSE 8005:
#分别声明容器运行时需要对外开放的端口:
#8080(HTTP服务)、8009(AJP协议,通常用于反向代理)和8005(Tomcat的shutdown端口)。
 
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
#运行Tomcat的catalina.sh脚本并指定run命令,这将以非守护进程模式启动Tomcat。

3.编写docker-comppose.yml文件

version: "3"
services:
  nginx:
    container_name: nginx
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 10000:80
      - 10001:443
    networks:
      vae:
        ipv4_address: 172.30.0.10
    volumes:
      - ./html:/usr/local/nginx/html
      - ./nginx/nginx.conf:/usr/local/nginx/conf/nginx.conf
#将当前目录下的nginx目录下的nginx.conf挂载到/usr/local/nginx/conf/nginx.conf下,完成文件覆盖
  tomcat:                                  #定义服务名称
    container_name: tomcat                 #定义容器名称
    hostname: tomcat                       #定义内部主机名
    build:                                 #构建服务的镜像方式
      context: ./tomcat                    #定义生成镜像的路径为当前目录下的nginx目录
      dockerfile: Dockerfile               #Dockerfile的相对路径
    ports:
      - 8080:8080                          #将宿主机的8080端口映射到容器的8080端口
      - 8005:8005                          #将宿主机的8005端口映射到容器的8005端口
      - 8009:8009                          #将宿主机的8009端口映射到容器的8009端口
    networks:                              #定义容器网络部分
      vae:                                 #定义容器加入的网络
        ipv4_address: 172.30.0.20    #定义容器IP地址为172.30.0.20,与nginx代理地址一致
    volumes:
      - ./tomcat/index.jsp:/usr/local/tomcat/webapps/ROOT/index.jsp
#将当前目录下的tomcat目录下的index.jsp挂载到/usr/local/tomcat/webapps/ROOT/index.jsp下,完成文件覆盖
networks:
  vae:
    driver: bridge
    ipam:
      config:
        - subnet: 172.30.0.0/16

4.执行命令生成镜像与容器

[root@docker compose]#docker-compose -f docker-compose.yml up -d

5.查看结果

使用curl或者浏览器访问,查看是否达到动静分离的效果

  • 12
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值