Docker容器之内网独立IP访问

栏目: 服务器 · 发布时间: 6年前

内容简介:今天在学习Docker容器的时候,在虚拟机中创建并开启了一个nginx的container,然后通过端口映射的方法,即将container的80端口映射到虚拟机的80端口,然后在宿主机上通过访问虚拟机的IP从而访问到Docker容器的Nginx服务。然后开始思考,能否通过分配给container一个独立的IP,然后在宿主机上访问这个独立IP从而访问Nginx服务。通过各种探索,百度,最终实现,下面开始实验,这里用的是虚拟机的NAT模式。

Docker容器之内网独立IP访问

实验介绍

今天在学习 Docker 容器的时候,在虚拟机中创建并开启了一个nginx的container,然后通过端口映射的方法,即将container的80端口映射到虚拟机的80端口,然后在宿主机上通过访问虚拟机的IP从而访问到Docker容器的Nginx服务。

然后开始思考,能否通过分配给container一个独立的IP,然后在宿主机上访问这个独立IP从而访问Nginx服务。通过各种探索,百度,最终实现,下面开始实验,这里用的是虚拟机的NAT模式。

实验图解

Docker容器之内网独立IP访问

实验实施

  • 安装docker服务
    [root@promote ~]# yum install docker -y
  • 关闭防火墙和SElinux
    [root@promote ~]# systemctl stop firewalld.service
    [root@promote ~]# setenforce 0
  • 开启docker服务
    [root@promote ~]# systemctl start docker.service 
    [root@promote ~]# systemctl enable docker.service 
    Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
    #将docker服务设置为开机启动
  • 启动docker服务后,我们可以通过命令从服务端先搜索nginx镜像。
    Docker容器之内网独立IP访问
  • 下载星级最高的nginx镜像,这里顺便说一下使用aliyun的docker源配置。
    Docker容器之内网独立IP访问
  • 下载nginx服务镜像。
    [root@promote etc]# docker pull docker.io/nginx
    Using default tag: latest
    Trying to pull repository docker.io/library/nginx ... 
    latest: Pulling from docker.io/library/nginx
    be8881be8156: Pull complete 
    32d9726baeef: Pull complete 
    87e5e6f71297: Pull complete 
    Digest: sha256:d85914d547a6c92faa39ce7058bd7529baacab7e0cd4255442b04577c4d1f424
    Status: Downloaded newer image for docker.io/nginx:latest
  • 在虚拟机中创建一个自定义网络
    [root@promote etc]# docker network create --subnet=172.20.0.0/24 docker-br0
    f900579310b9e692ab5a2593d9845be24166120a9de1c16e3143fa5a9c875f96
    #创建一个172.20.0.0网段,网桥的名字命名为docker-br0,这两个根据自己需要来

    Docker容器之内网独立IP访问

  • 在自定义的网段中选取一个IP作为container的IP来启动。
    [root@promote etc]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    docker.io/nginx     latest              c82521676580        2 weeks ago         109 MB
    #查看我们下载下来的镜像,下面会用到IMAGE ID
    [root@promote etc]# docker run -itd --net docker-br0 --ip 172.20.0.10 --name nginx c82521676580 /bin/bash
    a2da3616efd0c53745fd7b33823733598be749c83cd4a84f72025664837b3a77
    #i表示保持容器打开,t表示给docker分配一个伪终端,d表示以daemon守护进程的方式开启
    #--net指定网桥名称,--ip指定启动ip ,--name指定服务名称
    [root@promote etc]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    a2da3616efd0        c82521676580        "/bin/bash"         4 minutes ago       Up 4 minutes        80/tcp              nginx
    #可以看到服务已经启动
  • 进入到容器中安装一些工具

    [root@promote etc]# docker exec -it nginx /bin/bash
    #nginx就是上面指定的name

    这个时候我们使用ifconfig

    root@a2da3616efd0:/# ifconfig
    bash: ifconfig: command not found
    #可以看到并没有这个命令,所以我们需要安装net-tools工具

一开始我以为使用yum方式安装,发现没用, 后来查看系统命令发现,容器里面使用的是Debian Linux的apt-get命令,首先要更新源。

root@a2da3616efd0:/# apt-get update
#update 是更新 /etc/apt/sources.list 和 /etc/apt/sources.list.d列出的源地址,获取最新软件包信息。
Get:1 http://security.debian.org/debian-security stretch/updates InRelease [94.3 kB] 
Get:3 http://security.debian.org/debian-security stretch/updates/main amd64 Packages [386 kB]
Ign:2 http://cdn-fastly.deb.debian.org/debian stretch InRelease                          
Get:4 http://cdn-fastly.deb.debian.org/debian stretch-updates InRelease [91.0 kB]
Get:5 http://cdn-fastly.deb.debian.org/debian stretch Release [118 kB]
Get:6 http://cdn-fastly.deb.debian.org/debian stretch-updates/main amd64 Packages [5148 B]
Get:7 http://cdn-fastly.deb.debian.org/debian stretch Release.gpg [2434 B]
Get:8 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 Packages [7099 kB]
Fetched 7796 kB in 1min 50s (70.8 kB/s)                                                  
Reading package lists... Done

root@a2da3616efd0:/proc# apt-get upgrade
#升级已经安装的软件包即update中的
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

root@a2da3616efd0:/proc# apt-get install net-tools 
#安装net-tools软件包
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  net-tools
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Setting up net-tools (1.60+git20161116.90da8a0-1) ...
  • 查看容器的ip地址
    Docker容器之内网独立IP访问
  • 开启Nginx服务
    root@a2da3616efd0:~# nginx
    root@a2da3616efd0:~# netstat -ntap
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      232/nginx: master p 
    tcp        0      0 127.0.0.11:42541        0.0.0.0:*               LISTEN      -  
    #nginx服务已经开启,系统80端口也已经打开。

    我们在虚拟机环境下,用172.20.0.10测试是否能访问nginx默认首页。

    Docker容器之内网独立IP访问
  • 到物理机win10中访问172.20.0.10,测试是否能访问

    Docker容器之内网独立IP访问

    结果就是并不能访问nginx,我们尝试使用win10来ping172.20.0.10。

    Docker容器之内网独立IP访问
  • 尝试开启路由转发
    Docker容器之内网独立IP访问 Docker容器之内网独立IP访问
  • 分别查看container和win10的路由表
    Docker容器之内网独立IP访问 Docker容器之内网独立IP访问 Docker容器之内网独立IP访问 Docker容器之内网独立IP访问
  • 这时候我们再来在win10上访问172.20.0.10.发现可以访问了。

    Docker容器之内网独立IP访问 Docker容器之内网独立IP访问
  • 最后我们将虚拟机中的路由转发关闭试试

    Docker容器之内网独立IP访问 Docker容器之内网独立IP访问
  • 最后总结
    1、创建自定义网段
    2、选一个自定义网段内的IP,开启容器
    3、开启虚拟机的路由转发
    4、在物理机路由中添加自定义网段的路由条目,指定接口为虚拟机的IP地址

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Cracking the Coding Interview

Cracking the Coding Interview

Gayle Laakmann McDowell / CareerCup / 2015-7-1 / USD 39.95

Cracking the Coding Interview, 6th Edition is here to help you through this process, teaching you what you need to know and enabling you to perform at your very best. I've coached and interviewed hund......一起来看看 《Cracking the Coding Interview》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

MD5 加密
MD5 加密

MD5 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具