8天入门docker系列 —— 第四天 使用aspnetcore小案例熟悉端口映射和挂载目录
到目前为止大家应该对镜像和容器有了一个大概认知,而且也用了docker进行了一个简单化的部署,但仔细一看问题还有很多,所以这篇我们继续完善。
一:如何让外网访问到容器内应用
我们知道容器内拥有自己的子网,和你的主机ip不在一个网段内,所以宿主之外的机器是无法访问的,要实现的话你只能通过nat转发,在docker上实现起
来很简单,通过 -p 将容器端口映射到宿主机端口即可。
1. 在Dockerfile中,容器会自动监听8080端口,而且我的程序也是开启了这个端口号。
FROM microsoft/dotnet:2.2-aspnetcore-runtime
LABEL author hxc@qq.com
RUN mkdir /data
COPY ./ /data
WORKDIR /data
VOLUME /data/log
EXPOSE
CMD [ "dotnet","WebNotebook.dll" ]
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
} public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseUrls("http://*:8080")
.UseStartup<Startup>();
}
2. 接下来通过 -p 端口映射,将宿主机的8080端口和容器的8080端口进行一个映射,前面是宿主机端口,后面是容器的,你也可以写成 hostip:8080:8080
[root@localhost ~]# docker run -d --name webnotebook -p : huangxincheng520/webnotebook:v4
82cf45e8fb7281fda7d1b22bf6ef1a5156a75f04b4ef29873d44f161b0238cfb
[root@localhost ~]#
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82cf45e8fb72 huangxincheng520/webnotebook:v4 "dotnet WebNotebook.…" seconds ago Up seconds 0.0.0.0:->/tcp webnotebook
3. 然后我就可以在windows上输入网址访问了,可以看到一点问题都没有。
4. 有些人可能会很好奇的去问,这个是怎么做到的呢? 刚才也说到了是通过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/ 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/ !127.0.0.0/ ADDRTYPE match dst-type LOCAL Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 172.17.0.0/ 0.0.0.0/
RETURN all -- 192.168.122.0/ 224.0.0.0/
RETURN all -- 192.168.122.0/ 255.255.255.255
MASQUERADE tcp -- 192.168.122.0/ !192.168.122.0/ masq ports: -
MASQUERADE udp -- 192.168.122.0/ !192.168.122.0/ masq ports: -
MASQUERADE all -- 192.168.122.0/ !192.168.122.0/
MASQUERADE tcp -- 172.17.0.2 172.17.0.2 tcp dpt: Chain DOCKER ( references)
target prot opt source destination
RETURN all -- 0.0.0.0/ 0.0.0.0/
DNAT 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 ~]# ifconfig
docker0: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80:::25ff:fe14:8a13 prefixlen scopeid 0x20<link>
ether ::::8a: txqueuelen (Ethernet)
RX packets bytes (8.0 MiB)
RX errors dropped overruns frame
TX packets bytes (405.8 MiB)
TX errors dropped overruns carrier collisions ens33: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
inet 192.168.23.149 netmask 255.255.255.0 broadcast 192.168.23.255
inet6 fe80::20c:29ff:fe5c:2e32 prefixlen scopeid 0x20<link>
ether :0c::5c:2e: txqueuelen (Ethernet)
RX packets bytes (2.0 GiB)
RX errors dropped overruns frame
TX packets bytes (53.8 MiB)
TX errors dropped overruns carrier collisions lo: flags=<UP,LOOPBACK,RUNNING> mtu
inet 127.0.0.1 netmask 255.0.0.0
inet6 :: prefixlen scopeid 0x10<host>
loop txqueuelen (Local Loopback)
RX packets bytes (8.6 KiB)
RX errors dropped overruns frame
TX packets bytes (8.6 KiB)
TX errors dropped overruns carrier collisions veth871156e: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
inet6 fe80::3c7f:5fff:fe53: prefixlen scopeid 0x20<link>
ether 3e:7f:5f::: txqueuelen (Ethernet)
RX packets bytes (709.9 KiB)
RX errors dropped overruns frame
TX packets bytes (18.7 KiB)
TX errors dropped overruns carrier collisions virbr0: flags=<UP,BROADCAST,MULTICAST> mtu
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether :::::c2 txqueuelen (Ethernet)
RX packets bytes (0.0 B)
RX errors dropped overruns frame
TX packets bytes (0.0 B)
TX errors 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地址。
public class HomeController : Controller
{
public static Logger logger = LogManager.GetLogger("SimpleDemo"); /// <summary>
/// 读取mongodb数据数据
/// </summary>
/// <returns></returns>
public IActionResult Index()
{
var log = $"客户端:{HttpContext.Connection.RemoteIpAddress} 访问了 Index 页面!"; logger.Info(log); return View();
}
}
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 : -v /data/log:/data/log huangxincheng520/webnotebook:v5
0e03f54d69ccdf3f88511385fd6fd5fdcafb64c0f971cbadb0b93014cb79e375
5. 一切都部署好了,接下来你可以访问8080端口,然后到你的宿主机的/data/log目录下查看一下,你的日志就出来啦。
[root@localhost log]# pwd
/data/log
[root@localhost log]# ls
--.txt
[root@localhost log]# tail --.txt
-- ::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 : -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
好了,本篇就说到这里,希望对你有帮助。
8天入门docker系列 —— 第四天 使用aspnetcore小案例熟悉端口映射和挂载目录的更多相关文章
- 8天入门docker系列 —— 第五天 使用aspnetcore小案例熟悉容器互联和docker-compose一键部署
这一篇继续完善webnotebook,如果你读过上一篇的内容,你应该知道怎么去挂载webnotebook日志和容器的远程访问,但是这些还远不够,webnotebook 总要和一些数据库打交道吧,比如说 ...
- 8天入门docker系列 —— 第三天 使用aspnetcore小案例熟悉对镜像的操控
上一篇我们聊到了容器,现在大家应该也知道了,没有镜像就没有容器,所以镜像对docker来说是非常重要的,关于镜像的特性和原理作为入门系列就不阐 述了,我还是通过aspnetcore的小sample去熟 ...
- 如何修改运行中的docker容器的端口映射和挂载目录
在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当docker start运行容器后并没有提供一个-p选项或设 ...
- 8天入门docker系列 —— 第二天 通过一个aspnetcore程序加深对容器的理解
我们知道容器是一个打包了应用和相关依赖的盒子,那怎么去操控这个盒子呢? 这一篇我通过一个简单的aspnetcore程序来加深对盒子的理解,使用之前先 安装一下Docker的环境. 一:Docker的安 ...
- 8天入门docker系列 —— 第一天 docker出现前的困惑和简单介绍
docker出来也有很多年了,但用到的公司其实并不是很多,docker对传统开发是一个革命性的,几乎颠覆了之前我们传统的开发方法和部署模式,而大多 公司保守起见或不到万不得已基本上不会去变更现有模式. ...
- docker系列(四):数据卷
1 引言 容器就相当于一个简易的操作系统,我们在上面部署我们的环境,不可避免地产生一些数据,但是,可能由于断电等等原因,容器退出了,那么之前容器中的数据就不符存在,则往往不是我们想要的,更多的,我们是 ...
- Docker 与 K8S学习笔记(十)—— 容器的端口映射
我们一般将应用部署在容器里面,而一个服务器上会有许许多多的容器,那么外界该如何访问我们的应用呢?答案是:端口映射. Docker可以将容器对外提供服务的端口映射到host的某个端口上,外网通过此端口访 ...
- 8天入门docker系列 —— 第八天 让程序跑在swarm集群上
真正的落地部署都是希望程序跑在集群下,而不是单机版下测测玩玩,所以这篇就来聊一下怎么使用docker swarm进行部署,因为是swarm是docker自带的, 所以部署起来还是非常简单的. 一:前置 ...
- WPF入门教程系列十四——依赖属性(四)
六.依赖属性回调.验证及强制值 我们通过下面的这幅图,简单介绍一下WPF属性系统对依赖属性操作的基本步骤: 借用一个常见的图例,介绍一下WPF属性系统对依赖属性操作的基本步骤: 第一步,确定Base ...
随机推荐
- 实例解析Collections源码,Iterator和ListIterator
比如一个视频或文章有多个页面标签设置,我们在看一篇文章或一个视频时,底部有为你推荐栏目. 如何根据这个文章或视频的标签,来实现这个推荐栏目呢. public List<VideoInfoVo&g ...
- [Luogu 4135] 作诗
Description 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好是作诗. 由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M ...
- C++负数取模
预习: r=余数 a=被除数 b=除数 c=商 a/b=c........r r=a-(a/b)*b 一.下面的题目你能全做对吗?1.7/4=?2.7/(-4)=?3.7%4=?4.7%(-4)=?5 ...
- spring boot:thymeleaf使用详解
简单说, Thymeleaf 是一个跟 Velocity.FreeMarker 类似的模板引擎,它可以完全替代 JSP .相较与其他的模板引擎,它有如下三个极吸引人的特点: 1.Thymeleaf 在 ...
- Python的编码风格
1.采用四个空格作为缩进 2.一行代码不要超多79个字符 3.使用空行分割类,函数,以及大块代码 4.注释独占一行 5.使用文档字符串 6.操作符的两侧,逗号后面都要加空格(但是括号的里侧是不加的) ...
- Qt中绘制五子棋棋盘
一个需要做大作业的同学问我相关内容,就顺手写了一个,贴出来. 项目包含头文件 mainwindowh,源文件mainwindow.cpp和主函数main.cpp. 如下: mainwindow.h # ...
- python爬虫入门(九)Scrapy框架之数据库保存
豆瓣电影TOP 250爬取-->>>数据保存到MongoDB 豆瓣电影TOP 250网址 要求: 1.爬取豆瓣top 250电影名字.演员列表.评分和简介 2.设置随机UserAge ...
- hexo+github创建属于自己的博客
配置环境 安装Node(必须) 作用:用来生成静态页面的 到Node.js官网下载相应平台的最新版本,一路安装即可. 安装Git(必须) 作用:把本地的hexo内容提交到github上去. 安装Xco ...
- C/C++ 数据结构之算法
数据结构中的排序算法. 排序算法的相关知识: (1)排序的概念:所谓排序就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来. (2)稳定的排序方法:在待排序的文件中,若存在多个关键字相同的 ...
- Git请求合并说明
如今公司很多新项目都采取merge request方式来进行code review.非阻塞上线部署,因此掌握merge request很有必要,步骤如下: 1.现在本地用创建一个本地分支, git c ...