Docker网络相关

本文探讨了Docker容器的网络配置,描述了如何将容器内部的5000端口映射到本地32768端口,并通过`docker logs`命令观察日志。在同一局域网内的两个Docker容器能够互相ping通,它们都在名为my-net的网络中,IP分别为172.18.0.3和172.18.0.2。宿主机也能通过IP地址ping通这两个容器,但不能直接通过容器名称操作。此外,通过ifconfig可以查看宿主机的网络信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Docker中网络功能相关

    Docker是允许通过外部访问容器或者容器互联的方式来提供网络服务。

外部访问容器:

    通过-P或者-p参数指定端口映射,-P是随机;-p是指定。

-P : Docker会随机映射一个端口到内部容器开放的网络端口。

用docker run -d -P training/webapp python app.py 创建启动一个容器。

然后再用docker container ls -l (或者docker ps)看下

容器内5000被映随机射到了本地的32768。(看下下面的测试)

刷新几次上面的网址,然后看下log  (docker logs 1db63003b6b1)

我本地windows电脑的ip是103,虚拟机(宿主机器)ip 104,容器是172.17.0.2 。

-p: 则可以指定要映射的端口,并且,在一个端口上只可以绑定一个容器。支持的格式:

ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort

端口一对一映射(所有ip)

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

端口一对一映射,指定ip

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


映射到指定地址的任意端口(我的docker是19.03.5版本,下面的这个命令失效,会随机映射一个端口出来)

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

默认是tcp端口,可以指定udp端口

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

-p标记可以多次使用来绑定多个端口docker run -d -p 5000:5000 -p 3000:80 training/webapp  python app.py

可以通过docker port xxxx来查看端口映射情况

然后是第二个姿势容器互联

之前docker很多都是用--link进行互联,很多人已经建议不要这么用了,推荐是把容器加入自定义的Docker网络来进行互联操作。

新建Docker网络:docker network create -d bridge my-net

-d参数指定Docker网络类型,有bridge和overlay。其中overlay用于Swarm mode。

运行一个容器并连接到新建的my-net网络



分别打开三个终端,每个终端执行下面中的一条。

docker run -it --rm --name busybox1 --network my-net busybox sh

docker run -it --rm --name busybox2 --network my-net busybox sh

docker container ls

 

讲道理现在正在跑着的两个容易应该是可以互联的(在一个局域网下),分别在两个启动容器的终端里通过ping来确认彼此互联

 

也能看到他们两个的ip,一个是172.18.0.3,另一个是172.18.0.2,有一点要清楚,他们现在都是在上面我们手动创建的那个my-net网络里。此时在宿主机上也是能ping通那两个ip的,但是记得是直接ping ip不是上面两台容器的那个操作方式。

可以ifconfig看下此时宿主机的一些信息。

如果是多个容器之间进行互联,推荐是直接Docker Compose,之后会整理这个相关的笔记。

看到那个docker0了吗,到这我突然记得,貌似是不创建网络,直接默认大家是连接到docker0上的。我自己本地测试了一下,也是开启三个终端,然后分别执行上面那些命令,但是不指定network,然后发现确实是三个终端都彼此可以ping通的。(直接ping ip不是容器名字)

配置DNS

如果想要配置全部容器的DNS,直接在宿主机上  /etc/docker/daemon.json  文件中增加dns这个值

{

    "dns" : [

        "114.114.114.114",

        "8.8.8.8"

    ]

}

就行了。这样每次启动容器自动配置为这两个。

如果想要手动指定:

--dns=IP_ADDRESS添加 DNS 服务器到容器的  /etc/resolv.conf  中。

如果是改主机名可以用下面这个

-h HOSTNAME  或者  --hostname=HOSTNAME  设定容器的主机名,它会被写到容器内的  /etc/hostname  和  /etc/hosts

设定容器的搜索域

--dns-search=DOMAIN  设定容器的搜索域,当设定搜索域为  .example.com时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索host.example.com

还有一种改容器DNS的方式就是直接用之前说的 文件挂载的方式直接挂载容器的/etc/resolv.conf文件出来。这个不做演示了(这个是我自己想的,感觉应该可行,就算可行,也不建议直接把容器的DNS文件和本地的DNS文件绑定在一起,这样就会导致容器有修改宿主主机的DNS的权限了)。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值