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

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

 

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

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

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

 

1. 在Dockerfile中,容器会自动监听8080端口,而且我的程序也是开启了这个端口号。

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

FROM microsoft/dotnet:-aspnetcore- // ///data/, ]

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

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

        Main(  IWebHostBuilder CreateWebHostBuilder([] args) =><Startup>

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

 

2. 接下来通过 -p 端口映射,将宿主机的8080端口和容器的8080端口进行一个映射,前面是宿主机端口,后面是容器的,你也可以写成 hostip:8080:8080

[root@localhost ~]# docker run -d --name webnotebook -p : huangxincheng520/~~]# docker /webnotebook:v4       seconds ago       Up  seconds        .:->/tcp   webnotebook

 

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

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

     iptables nat去查看一下。

 

[root@localhost ~]# iptables -t nat -L ---  ./            ./            ADDRTYPE match dst---  ./           !./          ADDRTYPE match dst---  ./        ./--  ./     ./--  ./     .--  ./    !./     masq ports: ---  ./    !./     masq ports: ---  ./    !./--  .           .           tcp dpt:--  ./            ./

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

 

    可以看到,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,

也即是子网地址。

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

[root@localhost ~]# =<UP,BROADCAST,RUNNING,MULTICAST>  mtu   netmask .  broadcast .:25ff:fe14:8a13  prefixlen   scopeid <link>::::8a:  txqueuelen   bytes  (  dropped   overruns   frame   bytes  (  dropped  overruns   carrier   collisions =<UP,BROADCAST,RUNNING,MULTICAST>  mtu .  netmask .  broadcast .  scopeid <link>:0c::5c:2e:  txqueuelen   bytes  (  dropped   overruns   frame   bytes  (  dropped  overruns   carrier   collisions =<UP,LOOPBACK,RUNNING>  mtu .  netmask .  prefixlen   scopeid <host>  bytes  (  dropped   overruns   frame   bytes  (  dropped  overruns   carrier   collisions =<UP,BROADCAST,RUNNING,MULTICAST>  mtu   prefixlen   scopeid <link>::  txqueuelen   bytes  (  dropped   overruns   frame   bytes  (  dropped  overruns   carrier   collisions =<UP,BROADCAST,MULTICAST>  mtu .  netmask .  broadcast .:::::c2  txqueuelen   bytes  (  dropped   overruns   frame   bytes  (  dropped  overruns   carrier   collisions

 

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

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

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

 

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

 

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

 

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="file_info" xsi:type="File"
                       fileName="${basedir}/log/${shortdate}.txt" maxArchiveFiles="30"
                       layout="${longdate} | ${level:uppercase=false} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}" />
</targets>
<rules>
<logger name="*" writeTo="file_info" />
</rules>
</nlog>

 

3.  然后我们的Controller类修改一下,记录下客户端的ip地址。

    Logger logger = LogManager.GetLogger( 
         
         
         log = $

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

 

 4.  接下来你就可以docker build 成镜像啦,在 docker run 中使用-v参数,将宿主机的 /data/log 挂载到容器的 /data/log目录,如下命令。

[root@localhost publish]# docker build -t huangxincheng520/webnotebook:v5 -f ./--name webnotebook5 -d -p : -v /data/log:/data/log huangxincheng520/

 

5. 一切都部署好了,接下来你可以访问8080端口,然后到你的宿主机的/data/log目录下查看一下,你的日志就出来啦。

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

[root@localhost log]# 
/data/
-- ---- :: | Info | 客户端:::ffff:.

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

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

 

《1》 在docker run 中加入 -e 参数,也就是加入环境变量 -e TZ=Asia/Shanghai 即可,不要怕参数多,以后这些都是通过CI工具集成的,不要怕哈。

[root@localhost publish]# docker run --name webnotebook5 -d -p : -v /data/log:/data/log -e TZ=Asia/Shanghai  huangxincheng520/

     

       访问网站之后再看看你的log文件,时区已经调整过来了。

[root@localhost log]# tail 2019-02-20

 

《2》 在dockerfile中增加环境变量占位符。

FROM microsoft/dotnet:-aspnetcore-/Shanghai

 


上一篇:linux 查看内网IP和外网IP


下一篇:[LeetCode] 1054. Distant Barcodes 距离相等的条形码