目录
引言
一、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,默认策略,在容器退出时不重启容器。 守护进程启动时就已经停止了 |
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或者浏览器访问,查看是否达到动静分离的效果