Docker 提供了两个功能来实现网络访问:一个是允许映射容器内应用的服务端口到本地宿主主机;另一个是互联机制实现多个容器间通过容器名来快速访问

端口访问

在启动容器时,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。

当容器运行网络应用,要让外部访问到这些应用,可以通过 -P-p 参数来指定端口映射。使用 -P 参数时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口;而使用 -p 参数时,则可以指定要映射的端口(一个端口只可以绑定一个容器),支持的格式有三个:

  • 映射所有接口地址:HostPort:ContainerPort
  • 映射到指定地址的指定端口:IP:HostPort:ContainerPort
  • 映射到指定地址的任意端口:IP::ContainerPort

下面看一些示例:

  1. # 1. 测试-P随机指定端口,如下图,docker随机分配的端口是49154
  2. > docker run -d -P --name test1 nginx
  3. # 2. 测试映射所有接口地址-p 8080:80
  4. > docker run -d -p 8080:80 --name test2 nginx
  5. # 3. 测试映射到指定地址的指定端口-p 127.0.0.1:8080:80
  6. > docker run -d -p 127.0.0.1:8080:80 --name test3 nginx
  7. # 4. 测试映射到指定地址的任意端口-p 127.0.0.1::80
  8. > docker run -d -p 127.0.0.1::80 --name test4 nginx
  9. # 5. 可以映射多个端口
  10. > docker run -d -p 8080:80 5000:5000 --name test5 nginx
  11. # 6. 查看当前映射的端口配置
  12. > docker port test1 80
  13. # 7. 使用udp标记来映射udp端口
  14. > docker run -d -p 127.0.0.1:8080:80/udp --name test nginx

这里只展示前两个例子,后面例子自行测试。
image.png
image.png

下面我们来实现一个开启容器 nginx-test,同时通过宿主本机访问虚拟机中的 docker 的 nginx 服务。

  1. # 1.创建一个nginx服务
  2. > docker run -d --name nginx-test -p 10.0.2.15:9527:80 nginx
  3. # 查看运行的docker容器
  4. > docker ps
  5. # 虚拟机上访问docker服务
  6. > curl 10.0.2.15:9527

image.png

这里 10.0.2.15 是虚拟机的 ip 地址,如果 curl 10.0.2.15:9527 命令能输出 index.html 信息,证明已经可以通过端口映射访问到容器 nginx-test,接着我们还需要配置 virtualbox 端口转发地址,让我们的宿主主机能访问到虚拟机的服务。

端口转发的主机IP和主机端口分别是我们的宿主主机的 IP 地址和端口,子系统 IP和端口分别是虚拟机的 IP 地址和端口。

image.png

配置完上述的内容后,我们就可以通过宿主本机访问到 docker 容器的 nginx 服务啦~。
image.png

为了证明宿主主机访问的就是我们的 docker 容器,这里我们再往容器的 index.html 中插入一个“hello world”,最后也能在页面上看到。
image.png
image.png

容器互联

随着 Docker 网络的完善,推荐将容器加入自定义的 Docker 网络来连接多个容器,而不是使用 --link 参数。

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

  1. > docker network create -d bridge my-net

-d 参数指定 Docker 网络类型,有 bridge、overlay ,默认是 bridge。

连接容器
分别打开终端运行两个容器 test1、test2 并加入到网络 my-net。通过 --network 参数指定网络。

  1. # 打开一个终端运行test1
  2. > docker run -it --rm --name test1 --network my-net nginx bash
  3. # 再打开一个终端运行test2
  4. > docker run -it --rm --name test2 --network my-net nginx bash

再打开一个新的终端查看两个容器的启动情况。

  1. > docker container ls

下面通过 ping 来证明两个容器 test1、test2 建立了互联关系。

  1. # test1容器中ping test2
  2. root@80c7cc0109d7:/# ping test2
  1. # test2容器中ping test1
  2. root@f3f776076b8a:/# ping test1

image.png

Docker Compose

如果你有多个容器之间需要互相连接,推荐使用 Docker Compose