docker network (docker 网络的组建)

标签:

本文出自jvm123.com-java技术分享站:http://jvm123.com/2019/07/docker-network.html

“docker 网络的组建” 就是需要解决docker容器之间的网络访问以及其他主机访问docker容器的问题。根据实践验证,具体列举以下方法:

1 映射主机端口

映射主机端口,也就是将docker容器提供服务的端口映射到主机的某一个端口,消费者直接访问主机即可。

docker run --name docker-nginx 
-d 
-p 8080:80 
-v /root/service/nginx/nginx.conf:/etc/nginx/nginx.conf 
-v /root/service/nginx/conf.d:/etc/nginx/conf.d 
-v /root/service/nginx/html:/usr/share/nginx/html 
nginx

使用以上命令运行容器的时候,将容器docker-nginx的80端口映射到了主机的8080端口,其中 -p 8080:80 就是指定端口的映射关系。 消费者可以直接访问主机的8080端口,此外,还必须开启主机防火墙的8080端口。(防火墙的设置方法在上篇文章已经介绍到了)

然而,在Docker Hub的大多常用的镜像实例说明中,基本都不会使用这种方式来运行一个容器,因为在公网中,多开一个端口,就意味着主机在网络世界中多了一个弱点。我主机上的服务就因为防火墙未关闭端口被攻击过。所以,使用docker network组建容器之间的网络是很有必要的。

2 docker network 组建容器之间的网络

在docker中,docker network 是主要是用做容器之间的通信,即组建容器之间的局域网。其实使用 -link 可以实现容器之间简单的网络,但是容器较多而且通信关系较为复杂时,使用network就更又条理。

docker network 即在容器之间组建一个局域网,然后各个容器可以加入这个网络,之后容器之间的访问就如同局域网中主机之间的访问。

创建一个network

docker network create docker-network  // docker-network是局域网的名字,自定义 
docker network ls  // 查看已有的network

将容器连接到network

// 运行新的容器,并加入到docker-network网络中
// --network 表示这个容器要连接到的网络
// --network-alias 表示这个容器在此网络中的名称,也可以使用--ip来指定容器的ip
docker run --name docker-nginx -d 
--network docker-network 
--network-alias nginx-network nginx

// 已经在运行的容器加入网络使用以下命令
// docker network connect [OPTIONS] NETWORK CONTAINER
docker network connect --alias nginx-network docker-network docker-nginx
docker network connect --alias wp-network docker-network docker-wordpress

容器之间的访问

经过以上命令,我们已经创建了一个名为 docker-network 的网络,并且有两个容器加入了这个网络,在网络中的名称分别为:nginx-network 和 wp-network。现在需要使用 nginx 作为反向代理来访问 wordpress(wp-network),可直接修改 nginx 的配置文件,设置代理的主机地址为 wp-network 即可,( wp-network 为容器在network中的名称)如下:

location / {
    proxy_pass http://wp-network:80/;
}
// 注意:这里的80端口为wordpress镜像暴露的端口,(即DockerFile中expose的端口),
// 并不是映射到主机的端口。(其实也没必要映射端口了)

至此,docker网络的组建以及容器之间访问的问题已经解决了。

最重要的一点:本机防火墙状态改变后,一定要重启docker服务,否则对于docker网络的设置不会生效。

systemctl restart docker

发表评论