Docker & ASP.NET Core (5):Docker Compose
<p>第一篇:把代码连接到容器 </p><p>第二篇:定制Docker镜像</p>
<p>第三篇:发布镜像</p>
<p>第四篇:容器间的连接</p>
<p> </p>
<h1>Docker Compose简介</h1>
<p>Compose是一个用来定义和运行多容器Docker应用的工具。使用Compose的时候,你可以使用一个YAML文件来配置你应用的服务。然后根据配置,使用一个命令即可创建并运行所有的服务。</p>
<p>使用Compose的时候通常分三步:</p>
<ol>
<li>使用Dockerfile定义你的环境</li>
<li>在docker-compose.yml文件里定义你的服务,这样就可以让他们在隔离的环境中一起运行了。</li>
<li>运行docker-compose up 命令,来启动和运行整个应用。</li>
</ol>
<p> </p>
<h2>Docker Compose的特点</h2>
<p>Docker Compose可以做很多事情,但是如果只考虑在开发环境里,它可以做下面这些事情:</p>
<ul>
<li>管理整个应用的生命周期:启动、停止、重构建服务,而服务呢,其实就是运行的容器而已。</li>
<li>查看在运行的服务的状态,包括输出日志。</li>
<li>可以在单个容器上运行一次性命令。</li>
</ul>
<p> </p>
<h2>为什么要使用Docker Compose</h2>
<p>通常来说,如果你的应用稍微有点规模,例如你的Web应用需要使用Web服务器,缓存服务器,数据库服务器。。。如果你手动管理这样的docker应用,就很繁琐,也很容易出错。</p>
<p>而如果使用Docker Compose的话,它可以定义一个docker-compose.yml文件,在这个文件里,你可以定义所有的这些服务,以及它们之间的关系。</p>
<p> </p>
<h1>docker-compose.yml文件</h1>
<p>docker-compose.yml文件就是用来配置服务的,这里有一个官网给出的例子:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181129194514041-1622563098.png" alt=""></p>
<p> </p>
<p>这个文件写好之后,就可以开始Docker Compose的构建过程了。</p>
<p>这个构建的过程实际上会生成镜像,然后使用这些镜像就可以创建容器了。</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181129195523419-1795364436.png" alt=""></p>
<p>然后再使用一个简单的命令,就可以让这些服务启动并运行了。</p>
<p> </p>
<p>下面简单讲一下这个docker-compose.yml文件:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181129200732532-1886904366.png" alt=""></p>
<p>第一行是版本。</p>
<p>下面services,就是服务。</p>
<p>在services里,可以定义当构建docker-compose.yml文件时想要运行的服务,然后把这些镜像以容器运行。这里可以定义ASP.NET Core,node,数据库,缓存等等。</p>
<p>看一下服务里的东西:</p>
<ul>
<li>build,里面可以定义构建的上下文,例如在哪个文件见来进行构建;还可以指定使用的dockerfile。</li>
<li>在这里也可以定义环境变量。</li>
<li>image,定义镜像。</li>
<li>networks,可以把服务和定义好的网络联系起来。</li>
<li>ports,定义端口。</li>
<li>volumes,定义卷。</li>
</ul>
<p>也可以在里面定义networks等等。</p>
<p> </p>
<h1>Docker Compose的命令</h1>
<ul>
<li><span style="color: rgba(255, 0, 0, 1)"><strong>docker-compose build</strong></span> 把服务构建成镜像。</li>
<li><span style="color: rgba(255, 0, 0, 1)"><strong>docker-compose up</strong></span>,一旦镜像准备好了,那就就执行该命令,启动那些镜像,使之成为容器运行。</li>
<li><span style="color: rgba(255, 0, 0, 1)"><strong>docker-compose down</strong></span>,可以使用该命令停止、删除由up命令建立的一切东西。</li>
</ul>
<p>此外还有这些常用形式的命令:</p>
<ul>
<li>docker-compose logs</li>
<li>docker-compose ps</li>
<li>docker-compose stop</li>
<li>docker-compose start</li>
<li>docker-compose rm</li>
</ul>
<p> </p>
<h2>docker-compose build</h2>
<p>这个命令会构建/重新构建定义在docker-compose.yml文件里的所有的服务,使用这一个命令就会一次性把所有服务需要的镜像都创建好。</p>
<p> </p>
<p>此外还可以构建单独的服务,例如: <strong>docker-compose build mongo</strong>。有时候你不想把所有的东西都重新构建一遍,你只想构建其中的一个服务。</p>
<p> </p>
<h2>docker-compose up</h2>
<p>一切都构建好之后,就可以启动并运行了。这时就会使用docker-compose up这个命令。</p>
<p>它会自动创建容器,并运行这些容器。</p>
<p> </p>
<p>该命令还可以加一些参数,例如 <strong>docker-compose up --no-deps node</strong>,它表示重新构建node镜像,停止、销毁重新创建node,但不重新创建node所依赖的服务。</p>
<p> </p>
<h2>docker-compose down</h2>
<p>该命令会停止所有的容器,然后删除它们。</p>
<p>如果只想停止容器,并不删除,那么应该使用docker-compose stop。</p>
<p> </p>
<p>此外如果你还想同时删除所有的镜像和volumes,你可以:</p>
<p><strong>docker-compose down --rmi all --volumes</strong>。</p>
<p> </p>
<h1>Docker Compose 实例</h1>
<p>前面文章里,我通过手动输入命令实现了一套ASP.NET Core 和 PostgreSQL的docker 应用。尽管该应用很简单,只有两部分组成,但当时还是输入了不少命令,也遇到了几次错误,相对还是繁琐一些。</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181130061228323-870559385.png" alt=""></p>
<p>现在我把这两个容器删掉(包括相应的镜像和网络都删掉吧),然后使用docker-compose来实现。</p>
<p> </p>
<h2>建立docker-compose.yml文件</h2>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181130062048283-1726633367.png" alt=""></p>
<p>注意,我还没写完。</p>
<p>这里我指定了版本为‘3’,当前也就是这个版本。</p>
<p>然后在services里,我定义了coreweb服务(ASP.NET Core Web应用),它的构建的上下文环境 context是.,也就是当前目录;使用的dockerfile是标准的Dockerfile;端口是映射到8080,内部端口是5000;使用的网络是aspcore-network。</p>
<p>最后边定义了网络,名为aspcore-network,类型是bridge桥接网络。</p>
<p> </p>
<p>然后继续写:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181130065753850-733559810.png" alt=""></p>
<p>这里又添加了postgres-server这个服务,它是直接使用的官方镜像postgres,网络还是同一个网络,但是这里设置了一个环境变量,是数据库的密码。</p>
<p> </p>
<h2>执行docker-compose build</h2>
<p>定义好docker-compose.yml之后,就可以进行构建了,执行<strong>docker-compose build</strong>:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181130062805827-129970469.png" alt=""></p>
<p>很快就完成了。</p>
<p> </p>
<p>然后看一下镜像列表:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181130063049266-219901600.png" alt=""></p>
<p>第一个就是我建立的coreweb,其实我们可以自定义它的名称。</p>
<p>而postgres这个镜像我早就下载下来了,所以它的创建时间比较早。</p>
<p> </p>
<h2>执行docker-compose up</h2>
<p><strong>docker-compose up</strong>:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181130063517591-1954916438.png" alt=""></p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181130063554196-824244607.png" alt=""></p>
<p>这里出现了一些问题:这是我第一次运行该项目,运行项目的同时,代码里会做数据库的自动迁移,但是ASP.NET Core Web应用先跑起来了,它开始做迁移,然后发现数据库服务还没跑起来呢,所以ASP.NET Core项目就报错了,它的容器就停掉了。而过了一会postgres的服务才启动完成。。。</p>
<p> </p>
<p>这也很好办,现在postgres的服务起来了,那么,我再手动启动一下ASP.NET Core Web的容器就可以了。docker-compose start coreweb:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181130063919569-1586410355.png" alt=""></p>
<p> </p>
<p>然后访问http://localhost:8080:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181130064002446-537525043.png" alt=""></p>
<p>网站就可以正常访问了。</p>
<p> </p>
<p>现在这种操作还有一点瑕疵,因为docker-compose up之后,终端里都是log,我们处在log模式下,无法做其它操作。需要再打开一个终端来执行其它命令:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181130064151291-1065236863.png" alt=""></p>
<p> </p>
<h2>执行docker-compose down</h2>
<p>所以我想重新搞一下,先把这套东西拆了:<strong>docker-compose down</strong>:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181130064307333-421072271.png" alt=""></p>
<p> </p>
<h2>试验其它命令</h2>
<p>为了避免上述问题,这次我们使用daemon mode 守护进程模式,<strong>docker-compose up</strong> <span style="color: rgba(255, 0, 0, 1)"><strong>-d</strong></span>:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181130064452287-1434776589.png" alt=""></p>
<p> </p>
<p>然后我们这次使用这个命令来看进程,<strong>docker-compose ps</strong>:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181130064618390-1040966488.png" alt=""></p>
<p>可以看到这两个容器,然后Web应用又发生前面的问题了,我在单独跑一下它:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181130064739450-620017150.png" alt=""></p>
<p>这次就OK了。</p>
<p> </p>
<p>再次访问网站:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181130064813234-1971132883.png" alt=""></p>
<p>还是可以正常运行的。</p>
<p> </p>
<p>下面看一下log,<strong>docker-compose logs</strong>:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181130064901407-889570671.png" alt=""></p>
<p> </p>
<p>最后销毁这套东西,这次我把相应的镜像也删掉 <strong>docker-compose down --rmi all</strong>:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181130065604976-104575323.png" alt=""></p>
<p>能删的都删除了,但这里postgres这个镜像无法删除是因为我还有其它容器使用该镜像。</p>
</div>
<div id="MySignature" role="contentinfo">
<p><img src="https://img2022.cnblogs.com/blog/986268/202201/986268-20220121212852077-392691317.png" width="500" height="182.45" alt="杨旭技术专栏"></p><br><br>
来源:https://www.cnblogs.com/yangxu-pro/p/10040590.html
頁:
[1]