docker容器的端口映射问题
一、通过 -P(大写) 或 -p (小写) 参数来指定端口映射(1)当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。使用 docker ps 可以看到,本地主机的 49155 被映射到了容器的 5000 端口。此时访问本机的 49155 端口即可访问容器内 web 应用提供的界面。$ sudo docker run -d -P train
一、通过 -P(大写) 或 -p (小写) 参数来指定端口映射
(1)当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。
使用 docker ps 可以看到,本地主机的 49155 被映射到了容器的 5000 端口。此时访问本机的 49155 端口即可访问容器内 web 应用提供的界面。
$ sudo docker run -d -P training/webapp python app.py
$ sudo docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bc533791f3f5 training/webapp:latest python app.py 5 seconds ago Up 2 seconds 0.0.0.0:49155->5000/tcp nostalgic_morse
同样的,可以通过 docker logs 命令来查看应用的信息。
$ sudo docker logs -f nostalgic_morse
* Running on http://0.0.0.0:5000/
10.0.2.2 - - [23/May/2014 20:16:31] "GET / HTTP/1.1" 200 -
10.0.2.2 - - [23/May/2014 20:16:31] "GET /favicon.ico HTTP/1.1" 404 -
(2)-p(小写)则可以指定要映射的IP和端口,但是在一个指定端口上只可以绑定一个容器。
支持的格式有 hostPort:containerPort、ip:hostPort:containerPort、 ip::containerPort。
- hostPort:containerPort(映射所有接口地址)
将本地的 5000 端口映射到容器的 5000 端口,可以执行如下命令:
$ sudo docker run -d -p 5000:5000 training/webapp python app.py 此时默认会绑定本地所有接口上的所有地址。
- ip:hostPort:containerPort (映射指定地址的指定端口)
指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1
$ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
- ip::containerPort (映射指定地址的任意端口)
绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口。
sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py
还可以使用 udp 标记来指定 udp 端口
$ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
** 查看映射端口配置 **
使用 docker port 来查看当前映射的端口配置,也可以查看到绑定的地址
$ sudo docker port nostalgic_morse 5000
127.0.0.1:49155.
注意:
容器有自己的内部网络和 ip 地址(使用 docker inspect 可以获取所有的变量,Docker 还可以有一个可变的网络配置。)
-p 标记可以多次使用来绑定多个端口,例如
$ sudo docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
二、通过 --net=host 来使容器使用与主机相同的网络协议栈
docker网络
当你安装完Docker时,它会自动创建三个网络。你可以使用以下docker network ls命令列出这些网络:
$ sudo docker network ls
NETWORK ID NAME DRIVER SCOPE
594430d2d4bb bridge bridge local
d855b34c5d51 host host local
b1ecee29ed5e none null local
Docker内置这三个网络,运行容器时,你可以使用该来指定容器应连接到哪些网络。我们在使用docker run创建Docker容器时,可以用–network标志 选项指定容器的网络模式,Docker有以下4种网络模式:
-
host模式:使用 --net=host 指定。
-
none模式:使用 --net=none 指定。
-
bridge模式:使用 --net=bridge 指定,默认设置。
-
container模式:使用 --net=container:NAME_or_ID 指定。
host网络模式
Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。
host模式类似于Vmware的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
容器与主机在相同的网络命名空间下面,使用相同的网络协议栈,容器可以直接使用主机的所有网络接口。
例如:使用–net host参数来指定网络模型使用host模式启动一个nginx容器:
$ sudo docker run --name=nginx --net=host -p 80:80 -d nginx
然后使用如下命令cat /etc/hosts查看容器内的网络配置与主机是一致。
$ sudo docker exec -it nginx cat /etc/hosts
这时外界要访问容器中的nginx应用时,则直接使用{host0.ip}:80即可,不用任何NAT转换,就像直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
三、总结
一句话总结,加了–net=host以后就不需要再做端口映射了;比如docker容器内在8080端口起了一个web server.不加的话需要把本机的某个port比如7979和docker内的8080做一个映射关系,访问的时候访问7979. 加了net=host则直接访问8080.
另外,加了net=host后会使得创建的容器进入命令行好名称显示为主机的名称而不是一串id。比如显示
root@node01 #
而不是
root@3b8e647e5f79 #
更多推荐
所有评论(0)