Docker 提供了两个功能来实现网络访问:一个是允许映射容器内应用的服务端口到本地宿主主机;另一个是互联机制实现多个容器间通过容器名来快速访问。
端口访问
在启动容器时,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。
当容器运行网络应用,要让外部访问到这些应用,可以通过 -P
或 -p
参数来指定端口映射。使用 -P
参数时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口;而使用 -p
参数时,则可以指定要映射的端口(一个端口只可以绑定一个容器),支持的格式有三个:
- 映射所有接口地址:HostPort:ContainerPort
- 映射到指定地址的指定端口:IP:HostPort:ContainerPort
- 映射到指定地址的任意端口:IP::ContainerPort
下面看一些示例:
# 1. 测试-P随机指定端口,如下图,docker随机分配的端口是49154
> docker run -d -P --name test1 nginx
# 2. 测试映射所有接口地址-p 8080:80
> docker run -d -p 8080:80 --name test2 nginx
# 3. 测试映射到指定地址的指定端口-p 127.0.0.1:8080:80
> docker run -d -p 127.0.0.1:8080:80 --name test3 nginx
# 4. 测试映射到指定地址的任意端口-p 127.0.0.1::80
> docker run -d -p 127.0.0.1::80 --name test4 nginx
# 5. 可以映射多个端口
> docker run -d -p 8080:80 5000:5000 --name test5 nginx
# 6. 查看当前映射的端口配置
> docker port test1 80
# 7. 使用udp标记来映射udp端口
> docker run -d -p 127.0.0.1:8080:80/udp --name test nginx
这里只展示前两个例子,后面例子自行测试。
下面我们来实现一个开启容器 nginx-test,同时通过宿主本机访问虚拟机中的 docker 的 nginx 服务。
# 1.创建一个nginx服务
> docker run -d --name nginx-test -p 10.0.2.15:9527:80 nginx
# 查看运行的docker容器
> docker ps
# 虚拟机上访问docker服务
> curl 10.0.2.15:9527
这里 10.0.2.15 是虚拟机的 ip 地址,如果 curl 10.0.2.15:9527
命令能输出 index.html 信息,证明已经可以通过端口映射访问到容器 nginx-test,接着我们还需要配置 virtualbox 端口转发地址,让我们的宿主主机能访问到虚拟机的服务。
端口转发的主机IP和主机端口分别是我们的宿主主机的 IP 地址和端口,子系统 IP和端口分别是虚拟机的 IP 地址和端口。
配置完上述的内容后,我们就可以通过宿主本机访问到 docker 容器的 nginx 服务啦~。
为了证明宿主主机访问的就是我们的 docker 容器,这里我们再往容器的 index.html 中插入一个“hello world”,最后也能在页面上看到。
容器互联
随着 Docker 网络的完善,推荐将容器加入自定义的 Docker 网络来连接多个容器,而不是使用 --link
参数。
新建网络
先创建一个新的 Docker 网络。
> docker network create -d bridge my-net
-d
参数指定 Docker 网络类型,有 bridge、overlay
,默认是 bridge。
连接容器
分别打开终端运行两个容器 test1、test2 并加入到网络 my-net。通过 --network
参数指定网络。
# 打开一个终端运行test1
> docker run -it --rm --name test1 --network my-net nginx bash
# 再打开一个终端运行test2
> docker run -it --rm --name test2 --network my-net nginx bash
再打开一个新的终端查看两个容器的启动情况。
> docker container ls
下面通过 ping 来证明两个容器 test1、test2 建立了互联关系。
# test1容器中ping test2
root@80c7cc0109d7:/# ping test2
# test2容器中ping test1
root@f3f776076b8a:/# ping test1
Docker Compose
如果你有多个容器之间需要互相连接,推荐使用 Docker Compose
。