Docker是一个流行的容器化平台,可以帮助用户轻松地创建、部署和运行应用程序。在使用Docker时,网络配置是一个很重要的问题。本文将介绍如何在Docker中配置网络,并访问互联网。
一、配置Docker镜像源
在Docker中,镜像源是一个重要的组成部分,因为它可以让您快速地下载和安装Docker镜像。以下是如何配置Docker镜像源的步骤:
1.执行以下命令,查看是否在
docker.service
文件中配置过镜像地址。
systemctl cat docker | grep '\-\-registry\-mirror'
如果该命令有输出,那么请执行
$ systemctl cat docker
查看
ExecStart=
出现的位置,修改对应的文件内容去掉
--registry-mirror
参数及其值,并按接下来的步骤进行配置。
2.如果以上命令没有任何输出,那么就可以在
/etc/docker/daemon.json
中写入如下内容(如果文件不存在请新建该文件):
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
注意,一定要保证该文件符合 json 规范,否则 Docker 将不能启动。
之后重新启动服务。
sudo systemctl daemon-reload
sudo systemctl restart docker
二、配置Docker容器网络
以下是如何配置Docker容器网络的步骤:
首先,使用
docker pull
命令拉取CentOS镜像。
docker pull centos
然后,使用
docker run
命令启动CentOS容器,并进入容器的命令行界面。
docker run -it centos /bin/bash
接下来,使用
vi
命令编辑
/etc/resolv.conf
文件,并将
nameserver
行更改为您想要使用的DNS服务器的IP地址。
vi /etc/resolv.conf
nameserver 114.114.114.114
nameserver 114.114.115.115
保存并关闭文件,然后退出编辑器。
重新启动网络服务以使更改生效。
bashCopy code
systemctl restart network
如果出现了下述问题:
[root@18f25a9f1bf3 ~]# systemctl restart network
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
您需要通过此命令启动您的容器以启用 systemd。
docker run -d --privileged 镜像名称 /usr/sbin/init
其中,
--privileged
选项允许容器中的进程拥有访问主机的所有权限,
镜像名称
为要启动的镜像名称。执行完该命令后,会启动一个新容器,并进入容器的命令行界面。此时可以使用管理员权限执行命令。-d是后台运行。
可以使用
docker exec
命令进入正在运行的容器并以root用户身份运行shell:
docker exec -u 0 -it <container-id> /bin/bash
其中,
-u 0
表示以root用户身份进入容器,
-it
表示交互式进入容器的终端。
三、解决Docker容器网络访问问题
Docker容器访问互联网,一直通过
--net=host
参数间接实现。该方式存在弊端,因为该模式禁用Docker容器的网络隔离。容器共享宿主机的网络命名空间,直接暴露在公共网络中,即容器和宿主机具有相同的IP地址。而使用桥接网络模式,可以避免这种问题,并且更加安全。
方法一:启用宿主机路由
启用命令: 宿主机的IP路由转发功能一定要打开,否则所创建的容器无法联网!容器run后运行下面命令也有效。墙裂推荐。
echo 1 > /proc/sys/net/ipv4/ip_forward
启用命令后,可以通过
docker run
命令加上
--net=host
参数使用Docker容器。
docker run --privileged -tid -p 8000:8000 -p 8088:8088 -p 8042:8042 -p 50070:50070 --net=host 镜像名称
注意:在使用
--net=host
参数时,Docker容器将使用宿主机的网络命名空间,容器中的进程直接暴露在公共网络中,具有相同的IP地址,因此有安全风险。
方法二:使用自定义网络
Docker中的自定义网络,提供了一种更安全的方式来管理容器间的通信,即使没有
--net=host
参数,也可以使容器联网。自定义网络是一种Docker内置的网络驱动程序,可以创建一个本地或远程的虚拟网络,让容器可以使用虚拟网络中的IP地址进行通信。以下是使用自定义网络的方法。
创建自定义网络
docker network create my_network
启动容器,使用
--network
参数指定要使用的网络。
docker run --name container1 --network=my_network -tid busybox
docker run --name container2 --network=my_network -tid busybox
查看网络连接情况
docker network inspect my_network
以上命令将显示虚拟网络的详细信息,包括网络的名称、驱动程序、子网等。
通过以上两种方法可以解决Docker容器网络访问问题。
参考链接:
https://blog.csdn.net/qq_24452475/article/details/94304149
https://blog.csdn.net/TrinidadW/article/details/111939428
https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.57e31b11R6sMCE
https://docker-practice.github.io/zh-cn/install/mirror.html