Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

8天入门docker系列 —— 第四天 使用aspnetcore小案例熟悉端口映射和挂载目录

一线码农 2019-02-20 12:39:00 阅读数:236 评论数:0 点赞数:0 收藏数:0

到目前为止大家应该对镜像和容器有了一个大概认知,而且也用了docker进行了一个简单化的部署,但仔细一看问题还有很多,所以这篇我们继续完善。

 

一:如何让外网访问到容器内应用

        我们知道容器内拥有自己的子网,和你的主机ip不在一个网段内,所以宿主之外的机器是无法访问的,要实现的话你只能通过nat转发,在docker上实现起

来很简单,通过 -p 将容器端口映射到宿主机端口即可。

 

  1. 在Dockerfile中,容器会自动监听8080端口,而且我的程序也是开启了这个端口号。
    FROM microsoft/dotnet:2.2-aspnetcore-runtime LABEL author hxc@qq.com RUNmkdir /data COPY ./ /data WORKDIR/data VOLUME/data/log EXPOSE8080CMD ["dotnet","WebNotebook.dll" ]

public classProgram {public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); }public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>WebHost.CreateDefaultBuilder(args) .UseUrls("http:///*:8080") .UseStartup(); }

 

  1. 接下来通过 -p 端口映射,将宿主机的8080端口和容器的8080端口进行一个映射,前面是宿主机端口,后面是容器的,你也可以写成 hostip:8080:8080
    [root@localhost ~]/# docker run -d --name webnotebook -p 8080:8080 huangxincheng520/webnotebook:v4 82cf45e8fb7281fda7d1b22bf6ef1a5156a75f04b4ef29873d44f161b0238cfb [root@localhost~]/# [root@localhost~]/# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 82cf45e8fb72 huangxincheng520/webnotebook:v4 "dotnet WebNotebook.…" 3 seconds ago Up 2 seconds 0.0.0.0:8080->8080/tcp webnotebook

 

  1.  然后我就可以在windows上输入网址访问了,可以看到一点问题都没有。

  1.  有些人可能会很好奇的去问,这个是怎么做到的呢? 刚才也说到了是通过nat进行协议头ip地址替换进行转发的,你要是不信的话,可以用centos的

     iptables nat去查看一下。

 [root@localhost ~]/# iptables -t nat -L -n Chain PREROUTING (policy ACCEPT) target prot opt source destination DOCKER all-- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination DOCKER all-- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all-- 172.17.0.0/16 0.0.0.0/0RETURN all-- 192.168.122.0/24 224.0.0.0/24RETURN all-- 192.168.122.0/24 255.255.255.255MASQUERADE tcp-- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535MASQUERADE udp-- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535MASQUERADE all-- 192.168.122.0/24 !192.168.122.0/24MASQUERADE tcp-- 172.17.0.2 172.17.0.2 tcp dpt:8080Chain DOCKER (2references) target prot opt source destination RETURN all-- 0.0.0.0/0 0.0.0.0/0DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.17.0.2:8080

 

    可以看到,docker在iptables中实现了一个自己的Docker chain,从 hostIP:8080 -> 172.17.0.2:8080中可以看到,当一个请求到了 192.168.23.149:8080

会自动转发到 172.17.0.2.8080,有些人可能会问,这个明显不是一个网段怎么转发呢? 那是因为你的宿主机上有一个默认的网桥Docker0,你可以理解成

他就是一个数据链路层上的路由器,通过这个路由器,可以将不同的网段进行互联,你可以用ipconfig查看docker0的ip地址,这个ip地址就相当于路由器ip,

也即是子网地址。[root@localhost ~]/# ifconfigdocker0: flags=4163 mtu 1500inet172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255inet6 fe80::42:25ff:fe14:8a13 prefixlen 64 scopeid 0x20ether02:42:25:14:8a:13 txqueuelen 0(Ethernet) RX packets105061 bytes 8399597 (8.0MiB) RX errors0 dropped 0 overruns 0 frame 0TX packets148379 bytes 425576796 (405.8MiB) TX errors0 dropped 0 overruns 0 carrier 0 collisions 0ens33: flags=4163 mtu 1500inet192.168.23.149 netmask 255.255.255.0 broadcast 192.168.23.255inet6 fe80::20c:29ff:fe5c:2e32 prefixlen64 scopeid 0x20ether00:0c:29:5c:2e:32 txqueuelen 1000(Ethernet) RX packets1570930 bytes 2222888854 (2.0GiB) RX errors0 dropped 0 overruns 0 frame 0TX packets532628 bytes 56478232 (53.8MiB) TX errors0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73 mtu 65536inet127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0x10loop txqueuelen0(Local Loopback) RX packets104 bytes 8816 (8.6KiB) RX errors0 dropped 0 overruns 0 frame 0TX packets104 bytes 8816 (8.6KiB) TX errors0 dropped 0 overruns 0 carrier 0 collisions 0veth871156e: flags=4163 mtu 1500inet6 fe80::3c7f:5fff:fe53:4542 prefixlen 64 scopeid 0x20ether 3e:7f:5f:53:45:42 txqueuelen 0(Ethernet) RX packets99 bytes 726984 (709.9KiB) RX errors0 dropped 0 overruns 0 frame 0TX packets306 bytes 19235 (18.7KiB) TX errors0 dropped 0 overruns 0 carrier 0 collisions 0virbr0: flags=4099 mtu 1500inet192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255ether52:54:00:83:96:c2 txqueuelen 0(Ethernet) RX packets0 bytes 0 (0.0B) RX errors0 dropped 0 overruns 0 frame 0TX packets0 bytes 0 (0.0B) TX errors0 dropped 0 overruns 0 carrier 0 collisions 0

 

二:如何处理容器中的日志数据

  我们的webnotebook运行的时候总会产生一些日志,这时候可以把日志文件夹挂载到宿主机上,方便查看和采集啥的,当然更多的情况是采用集中式

的日志收集,这个就不是本篇所讨论的了,接下来我要做两件事情,配置nlog日志框架,然后进行docker目录挂载。

 

  1.  配置nlog框架,在nuget上下载

 

  1.  nlog.config 配置如下,{basedir} 就是当前程序的根目录。

  info"xsi:type="File"fileName="${basedir}/log/${shortdate}.txt"maxArchiveFiles="30"layout="${longdate} | ${level:uppercase=false} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}" />

 

  1.  然后我们的Controller类修改一下,记录下客户端的ip地址。
    public classHomeController : Controller {public static Logger logger = LogManager.GetLogger("SimpleDemo");/// ///读取mongodb数据数据/// /// publicIActionResult Index() {var log = $"客户端:{HttpContext.Connection.RemoteIpAddress} 访问了 Index 页面!"; logger.Info(log);returnView(); } }

 

 4.  接下来你就可以docker build 成镜像啦,在 docker run 中使用-v参数,将宿主机的 /data/log 挂载到容器的 /data/log目录,如下命令。[root@localhost publish]/# docker build -t huangxincheng520/webnotebook:v5 -f ./Dockerfile . [root@localhost publish]/# docker run--name webnotebook5 -d -p 8080:8080 -v /data/log:/data/log huangxincheng520/webnotebook:v5 0e03f54d69ccdf3f88511385fd6fd5fdcafb64c0f971cbadb0b93014cb79e375

 

  1. 一切都部署好了,接下来你可以访问8080端口,然后到你的宿主机的/data/log目录下查看一下,你的日志就出来啦。
    [root@localhost log]/# pwd /data/log [root@localhost log]/#ls 2019-02-20.txt [root@localhost log]/#tail 2019-02-20.txt2019-02-20 04:13:36.2904 | Info | 客户端:::ffff:192.168.23.1访问了 Index 页面! [root@localhost log]/#

    细心的你应该会发现到,日志所打印出的时间出了问题,比北京时间少了8个小时,所以你要做的是,把默认的0区时间改成东8区即可,那怎么修改呢?

 

《1》 在docker run 中加入 -e 参数,也就是加入环境变量 -e TZ=Asia/Shanghai 即可,不要怕参数多,以后这些都是通过CI工具集成的,不要怕哈。[root@localhost publish]/# docker run --name webnotebook5 -d -p 8080:8080 -v /data/log:/data/log -e TZ=Asia/Shanghai huangxincheng520/webnotebook:v5 18cbd284dbd6f6ff498d849eda7652ec63df3c0113c0cdd53ae4a0030abb52f2

     

       访问网站之后再看看你的log文件,时区已经调整过来了。[root@localhost log]/# tail 2019-02-20.txt 2019-02-20 04:13:36.2904 | Info | 客户端:::ffff:192.168.23.1访问了 Index 页面! 2019-02-20 12:20:38.3752 | Info | 客户端:::ffff:192.168.23.1 访问了 Index 页面!

 

《2》 在dockerfile中增加环境变量占位符。FROM microsoft/dotnet:2.2-aspnetcore-runtime ENV TZ Asia/Shanghai

 

好了,本篇就说到这里,希望对你有帮助。

 

版权声明
本文为[一线码农]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/huangxincheng/p/10405856.html

编程之旅,人生之路,不止于编程,还有诗和远方。
阅代码原理,看框架知识,学企业实践;
赏诗词,读日记,踏人生之路,观世界之行;

支付宝红包,每日可领