Docker应用:Hello World
<h2>前言:</h2><p> 最近学习了Docker相关技术点,国内关于Docker的资料大多是基于Linux系统的,但是我对Linux又不熟(实际上没用过,掩面哭笑.Jpg)。</p>
<p>好在在Win10下也是支持Docker的,而且是支持Linux和Windows两种容器。</p>
<p> 在Win10下运行容器和在Linux下是有一些区别的,很多命令都不一样、容器网络也不一样,刚开始我就不明白这点,搭建应用总是错误不断,</p>
<p>网上相关Win10下的容器的资料有很少,特别是容器网络这段,坑不是一般少。学习的过程是曲折的。</p>
<p> 废话少说,直奔主题吧,</p>
<p> </p>
<h2>一、Win10下安装Docker</h2>
<p>1、win10以下的那些Docker大家还是别去看了,个人觉得浪费时间;win10下的Docker是Docker for windows,点击这里下载:戳这里</p>
<p>2、下载完成后安装,一直Next就行了,最后在桌面看到快捷方式</p>
<p> <img src="https://img2018.cnblogs.com/blog/254672/201902/254672-20190225184600779-1767334320.png" alt=""></p>
<p>3、双击快捷方式启动docker,第一次启动需要注册登录,没有账户的先去官网注册:戳这里</p>
<p>4、注册完成后输入账户就可以成功启动docker了,启动后可以看到小鲸鱼</p>
<p> <img src="https://img2018.cnblogs.com/blog/254672/201902/254672-20190225185020610-456215614.png" alt=""></p>
<p> <img src="https://img2018.cnblogs.com/blog/254672/201902/254672-20190225185051433-1848059336.png" alt=""></p>
<p>5、运行PowerShell验证,输入docker info</p>
<p> <img src="https://img2018.cnblogs.com/blog/254672/201902/254672-20190225191656938-1471300192.png" alt=""></p>
<h2>二、Web应用</h2>
<p>1、新建asp.net core测试项目</p>
<p> <img src="https://img2018.cnblogs.com/blog/254672/201902/254672-20190225185807389-1727469170.png" alt=""></p>
<p>2、修改Controllers以及View</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> IActionResult Index()
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">3</span> ViewData[<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Message</span><span style="color: rgba(128, 0, 0, 1)">"</span>] = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Hello World</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> View();
</span><span style="color: rgba(0, 128, 128, 1)">5</span> }</pre>
</div>
<p>3、修改View</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">@{
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 0, 1)"> ViewData["Title"] = "Home Page";
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">=" font-size:24px; font-weight:bold; text-align:center"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 128, 1)">5</span> <span style="color: rgba(0, 0, 0, 1)"> @ViewData["Message"]
</span><span style="color: rgba(0, 128, 128, 1)">6</span> <span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p> 4、新建Dockerfile</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">FROM microsoft/dotnet:2.1-sdk AS build
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 0, 1)">WORKDIR /app
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 0, 1)"># copy csproj and restore as distinct layers
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 0, 1)">COPY *.sln .
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">COPY WebApp-HelloWorld/*.csproj ./WebApp-HelloWorld/
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">RUN dotnet restore
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)"># copy everything else and build app
</span><span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 0, 1)">COPY WebApp-HelloWorld/. ./WebApp-HelloWorld/
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 0, 1)">WORKDIR /app/WebApp-HelloWorld
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)">RUN dotnet publish -c Release -o out
</span><span style="color: rgba(0, 128, 128, 1)">13</span>
<span style="color: rgba(0, 128, 128, 1)">14</span>
<span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 0, 1)">FROM microsoft/dotnet:2.1-aspnetcore-runtime AS runtime
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 0, 0, 1)">WORKDIR /app
</span><span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(0, 0, 0, 1)">COPY --from=build /app/WebApp-HelloWorld/out ./
</span><span style="color: rgba(0, 128, 128, 1)">18</span> ENTRYPOINT ["dotnet", "WebApp-HelloWorld.dll"]</pre>
</div>
<p> </p>
<h2>三、部署在Docker容器中</h2>
<p>1、进入demo路径</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> cd X:\Users\漂亮的猫\Desktop\WebApp-HelloWorld</pre>
</div>
<p>2、生成镜像</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> docker build -t helloworld .</pre>
</div>
<p> <img src="https://img2018.cnblogs.com/blog/254672/201902/254672-20190225192201979-597183504.png" alt=""></p>
<p><img src="https://img2018.cnblogs.com/blog/254672/201902/254672-20190225192244118-1389592305.png" alt=""></p>
<p>3、启动镜像,将本地8000端口映射到容器80端口</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> docker run --name helloworld -p 8000:80 helloworld</pre>
</div>
<p><img src="https://img2018.cnblogs.com/blog/254672/201902/254672-20190225192519555-986815099.png" alt=""></p>
<p>4、访问localhost:8000验证</p>
<p><img src="https://img2018.cnblogs.com/blog/254672/201902/254672-20190225192721145-1353629292.png" alt=""></p>
<p> </p>
<p>OK,这就完成了,</p>
<p>emmmmm,好像有点简单,,</p>
<p> </p>
<p>那就稍微深入一点,再加一个数据库容器,从数据库端返回数据</p>
<h2>四、Web端修改</h2>
<p>1、引用Dapper、MySql.Data</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> Dapper;
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Data;
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Threading.Tasks;
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> MySql.Data.MySqlClient;
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> WebApp_HelloWorld.Controllers
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> DBService
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 255, 1)">protected</span><span style="color: rgba(0, 0, 0, 1)"> IDbConnection conn;
</span><span style="color: rgba(0, 128, 128, 1)">13</span>
<span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> DBService()
</span><span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">16</span> conn = <span style="color: rgba(0, 0, 255, 1)">new</span> MySqlConnection(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">server=198.198.198.181;User Id=root;password=mima2100;Database=mysql-db</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">18</span>
<span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">async</span> Task<T> Single<T>(<span style="color: rgba(0, 0, 255, 1)">string</span> sql, <span style="color: rgba(0, 0, 255, 1)">object</span> paramPairs = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">21</span> <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">await</span> conn.QuerySingleOrDefaultAsync<T><span style="color: rgba(0, 0, 0, 1)">(sql, paramPairs);
</span><span style="color: rgba(0, 128, 128, 1)">22</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">23</span>
<span style="color: rgba(0, 128, 128, 1)">24</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">async</span> Task<<span style="color: rgba(0, 0, 255, 1)">int</span>> Count(<span style="color: rgba(0, 0, 255, 1)">string</span> sql, <span style="color: rgba(0, 0, 255, 1)">object</span> paramPairs = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">25</span> <span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">26</span> <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">await</span> conn.QuerySingleOrDefaultAsync<<span style="color: rgba(0, 0, 255, 1)">int</span>><span style="color: rgba(0, 0, 0, 1)">(sql, paramPairs);
</span><span style="color: rgba(0, 128, 128, 1)">27</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">28</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">29</span> }</pre>
</div>
<p>2、修改HomeController</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> IActionResult Index()
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 255, 1)">var</span> dbService = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> DBService();
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 255, 1)">var</span> tb = dbService.Single<Tb>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">select * from Tb limit 1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">).Result;
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> ViewData[<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Message</span><span style="color: rgba(128, 0, 0, 1)">"</span>] = <span style="color: rgba(0, 0, 255, 1)">string</span>.Format(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Idx:{0},Name:{1}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, tb.Idx, tb.Name);
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">ViewData["Message"] = "Hello World";</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> View();
</span><span style="color: rgba(0, 128, 128, 1)">10</span> }</pre>
</div>
<p>3、Tb</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Tb
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> Idx { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Name { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 128, 128, 1)">5</span> <span style="color: rgba(0, 0, 255, 1)">public</span> DateTime CreateTime { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 128, 128, 1)">6</span> }</pre>
</div>
<p> </p>
<p>五、容器端修改</p>
<p>1、拉取MySql容器</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> docker pull mysql</pre>
</div>
<p><img src="https://img2018.cnblogs.com/blog/254672/201902/254672-20190225195252556-2037425512.png" alt=""></p>
<p>2、启动容器</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> docker run --name mysql001 -e MYSQL_ROOT_PASSWORD=mima2100 -p 3306:3306 -d mysql</pre>
</div>
<p><img src="https://img2018.cnblogs.com/blog/254672/201902/254672-20190225200019281-1199382755.png" alt=""></p>
<p>3、链接Mysql,Navicat工具,创建数据</p>
<p><img src="https://img2018.cnblogs.com/blog/254672/201902/254672-20190225200105526-1552219418.png" alt=""></p>
<p><img src="https://img2018.cnblogs.com/blog/254672/201902/254672-20190225200428663-1348529267.png" alt=""></p>
<p>4、重新发布web应用</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">docker stop 5b41
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 0, 1)">docker rm 5b41
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 0, 1)">docker build -t helloworld .
</span><span style="color: rgba(0, 128, 128, 1)">4</span> docker run --name helloworld -p 8000:80 helloworld</pre>
</div>
<p>5、重新验证</p>
<p><img src="https://img2018.cnblogs.com/blog/254672/201902/254672-20190225202528270-1797513827.png" alt=""></p>
<p> </p>
<p>OK,完成了Docker从入门到放弃的第一步,哈</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/lanxiaoke/p/10432631.html
頁:
[1]