docker网络访问

一、docker网络访问的方式

随机映射:
- docker run -P

指定映射:
1. -p hostPort:containerPort
2. -p ip:hostPort:containerPort
3. -p ip::containerPort
4. -p hostPort:containerPort
5. -p hostPort:containerPort:udp

1、环境准备

环境准备

IP			主机名			操作系统
192.168.56.11		linux-node1		centos7

注意:我这里使用的是centos7,如果是使用centos5或者centos6,需要升级操作系统内核,否则Docker的许多新功能都无法使用

2、随机映射

优点: 不会发生端口冲突

[[email protected] ~]# docker run -d -P nginx
4d5a21ea94e0df102198812fd899d8293198a2376dd5d952642113b76448ca65
[[email protected] ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                           NAMES
4d5a21ea94e0        nginx               "nginx -g ‘daemon off"   7 seconds ago       Up 4 seconds        0.0.0.0:10001->80/tcp, 0.0.0.0:10000->443/tcp   evil_murdock
c627741a7dc1        centos              "/bin/bash"              13 days ago         Up 2 hours                                                          mydocker
[[email protected] ~]#
本地的10001端口映射到80,10000端口映射到443
访问本地的端口
在url中输入192.168.56.11:10001,可以进入到nginx的欢迎界面

查看端口占用情况
[[email protected] ~]# netstat -lnpt|grep 10001
tcp6       0      0 :::10001                :::*                    LISTEN      6800/docker-proxy
查询nat的详细信息
-nvL 这其实是三个参数,等效于 -n -v -L
-n 不解析主机名和端口名,也就是全部主机和端口都用数字表示
-v 详细信息列表
-L 列表
[[email protected] ~]# iptables -t nat -vnL
Chain PREROUTING (policy ACCEPT 7 packets, 855 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    2   104 DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT 7 packets, 855 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 959 packets, 57540 bytes)
 pkts bytes target     prot opt in     out     source               destination         
12949  777K DOCKER     all  --  *      *       0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT 960 packets, 57592 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0           
    0     0 RETURN     all  --  *      *       192.168.122.0/24     224.0.0.0/24        
    0     0 RETURN     all  --  *      *       192.168.122.0/24     255.255.255.255     
    0     0 MASQUERADE  tcp  --  *      *       192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
    0     0 MASQUERADE  udp  --  *      *       192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
    0     0 MASQUERADE  all  --  *      *       192.168.122.0/24    !192.168.122.0/24    
    0     0 MASQUERADE  tcp  --  *      *       172.17.0.3           172.17.0.3           tcp dpt:443
    0     0 MASQUERADE  tcp  --  *      *       172.17.0.3           172.17.0.3           tcp dpt:80

Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 RETURN     all  --  docker0 *       0.0.0.0/0            0.0.0.0/0           
    0     0 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:10000 to:172.17.0.3:443
    1    52 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:10001 to:172.17.0.3:80
使用之前写的进入docker的脚本,进入docker,查看进程
[[email protected] ~]# ./docker_in.sh 4d5a21ea94e0
[email protected]:/# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.0  31724  2840 ?        Ss   05:58   0:00 nginx: master process nginx -g daemon off;
nginx         8  0.0  0.0  32116  1936 ?        S    05:58   0:00 nginx: worker process
root          9  0.2  0.0  20256  1956 ?        S    06:13   0:00 -bash
root         22  0.0  0.0  17492  1156 ?        R+   06:13   0:00 ps aux
[email protected]:/#
docker运行的第一进程的PID是1

[email protected]:/# ip ad li
1: lo:mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
18: [email protected]:mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:3/64 scope link 
       valid_lft forever preferred_lft forever
[email protected]:/#
这个IP地址是通过DHCP获取的

我们可以使用docker logs查看nginx的访问日志

[[email protected] ~]# docker logs 4d5a21ea94e0
192.168.56.1 - - [19/Sep/2016:06:01:04 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" "-"
192.168.56.1 - - [19/Sep/2016:06:01:06 +0000] "GET /favicon.ico HTTP/1.1" 404 571 "http://192.168.56.11:10001/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" "-"
2016/09/19 06:01:06 [error] 8#8: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.56.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.56.11:10001", referrer: "http://192.168.56.11:10001/"

3、指定端口映射:

(1)将本地的81端口映射到docker容器的80端口

[[email protected] ~]# docker run -d -p 192.168.56.11:81:80 --name mynginx nginx
17df7e2a56678e60e18a6cb1d5d9197b031f922dc8a18f045296dcab30d60f76
[[email protected] ~]# docker ps -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
17df7e2a5667        nginx               "nginx -g ‘daemon off"   10 seconds ago      Up 9 seconds        443/tcp, 192.168.56.11:81->80/tcp   mynginx
通过端口映射的方式,我们可以很方便的访问docker容器内的服务

可以使用docker port命令查看端口映射情况

[[email protected] ~]# docker port mynginx
80/tcp -> 192.168.56.11:81
查看docker容器端口映射

(2)多个端口的映射

[[email protected] ~]# docker run -d -p 443:443 -p 82:80 --name nginx2 nginx
c4c9b4947e613e15f84bfaa9233116377f2608796de8f824285360c6aeddc028
[[email protected] ~]# docker port nginx2
80/tcp -> 0.0.0.0:82
443/tcp -> 0.0.0.0:443
[[email protected] ~]#

缺点:由于端口映射的方式是经过NAT的,所以会影响系统的性能。
时间: 2024-08-03 07:03:16

docker网络访问的相关文章

docker网络访问(三)

docker网络访问 ifconfig查看网卡,启动docker的时候,docker会帮我们创建一个docker0的网桥. 1.随机映射 docker run -P 2.指定映射 -p hostPort:containerPort -p ip:hostPort:containerPort -p ip::containerPort -p hostPort:containerPort:udp -p hostPort:containerPort -p hostPort:containerPort (多

Docker网络使用说明

一.Docker网络访问 Docker网卡 查看Docker桥接网卡docker0 ifconfig 二.Docker随机端口映射 随机端口映射举例 #-d 表示在后台运行容器并输出容器ID #-P 随机端口映射 docker run -d -P --name mynginx nginx 查看容器端口映射情况 docker ps #0.0.0.0:32768->80/tcp #或者 docker port mynginx 查看端口映射后本地端口的变化 ss -lnt #LISTEN 0 128

docker网络

一. Docker 中的网络功能介绍 默认情况下,容器可以建立到外部网络的连接,但是外部网络无法连接到容器. Docker 允许通过外部访问容器或容器互联的方式来提供网络服务 外部访问容器: 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过  -P  或  -p  参数来指定端口映射.(当使用–P(大写)标记时,Docker 会随机映射一个随机的端口到内部容器开放的网络端口.) 注意:-P使用时需要指定--expose选项或dockerfile中用expose指定容器要暴露的端口

docker网络配置方法总结

docker启动时,会在宿主主机上创建一个名为docker0的虚拟网络接口,默认选择172.17.42.1/16,一个16位的子网掩码给容器提供了65534个IP地址.docker0只是一个在绑定到这上面的其他网卡间自动转发数据包的虚拟以太网桥,它可以使容器和主机相互通信,容器与容器间通信.问题是,如何让位于不同主机上的docker容器可以通信.如何有效配置docker网络目前来说还是一个较复杂的工作,因而也涌现了很多的开源项目来解决这个问题,如flannel.Kubernetes.weave.

Docker—网络模式

Docker网络实现原理: Docker 中的网络接口默认都是虚拟的接口.虚拟接口的优势之一是转发效率较高. Linux 通过在内核中进 行数据复制来实现虚拟接口之间的数据转发,发送接口的发送缓存中的数据包被直接复制到接收接口的接收缓存中.对于本地系统和容器内系统看来就像是一个正常的以太网卡,只是它不需要真正同外部网络设备通信,速度要快很多:Docker 容器网络利用此技术,它在本地主机和容器内分别创建一个虚拟接口,并让它们彼此连通 (这样的一对接口叫做 veth pair ) Docker 创

Docker网络详解及pipework源码解读与实践

Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如Docker的镜像管理.然而,Docker同样有着很多不完善的地方,网络方面就是Docker比较薄弱的部分.因此,我们有必要深入了解Docker的网络知识,以满足更高的网络需求.本文首先介绍了Docker自身的4种网络工作方式,然后通过3个样例 -- 将Docker容器配置到本地网络环境中.单主机Docker容器的VLAN划分.多主机Docker容器的VLAN划分,演示了如何使用pipework帮助我们进行复杂的网络设置,以及pi

docker技术剖析--docker网络

防伪码:不经一番寒彻骨,怎得梅花扑鼻香.                 docker技术剖析--docker网络 一. Docker 中的网络功能介绍 默认情况下,容器可以建立到外部网络的连接,但是外部网络无法连接到容器. Docker 允许通过外部访问容器或容器互联的方式来提供网络服务 外部访问容器: 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过  -P  或  -p  参数来指定端口映射. 练习环境:运行一个容器,提供web服务和ssh服务 宿主机启用路由转发(net.

Docker网络一览

转自:http://dockone.io/article/1143 [编者的话]本文是Nuage Networks公司Filip Verloy的一篇博文,简单介绍了一下Docker网络情况,单主机的四种模式及多主机的Libnetwork模式,大家可以试用了.同时Nuage Networks公司在鼓捣的SDN方案,我觉得大家也可以去了解一下. @Container容器技术大会将于6月4日在上海光大会展中心国际大酒店举办,来自携程.PPTV.蚂蚁金服.京东.浙江移动.海尔电器.唯品会.eBay.道富

理解Docker(5):Docker 网络

本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 (4)Docker 容器的隔离性 - 使用 cgroups 限制容器使用的资源 (5)Docker 网络 1. Docker 网络概况 用一张图来说明 Docker 网络的基本概况: 2. 四种单节点网络模式 2.1 bridge 模式 Docker 容器默认使用 bridge 模式的网络.其特点