Docker最全教程——从理论到实战(五)

在笔者参加腾讯容器服务技术交流会时,我们了解到了藏区牧民的目前的生活艰辛状况,因此除了在同事朋友之间推荐其土特产之外,我们也在此进行初步分享,希望略尽绵薄之力,能够帮助到他们:

货真价实、确保都是3700米海拔以上的超风干牦牛肉,115元一斤包邮(货真价实、低于淘宝京东、我们不赚差价),有香辣、五香两种口味,三斤牦牛肉才能做出一斤超风干牛肉!希望这个冬天,我们能够给他们一点点温暖!有购买意向的朋友可以填写下面的表单,也可以直接打开【阅读原文】:

http://s6xvpjrifokd29yh.mikecrm.com/8ZRMvSn

640?wx_fmt=png

目录

640?wx_fmt=png640?wx_fmt=png640?wx_fmt=png640?wx_fmt=png


创建自定义 Docker 镜像


创建了Dockerfile之后,需为应用程序中的每项服务创建一个相关镜像。如果应用程序由单个服务或 Web 应用程序组成,则只需创建一个镜像。

我们可以使用docker build命令来创建镜像,例如:

docker build ./ -t {镜像名称}

640?wx_fmt=png640?wx_fmt=png

镜像打包好后,我们使用docker image ls命令即可查看当前镜像:

640?wx_fmt=png

注意:Docker镜像使用分层存储的架构,也就是说镜像实际是由多层文件系统联合组成。镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。因为分层存储的特征,使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。所以,当我们使用Docker images命令,会列出这么多的镜像,我们可以定期清理那些无用的镜像。

如果使用 Visual Studio 创建带 Docker 支持的项目时,不会显式创建镜像。我们按下 F5 并运行时,VS就会自动创建镜像,不会出现明显的过程(在输出面板可以了解整个过程,如下图所示),但我们需要了解其原理,否则出现问题将无从下手。

640?wx_fmt=png


在 docker-compose.yml中定义服务


关于Compose

Compose是一个用于定义和运行多Docker应用程序的工具。使用Compose,我们可以使用YAML文件来配置应用程序的服务。然后,使用单个命令,我们就可以从配置中创建并启动所有服务。

Compose适用于所有环境:生产环境、模拟(演示)环境、开发环境和测试环境以及CI工作流程。

主要功能和特性:

  • 单个主机上的多个隔离环境

    Compose使用项目名称来隔离环境,因此可以根据不同的环境要求来进行定义。

  • 创建容器时保留卷数据

    Compose会保留服务使用的所有卷和数据。当使用docker-compose up命令运行时,如果发现该服务之前运行过,它会将进行增量操作,可确保在卷中创建的数据都不会丢失。

  • 仅重新创建已更改的容器

    Compose存在缓存,可用于创建容器。当重新启动未更改的服务时,Compose将重用现有容器。

  • 可以定义变量,而且可以根据不同环境不同用户之间进行组合使用

    Compose支持Compose文件的变量定义,我们可以使用这些变量为不同环境或不同用户进行自定义组合。

另外,Compose能够通过命令管理应用程序的整个生命周期,通过命令可以:

  • 启动,停止和重建服务等

  • 查看正在运行的服务的状态

  • 通过流输出正在运行的服务的日志

  • 对某个服务执行命令

注意:Docker for Windows安装包括:安装提供 Docker Engine,Docker CLI客户端,Docker Compose,Docker Machine和 Kitematic。也就是如果是使用Docker for Windows的用户,无需再独立安装Docker Compose。

我们可以通过运行以下命令来确认我们本地的环境:

docker-compose -v

640?wx_fmt=png


常见场景

  • 开发或本地环境运行多个服务

    在开发过程时,在隔离环境中运行应用程序并与之交互的能力至关重要。Compose命令行工具可用于创建环境并与之交互。比如通过Compose文件,配置所有应用程序的服务依赖(数据库,消息队列,高速缓存,Web服务的API,等等),然后使用单个命令(docker-compose up)为每个依赖项创建和启动一个或多个容器,使整个程序能够正常运行起来。

  • 自动化测试环境

    任何持续部署或持续集成过程的一个重要部分是自动化测试套件。自动化端到端测试需要一个运行测试的环境。Compose提供了一种方便的方法来创建和销毁隔离的测试环境。我们只需要通过在Compose文件,即可定义完整环境,并且可以在几个命令中创建和销毁这些环境,如下所示:

640?wx_fmt=png
  • 单主机部署


使用Compose

使用Compose有以下三个步骤:

  1. 使用Dockerfile定义应用环境,以便在任意地方进行复制

  2. 在 docker-compose.yml 中定义组合应用,以便它们可以在隔离的环境中一起运行

  3. 最后,执行docker-compose up命令,Compose 将启动并运行整个应用程序。

由此可见,第二步决定了Compose的执行,一个简单的docker-compose.yml文件如下所示:

640?wx_fmt=png

其定义了web和redis两个应用。接下来,我们一起来了解docker-compose.yml 文件。


了解docker-compose.yml

借助 docker-compose.yml 文件,我们可以定义一组相关服务,通过部署命令将其部署为组合应用程序。简单的说,我们可以通过docker-compose.yml来定义多个服务,以便一次执行。

640?wx_fmt=jpeg

这里笔者以Magicodes.Admin为例,基础框架提供了后台接口服务以及后台前端应用两个,那么我们可以定义docker-compose.yml 文件以便部署为组合应用程序,也就是说,一个命令托管和运行多个服务:

640?wx_fmt=png

以上是一个简化的配置,定义了两个服务以及环境变量和端口。值得说明的是,在docker中我们无法访问localDb,这时我们建议访问独立的数据库服务或者使用数据库镜像,例如:

sql.data:

image: mssql-server-linux:latest

environment:

- SA_PASSWORD=Pass@word

- ACCEPT_EULA=Y

ports:

- "5433:1433"

注意:SQL Server也提供了Docker镜像,并且支持Linux容器。在上面的配置中,通过环境变量设置了sa账号的密码。值得注意的是,我们并不推荐在生产环境中使用数据库的容器镜像来托管数据,这点我们后续再来详聊。


了解YAML语言

很多教程并不会讲述这点,但是笔者认为这点也非常重要,因为了解YAML的语法和规范,可以在开发调测的过程中避免很多错误,也便于我们更好的配置基于YAML语法的文件——比如docker-compose.yml文件。


什么是YAML?

YAML 是一种简洁的非标记语言。YAML以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易读。

这里提供一个YAML语法验证网站:http://nodeca.github.io/js-yaml/

基本规则

  1. 大小写敏感

  2. 使用缩进表示层级关系

  3. 禁止使用tab缩进,只能使用空格键

  4. 缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级

  5. 使用#表示注释

  6. 字符串可以不用引号标注

YAML中允许表示三种格式,分别是常量值,对象和数组,如下所示:

640?wx_fmt=png


对于YAML的讲解,我们就说到这里,我们继续本篇内容。


docker-compose.yml文件配置项

docker-compose.yml 文件不仅指定正在使用的容器,还指定如何单独配置各容器。常用的配置项如下所示:

  • build:定义镜像生成,可以指定Dockerfile文件所在的目录路径,支持绝对路径和相对路径;

  • image:从指定的镜像中启动容器,可以是存储仓库、标签以及镜像 ID,如果镜像不存在,Compose 会自动拉去镜像;

  • environment:定义环境变量和配置;

  • ports:定义端口映射,比如上面配置中将容器上的公开端口 80 转接到主机上的外部端口 9901和9902;

  • depends_on,定义依赖关系。此定义会让当前服务处于等待状态,直到这些依赖服务启动。比如某个服务依赖数据库服务,那么通过此配置解决了服务的启动顺序的问题;

  • volumes,挂载一个目录或者一个已存在的数据卷容器,可以直接使用 HOST:CONTAINER 这样的格式,或者使用 HOST:CONTAINER:ro 这样的格式,后者对于容器来说,数据卷是只读的,这样可以有效保护宿主机的文件系统;

  • context,指定Dockerfile 的文件路径,也可以是到链接到 git 仓库的 url;

  • args,指定构建参数,这些参数只能在构建过程中访问;

  • target,定义构建指定的阶段Dockerfile,比如针对不同阶段使用不同的dockerfile,开发阶段使用支持编译调试的dockerfile,而生产环境,则使用轻量级的dockerfile;command,覆盖默认命令;

  • container_name,指定自定义容器名称,而不是生成的默认名称。

640?wx_fmt=png

由于篇幅有限,我们就不提供过多介绍和示例了。不过我们建议大家访问此地址,来做一个全面的了解:

https://docs.docker.com/compose/compose-file/#reference-and-guidelines

最后,分享几个小技巧:

  • 可以通过配置项depends_on来定义依赖关系,这点对于控制服务的执行顺序尤为重要,比如先启动数据库然后再启动web服务。

  • 如何使用JSON文件进行配置?可以指定文件名称,如下所示:

    docker-compose -f docker-compose.json up

  • 如何分阶段构建?推荐使用target配置项。


Visual Studio和docker-compose

我们定义完docker-compose.yml之后,如果是使用Visual Studio进行开发,通过其Docker tool会让开发调测变得非常简单和易用。对于未启用docker支持的项目,我们可以通过右键菜单进行启用:

640?wx_fmt=png

启用之后,会自动添加相关支持(包括生成dockerfile、docker-compose.yml以及.dockerignore等),然后通过其docker工具可以直接启动运行并且支持调试,如下图所示:

640?wx_fmt=png

点击工具栏的【Docker】按钮或者按下【F5】均可直接运行并调试,启动后如下图所示:

640?wx_fmt=png

运行完成后,VS还会自动打开相关服务的默认页。

如果不依赖Visual Studio进行运行,我们在下节进行讲述。


前期内容

Docker最全教程——从理论到实战(一)

Docker最全教程——从理论到实战(二)

Docker最全教程——从理论到实战(三)

Docker最全教程——从理论到实战(四)

长按识别二维码,了解更多精彩内容

640?wx_fmt=gif640?wx_fmt=jpeg640?wx_fmt=gif

如果喜欢作者的文章,请关注“magiccodes”订阅号以便第一时间获得最新内容。本文版权归作者和湖南心莱信息科技有限公司共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。


QQ群:

编程交流群<85318032> 

产品交流群<897857351> 


640?wx_fmt=gif

点“阅读原文”填写购买信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2021牛客暑期多校训练营6 J-Defend Your Country(无向图点双+思维)

无向图联通分量 点u是割点&#xff0c;当且仅当 特判树根&#xff1a;u为树根&#xff0c;且u有多于1棵子树u不为树根&#xff0c;在递归树上u存在子节点v&#xff0c;满足&#xff1a;dfnu≤lowv\text{dfn}_u\leq \text{low}_vdfnu​≤lowv​ 如上图&#xff0c;v想走到u的组…

牛客题霸 [比较版本号] C++题解/答案

牛客题霸 [比较版本号] C题解/答案 题目描述 如果version1 > version2 返回1&#xff0c;如果 version1 < version2 返回-1&#xff0c;不然返回0. 输入的version字符串非空&#xff0c;只包含数字和字符.。.字符不代表通常意义上的小数点&#xff0c;只是用来区分数字…

不止代码:循环比赛(分治)

循环比赛日程表&#xff08;match&#xff09; 【问题描述】 解析 dfs或分治 分治可以不断递归4个小正方形 左上右下为前一半&#xff0c;左下右上后一半 dfs就很无脑了 代码 #include<cstdio> #include<cstring> #include<algorithm> #include<cmath…

P4983-忘情【wqs二分,斜率优化】

正题 题目链接:https://www.luogu.com.cn/problem/P4983 题目大意 给出长度为nnn的序列xxx&#xff0c;记平均数为xˉ\bar{x}xˉ&#xff0c;要求将序列分成mmm段。 每一段[l,r][l,r][l,r]的值为 ((∑ilrxixˉ)xˉ)2xˉ2\frac{((\sum_{il}^rx_i\times \bar x)\bar x)^2}{\bar…

前瞻科技,引领未来!Microsoft Connect(); 2018即将重磅来袭!

怎么用一句话点燃全球的开发者&#xff1f;——Microsoft Connect(); 2018即将重磅来袭&#xff01;每一个观点都能引发科技狂潮&#xff0c;每一项技术都将提速技术进程&#xff0c;由微软举办的 Microsoft Connect(); 2018 即将在太平洋时间12月4日8:30拉开帷幕&#xff01;大…

2021“MINIEYE杯”中国大学生算法设计超级联赛(7)Yiwen with Formula(任意模数FFT)

Yiwen with Formula 溢流眼泪题解 生成函数化成n个多项式乘积&#xff0c;然后分治把他们依次相乘&#xff0c;需要由于指数需要modϕ(998244353)998244353−1\bmod \phi(998244353)998244353-1modϕ(998244353)998244353−1&#xff0c;因此需要任意模数的FFT。。。 常数贼大…

牛客题霸 [ 孩子们的游戏] C++题解/答案

牛客题霸 [ 孩子们的游戏] C题解/答案 题目描述 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开…

4.1模拟报告

总结 做的很坎坷。。。 一些细节上的玄学bug &#xff08;上次也一样。。。&#xff09; 还是要加强基础&#xff01;&#xff01;&#xff01; T1 x的实根 不贴了&#xff0c;就是水题。。。 T2 二分查找 就是lowerbound T3逆序对 1.树状数组 2.归并排序 注意&#xff…

P5048-[Ynoi2019 模拟赛]Yuno loves sqrt technology III【分块】

正题 题目链接:https://www.luogu.com.cn/problem/P5048 题目大意 就是这个 【QA】区间众数&#xff0c;但空间很小 长度为nnn的序列&#xff0c;要求支持查找区间众数出现次数。 强制在线 1≤n,m≤51051\leq n,m\leq 5\times 10^51≤n,m≤5105 解题思路 空间小就不能用蒲公…

2021牛客暑期多校训练营7 J-xay loves Floyd(最短路+bitset优化集合交)

J-xay loves Floyd ANJHZ题解 abcdhhhh_题解 如果di,jwi,j\text d_{i,j}\text w_{i,j}di,j​wi,j​,那么按照题意中的算法仍然能得到正确的结果。此时记cani,j1\text{can}_{i,j}1cani,j​1。 如果存在vvv&#xff0c;使得①cani,v1\text{can}_{i,v}1cani,v​1②canv,j1\text{…

通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)

前言读完上篇《通俗易懂&#xff0c;C#如何安全、高效地玩转任何种类的内存之Span(一)》&#xff0c;相信大家对span的本质应该非常清楚了。含着金钥匙出生的它&#xff0c;从小就被寄予厚望要成为.NET下编写高性能应用程序的重要积木&#xff0c;而且很多老前辈为了接纳它&…

4.6模拟 宽度优先搜索

总结 bfs除了代码能力没有任何算法。。。 有些细节是值得注意的 T1 面积(area) bfs被我写成了dfs。。。 &#xff08;不过我觉得这么写挺不戳&#xff09; 核心思路就是用一个flag记录当前跑得这些点有没有效 恶心之处在于本题默认mn10&#xff01;&#xff01;&#xff01;…

牛客题霸 [ 有重复项数字的所有排列] C++题解/答案

牛客题霸 [ 有重复项数字的所有排列] C题解/答案 题目描述 给出一组可能包含重复项的数字&#xff0c;返回该组数字的所有排列。 题解&#xff1a; 很多人应该都是用的递归方式来做&#xff0c;这里介绍一个stl的next_permutation 在头文件里&#xff0c;可以产生全排列 ne…

2021牛客暑期多校训练营7 F-xay loves trees(线段树+滑动窗口)

F-xay loves trees 考虑在树1中满足条件的一些点&#xff0c;首先不难想到一定是一条链&#xff0c;其次如果点uuu被选择那么在树2以uuu为根的子树的点就禁止被选&#xff0c;于是只需区间&#xff0c;然后查询区间最值是否存在>1也就是树2中覆盖次数超过2的节点即可。 首…

微软开发者大会:VS 2019 Preview 发布;Windows UX 主要技术开源

美国当地时间12月4日&#xff0c;微软正式举行 Microsoft Connect(); 2018 开发者大会&#xff0c;本次大会的 slogan 是"Build the apps of tomorrow, today."。在今年的大会上&#xff0c;看得出来微软不是憋了一个 —— 而是憋了一波大招。不妨先看一下这次大会微…

不止代码:迷宫问题(bfs)

题目描述 如下图所示&#xff0c;给出一个N*M的迷宫图和一个入口、一个出口。 编一个程序&#xff0c;打印一条从迷宫入口到出口的路径。这里黑色方块的单元表示走不通&#xff08;用-1表示&#xff09;&#xff0c;白色方块的单元表示可以走&#xff08;用0表示&#xff09;。…

asp.net core sdk runtime 镜像[已更新至2.2.0]

在官方镜像的脚本上&#xff0c;增加了System.Drawing相关的依赖库以北京时间为默认的时间2.2.0Windows SDK地址:官方: https://dotnetcli.blob.core.windows.net/dotnet/Sdk/2.2.100/dotnet-sdk-2.2.100-win-x64.exe自己的加速地址: http://file.niusys.com/dotnet-sdk-2.2.10…

P7726-天体探测仪(Astral Detector)【构造】

正题 题目链接:https://www.luogu.com.cn/problem/P7726 题目大意 一个长度为nnn的排列&#xff0c;给出nnn个可重集SiS_iSi​表示所有长度为iii的区间的最小值构成的集合。 求构造这个排列。 1≤n≤8001\leq n\leq 8001≤n≤800 解题思路 对于一个数字&#xff0c;如果在S…

牛客题霸 [ 大数乘法] C++题解/答案

牛客题霸 [ 大数乘法] C题解/答案 题目描述 以字符串的形式读入两个数字&#xff0c;编写一个函数计算它们的乘积&#xff0c;以字符串形式返回。 &#xff08;字符串长度不大于10000&#xff0c;保证字符串仅由’0’~9’这10种字符组成&#xff09; 题解&#xff1a; 高精…

2021牛客暑期多校训练营5 D-Double Strings(dp+组合数)

D-Double Strings fi,jf_{i,j}fi,j​表示a中前i个字符&#xff0c;b中前j个字符相同子序列的数量&#xff0c;容斥转移 fi,jfi−1,jfi,j−1−fi−1,j−1{(1fi−1,j−1)[aiaj]}f_{i,j}f_{i-1,j}f_{i,j-1}-f_{i-1,j-1}\{(1f_{i-1,j-1})[a_ia_j]\}fi,j​fi−1,j​fi,j−1​−fi−1…