| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> docker-compose部署项目 -> 正文阅读 |
|
[系统运维]docker-compose部署项目 |
前言:参考几篇非常优秀的文章: 以及非常优秀的开源项目: Docker Compose 概述Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。借助 Compose,可以使用 YAML 文件来配置应用程序的服务。然后,使用单个命令,从配置中创建并启动所有服务。 使用 Compose流程基本上是一个三步过程: 2、定义组成您的应用程序的服务,docker-compose.yml 以便它们可以在隔离的环境中一起运行。 3、运行docker compose up和Docker compose command启动并运行你的整个应用程序。您也可以docker-compose up使用 docker-compose 二进制文件运行。 常用命令: docker-compose up --build: docker-compose up -d: docker-compose up --build -d: docker system prune: docker-Compose特色单个主机上的多个隔离环境Compose 使用项目名称将环境彼此隔离。您可以在多个不同的上下文中使用此项目名称:
创建容器时保留卷数据Compose 会保留您的服务使用的所有卷。当docker-compose up 运行时,如果发现任何集装箱从之前的运行,它会将从旧容器到新容器的体积。此过程可确保您在卷中创建的任何数据都不会丢失。 如果您docker-compose在 Windows 机器上使用,请参阅 环境变量并根据您的特定需求调整必要的环境变量。 只重新创建已经改变的容器Compose 缓存用于创建容器的配置。当您重新启动未更改的服务时,Compose 会重新使用现有容器。重用容器意味着您可以非常快速地更改环境。 变量和在环境之间移动组合Compose 支持 Compose 文件中的变量。您可以使用这些变量为不同的环境或不同的用户自定义您的构图。有关更多详细信息,请参阅变量替换。 定义项目Dockerfile由于目前还只有后端,所以暂时Dockerfile只有一个后端的,来看下Dockerfile文件:
这里用到了多段构建,多阶段构建可以由多个 FROM 指令识别,每一个 FROM 语句表示一个新的构建阶段,阶段名称可以用 AS 参数指定 在声明构建阶段时,可以不必使用关键词 AS,最终阶段拷贝文件时可以直接使用序号表示之前的构建阶段(从零开始)。也就是说,下面两行是等效的:
分析在这个Dockerfile文件中使用了两段构建,可以发现在两个阶段都存在着alpine字样,那么alpine究竟是什么呢。 对于那些耳熟能详的发行版(例如 Ubuntu、Debian、Fedora)来说,只能通过删除某些工具(例如 ifconfig 和 netstat)将镜像体积控制在 100M 以下。而对于 Alpine 而言,什么都不用删除,镜像大小也就只有 5M 而已。 Alpine 镜像的另一个优势是包管理工具的执行速度非常快,安装软件体验非常顺滑。诚然,在传统的虚拟机上不需要太关心软件包的安装速度,同一个包只需要装一次即可,无需不停重复安装。容器就不一样了,你可能会定期构建新镜像,也可能会在运行的容器中临时安装某些调试工具,如果软件包的安装速度很慢,会很快消磨掉我们的耐心。 其实我感觉现在整个build的过程就已经慢如蜗牛了,虽然我的镜像build完才65M。 run 阶段使用 Alpine其实仅在run阶段使用Alpine,也不是最佳的选择,因为我们使用Alpine的最重要原因就是其体积小,build出来的镜像整体体积都非常小,所以更多时候采用的都是全局使用Alpine。 Alpine使用的是动态库,可以根据自己的需要进行挂载,但是需要注意的是他的标准库使用的是musl libc,这个库相对于其他发行版的动态库glibc而言更小、更简单、更安全,然而二者也不兼容,所以想让程序跑在 Alpine 镜像中,必须在编译时使用 musl libc 作为动态库。 所有阶段使用 Alpine为了生成一个与 musl libc 链接的二进制文件,有两条路: 幸运的是golang官方就支持Alpine版本,在使用时,可以直接这样指定使用Alpine版本FROM golang:alpine。 但是其他官方不支持Alpine版本的怎么解决呢,例如c语言就没有gcc:alpine,这种情况就只能自力更生,从Alpine基础镜像自己组建环境,安装C的编译器。 但是这里还不能直接安装个gcc上去,因为gcc只是个编译器,没有提供依赖的各种基础库,这里可以安装build-base,相当于 Ubuntu 的 build-essentials,引入了编译器、标准库和 make 之类的工具。 可以以下面的小Dockerfile为例:
可以看见使用RUN apk add命令进行软件的安装。 到这里应该了解了本文Dockerfile文件的大致流程,使用两个阶段构建,第一阶段使用golang:alpine镜像,进行项目编译工作,得到可运行于Alpine基础镜像的二进制可执行文件。 COPY --from 使用绝对路径为每一个构建阶段指定WORKDIR,然后所有路径均使用绝对路径是一个好习惯。 第一阶段可以看见第一阶段首先指定了WORKDIR路径为/go/src/ETS/Server,然后使用COPY 命令,这个命令会将Docker目录下所有的文件复制到golang:alpine镜像的WORKDIR所在路径内,然后执行RUN。 这里使用的&&是将几个命令一起执行,如果分开执行也是可以的,如下:
但是这样分开执行得到的镜像和&&链接执行得到的实际上是相同的,但是优点在于打包时层数变少,可以理解为,执行一个RUN打包的层数会增加一层,虽然减少层数并不能见效打包的体积,但是会获得更快的打包速度,速度也是重要的参考量。 到此完成了第一阶段的构建,得到了在基础镜像Alpine中可以运行的二进制文件。 第二阶段构建在第二阶段中首先指定第二阶段的WORKDIR,保持与第一阶段相同,然后从第一阶段复制二进制文件,这里使用的是绝对路径,由于上下两个阶段都指定了WORKDIR,而且第二阶段复制时也是使用的绝对路径,这就不会造成一些复制时文件找不到,运行时路径错误等玄学问题。 最后使用EXPOSE 8888对外暴露端口8888. 最后再看一下最后的Dockerfile:
总结1、为了打包镜像体积尽可能小,最优全局使用alpine基础镜像进行构建 定义docker-compose.yml先来看下完整的docker-compose.yml文件内容
可以发现包含三个主要部分,即分别为version、networks、services version这部分是指定docker-compose使用的版本,具体的版本信息变更可以看官网:编写文件版本和升级 这里使用version: “3” networks此项目使用了一个自定义的docker网络。
所有服务互通由于我们在构建自己的服务时,常常会有很多不同的容器同时运行,彼此之间需要进行访问,例如你的服务需要使用数据库mysql,肯定需要进行连接。 宿主机访问服务端口通过docker-compose的默认网络就可以在宿主机上面访问服务的端口,但是docker-compose的默认网段是每次都会变化的。要想解决这个问题就只能通过在宿主机上面建立一个固定网段的网络,然后指定服务的网络为这个已经存在的网络,这样宿主机就可以通过这个网络的网关访问服务的端口了。 而且Docker-compose 默认 IP 子网与内部网络主机访问冲突也存在冲突的可能,所以更改Docker 子网也是常用的方法。 在文件中的networks字段下新建了一个network,这也是服务起来后字段ets_network中后面的network名,这里的网络服务名可以进行更换。 IPAM是配置部分的名称。IPAM是首字母缩写,代表IP地址管理。 driver是驱动部分的名称,这里使用了一个default默认网络。 config是网络配置吗这里划定了工作的网段,下面的services可以从这里面选取用来定义自己的网络。 services本项目中services下暂时只有三个服务,这里以server为例。 image一些服务下面可能有image,即镜像名,指定当前这个服务的镜像名称或者镜像ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。
build服务除了可以基于指定的镜像,还可以基于一份 Dockerfile,在使用 up 启动之时执行构建任务,这个构建标签就是 build,它可以指定 Dockerfile 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器。 其中context是指定的上下文目录,可以是相对或者绝对路径。 如果你同时指定了 image 和 build 两个标签,那么 Compose 会构建镜像并且把镜像命名为 image 后面的那个名字。 既然可以在 docker-compose.yml 中定义构建任务,那么一定少不了 arg 这个标签,就像 Dockerfile 中的 ARG 指令,它可以在构建过程中指定环境变量,但是在构建成功后取消,在 docker-compose.yml 文件中也支持这样的写法:
下面这种写法也是支持的,一般来说下面的写法更适合阅读。
这样构建过程可以向它们赋值。
container_name前面说过 Compose 的容器名称格式是:<项目名称><服务名称><序号> restart
在3.7中已经被RESTART_POLICY取代。 RESTART_POLICY3.7中出现的,用来取代restart,配置是否以及如何在容器退出时重新启动容器
ports映射端口信息 注意:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果,因为 YAML 会自动解析 xx:yy 这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式
expose暴露端口,但不映射到宿主机,只被连接的服务访问
depends_on解决容器的依赖、启动先后的问题
实例中先启动容器 db 和 redis 再启动 web,注意:web 服务不会等待 redis 和 db 「完全启动」之后才启动 linkslinks:将指定容器连接到当前连接,可以设置别名,避免ip方式导致的容器重启动态改变的无法连接情况
这会让server连接mysql服务和redis服务 volumes卷挂载路径
下面的实例是为了解决容器启动时,与本地时间区不一致,导致功能异常的解决方法
networks这里说的networks是services的某一个服务的下级字段,是定义此服务的网络信息,例如这里是定义server的网络信息,设置其host信息,但是这里的ip字段要在顶级networks的区段内。 environment环境变量配置,可以用数组或字典两种方式
command覆盖容器启动后默认执行的命令
运行至此项目的docker-compose文件中用到的参数均已叙述完,也定义好项目的docker-compose文件了,下就是使用命令编译运行所有的容器就可以了。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 16:51:26- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |