设为首页 加入收藏

TOP

8天入门docker系列 —— 第四天 使用aspnetcore小案例熟悉端口映射和挂载目录(一)
2019-09-17 18:02:06 】 浏览:50
Tags:入门 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 8080
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 8080:8080 huangxincheng520/webnotebook:v4
82cf45e8fb7281fda7d1b22bf6ef1a5156a75f04b4ef29873d44f161b0238cfb
[root@localhost ~]# 
[root@localhost ~]# docker ps
CONTAINER 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

 

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.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/0           
RETURN     all  --  192.168.122.0/24     224.0.0.0/24        
RETURN     all  --  192.168.122.0/24     255.255.255.255     
MASQUERADE  tcp  --  192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
MASQUERADE  udp  --  192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
MASQUERADE  all  --  192.168.122.0/24    !192.168.122.0/24    
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:8080

Chain DOCKER (2 references)
target     prot opt source               destination         
RETURN     all  --  0.0.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=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:25ff:fe14:8a13  prefixlen 64  scopeid 0x20<link>
        ether 02:42:25:14:8a:13  txqueuelen 0  (Ethernet)
        RX packets 105061  bytes 8399597 (8.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 148379  bytes 425576796 (405.8 MiB)
        TX errors 0  dropped 0 o
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C#连接基于Java开发IM——Openfire 下一篇在ASP.NET Core中给上传图片功能..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目