Docker & ASP.NET Core (4):容器间的连接
<p>第一篇:把代码连接到容器 </p><p>第二篇:定制Docker镜像</p>
<p>第三篇:发布镜像</p>
<p> </p>
<h1>Docker容器间的连接</h1>
<p>Docker提供了两种方式可以用来做容器间的连接/通信:</p>
<ul>
<li>Legacy Linking:这种方式使用容器名进行连接,实际上它创建了一个桥接的网络,在这个网络里,容器间可以进行通信。</li>
<li>把容器添加到桥接网络:这种方式是创建了一个自定义的桥接网络,它的类型是isolated network(隔离网络),只有在这个网络里的容器才能互相通信。</li>
</ul>
<p> </p>
<h1>Legacy Linking</h1>
<p>Legacy Linking,也就是按照容器名进行连接。</p>
<p>要想使用Legacy Linking,总共分这几步:</p>
<ol>
<li>运行一个容器,需要给容器起一个名字</li>
<li>通过容器名,连接到正在运行的容器</li>
<li>如果还有其它容器要通信,那么重复上述步骤即可。</li>
</ol>
<h2>准备数据库项目</h2>
<p>我准备使用ASP.NET Core做一个Web应用,数据库使用PostgreSQL,应用和数据库分别放在两个不同的容器里。</p>
<p> </p>
<p>先弄数据库:</p>
<p>https://store.docker.com/images/postgres</p>
<p>docker pull postgres</p>
<p>然后运行容器,别忘了起名:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181126192637635-1951980670.png" alt=""></p>
<p>这里设置了POSTGRES_PASSWORD这个环境变量,它在容器里就是数据库的密码。</p>
<p> </p>
<h2>准备ASP.NET Core MVC项目</h2>
<p>然后再建立一个ASP.NET Core 项目:</p>
<p>就选择ASP.NET Core MVC模板,不带身份验证,建立一个项目即可。</p>
<p>然后需要添加Npgsql.EntityFrameworkCore.PostgreSQL这个库。</p>
<p>建立DbContext:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181126193032157-1499159257.png" alt=""></p>
<p> </p>
<p>在Startup里配置:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181126192925863-731694727.png" alt=""></p>
<p>配置连接字符串:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181126192950155-210730693.png" alt=""></p>
<p> </p>
<p>设置自动迁移,并添加种子数据:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181126202859966-1842873634.png" alt=""></p>
<p> </p>
<p>去掉HTTPS相关设置,让其监听5000端口:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181126200408475-1813072405.png" alt=""></p>
<p>然后添加一个Migration:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181126200449374-2024310102.png" alt=""></p>
<p> </p>
<h2>创建ASP.NET Core Web应用的容器</h2>
<p>建立Dockerfile:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181126193344307-2096058480.png" alt=""></p>
<p> </p>
<p>创建镜像:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181126193520330-407287775.png" alt=""></p>
<p> </p>
<p>运行容器:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181126203130950-1954396584.png" alt=""></p>
<p> </p>
<p>在这里, --link my-postgres:postgres-server 就是通过容器名连接到了my-postgres这个容器,连接之后把该my-postgres这个容器名映射为postgres-server这个名称,这个名称和连接字符串里的HOST的名字一致:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181126192950155-210730693.png" alt=""></p>
<p> </p>
<p>看一下正在运行的容器:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181126203250532-567242617.png" alt=""></p>
<p>可以看到数据库和Web应用的容器都在运行。</p>
<p> </p>
<h2>连接到正在运行的数据库容器</h2>
<p>我想看一下在数据库容器里是否成功创建了Students表,以及里面是否有种子数据了。可以使用:</p>
<p><span style="color: rgba(255, 0, 0, 1)"><strong>docker exec 容器名/ID 命令</strong></span>,来对容器执行某个命令。</p>
<p>这里我这样写:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181126203604291-1113399638.png" alt=""></p>
<p>进入交互模式,并打开bash。</p>
<p> </p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181126203705571-1932679303.png" alt=""></p>
<p>可以看到种子数据已经添加成功了。</p>
<p> </p>
<h2>查看Web应用的Log</h2>
<p>使用<span style="color: rgba(255, 0, 0, 1)"><strong>docker logs 容器名/ID</strong></span>来查看log:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181126203827623-613957763.png" alt=""></p>
<p> </p>
<p>应该没问题。</p>
<p> </p>
<p>最后访问http://localhost:5000:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181126203939419-98118677.png" alt=""></p>
<p>可以看到,web应用和数据库两个容器之间已经正常的连接并运行了。</p>
<p> </p>
<h1>容器网络</h1>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181127190352514-700211812.png" alt=""></p>
<p>容器的网路,或者叫桥接的网络。</p>
<p>可以这样想,在一个Docker Host里,有许多容器,他们之间需要相互通信。我们可以使用容器名进行通信,尤其是开发的时候。</p>
<p>但是当容器比较多的时候,你可能就倾向于对一些容器进行隔离,或者叫做分组。</p>
<p>而我们通过Docker客户端就可以创建这种隔离的网络。每一个隔离网络里的容器可以相互通信,这时也使用容器名进行通信。</p>
<p>有了这种隔离的网络,对容器间的通信管理就方便多了。</p>
<p> </p>
<h2>创建容器网络的步骤</h2>
<ul>
<li>首先,创建一个自定义的桥接网络</li>
<li>然后,让容器运行于这个自定义的桥接网络。也可以让一个容器运行于多个网络中。</li>
</ul>
<p>使用这个命令创建网络:</p>
<p><span style="color: rgba(255, 0, 0, 1)"><strong>docker network create --driver bridge 网络名</strong></span>。</p>
<p>这句话就是使用桥接网络来建立一个自定义网络。</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181127191820944-673249703.png" alt=""></p>
<p> </p>
<p>然后我让容器加入到这个网络里。其命令大致如下:</p>
<p><span style="color: rgba(255, 0, 0, 1)"><strong>docker run -d --network=网路名 --name 网络内的容器名 镜像名</strong></span>。</p>
<p> </p>
<p>首先为了演示方便,我把其余的容器都删掉了:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181127192028421-2006683703.png" alt=""></p>
<p> </p>
<p>然后,我把现有的网络列举一下。docker network ls:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181127192506829-150084958.png" alt=""></p>
<p>可以看到之前建立的my-net也在里面。</p>
<p> </p>
<p>我们也可以inspect一下这个网络:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181127192709635-753336317.png" alt=""></p>
<p>可以看到里面还没有任何的容器。</p>
<p> </p>
<p>然后,我运行postgres的容器,让其加入该网络:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181127192826577-1034725154.png" alt=""></p>
<p> </p>
<p>这时再次inspect该网络,可以看到这个容器已经进入网络了:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181127192911529-2096575907.png" alt=""></p>
<p> </p>
<p> 然后再把ASP.NET Core应用的容器添加到该网络:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181127193036093-2021872284.png" alt=""></p>
<p>注意这里不需要使用--link了。</p>
<p> </p>
<p>再次inspect该网络:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181127193122751-1886997956.png" alt=""></p>
<p>可以看到里面有两个容器了。</p>
<p> </p>
<p>然后访问http://localhost:5000,网站仍然可以正常访问:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201811/986268-20181127193209850-707941756.png" alt=""></p>
<p> </p>
<p>今天先到这。。。</p>
<p> </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/10022797.html
頁:
[1]