容器外网映射

容器网络映射

容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。

当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。

使用-P映射随机端口   ****理论上是49000~49900,但是服务器映射的端口是32769,原因待确认

[root@localhost opt]# docker -d -v /data:/var/www/html -P nginx:v2

root@localhost opt]# docker ps |grep nginx
a42f85890719        nginx:v2                  "nginx -g 'daemon of��"   12 minutes ago      Up 12 minutes       0.0.0.0:32769->80/tcp   hardcore_ramanujan

访问测试:

容器日志查看

 

复制代码
[root@localhost opt]# docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                   NAMES
a42f85890719        nginx:v2                  "nginx -g 'daemon of��"   41 minutes ago      Up 41 minutes       0.0.0.0:32769->80/tcp   hardcore_ramanujan
ce4ccea0bde8        ansible/centos7-ansible   "bash"                   2 days ago          Up 2 days                                   web3
[root@localhost opt]# docker logs -f a42
172.16.204.1 - - [31/Aug/2019:10:32:23 +0000] "GET / HTTP/1.1" 200 22 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "-"
2019/08/31 10:32:23 [error] 6#6: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 172.16.204.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "172.16.204.133:32769", referrer: "http://172.16.204.133:32769/"
172.16.204.1 - - [31/Aug/2019:10:32:23 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://172.16.204.133:32769/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "-"
172.16.204.1 - - [31/Aug/2019:10:34:09 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "-"
172.16.204.1 - - [31/Aug/2019:10:34:11 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "-"
复制代码

 

映射所有接口地址

使用 hostPort:containerPort 格式本地的 5000 端口映射到容器的 5000 端口,可以执行

$ docker run -d -p 5000:5000 training/webapp python app.py

映射到指定地址的指定端口

可以使用 ip:hostPort:containerPort 格式指定映射使用一个特定地址,比如 localhost 地址127.0.0.1

$ docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py

映射到指定地址的任意端口

 

 

使用 ip::containerPort 绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口。

$ docker run -d -p 127.0.0.1::5000 training/webapp python app.py

还可以使用 udp 标记来指定 udp 端口

$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

查看映射端口配置

 

[root@localhost opt]# docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                   NAMES
a42f85890719        nginx:v2                  "nginx -g 'daemon of��"   52 minutes ago      Up 52 minutes       0.0.0.0:32769->80/tcp   hardcore_ramanujan
ce4ccea0bde8        ansible/centos7-ansible   "bash"                   2 days ago          Up 2 days                                   web3

[root@localhost opt]# docker port a42f8 80
0.0.0.0:32769

 

注意:

容器有自己的内部网络和 ip 地址(使用 docker inspect 可以获取所有的变量,Docker

还可以有一个可变的网络配置。)

-p 标记可以多次使用来绑定多个端口

例如

$ docker run -d \
-p 5000:5000 \
-p 3000:80 \
training/webapp \
python app.py

容器互联

 

如果你之前有 Docker 使用经验,你可能已经习惯了使用 --link 参数来使容器互联。

随着 Docker 网络的完善,强烈建议大家将容器加入自定义的 Docker 网络来连接多个容器,

而不是使用 --link 参数。

新建网络

下面先创建一个新的 Docker 网络。

[root@localhost opt]# docker network create -d bridge my-net

-d 参数指定 Docker 网络类型,有 bridge overlay 。其中 overlay 网络类型用于Swarm mode,在本小节中你可以忽略它。

连接容器

[root@localhost opt]# docker run -d -p 5000:80 -v /data:/data --name server2 --network my-net nginx:v2
b6cee94c2f58dc87622a65290d5d786c764731d9aa57c4f46b66d5e718b76a3d

[root@localhost opt]# docker run -d -p 6000:80 -v /data:/data --name server3 --network my-net nginx:v2
e5ec88002b3d80bff645d692ebc9a7ef62f5eefb9244af544c55af6106da1e59

 配置DNS

 

 手动指定容器dns

[root@localhost ~]# docker run  -it --rm --dns=114.114.114.114 nginx:v2 cat /etc/resolv.conf
nameserver 114.114.114.114
failed to resize tty, using default size

通过修改配置文件来让新启动的容器走默认dns配置   (测试后不生效! 待定为原因😂)

vim /etc/docker/daemon.json

{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}

指定主机名(--hostname)

[root@localhost ~]# docker run  -it --rm --dns=114.114.114.114  --hostname=nginx nginx:v2 cat /etc/hostname
nginx
failed to resize tty, using default size

 

 

posted @   什么都不会的小郭  阅读(1537)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示