如何查看 Docker 容器的 IP 地址和端口映射

各位观众,各位朋友,各位热爱Docker的小伙伴们,欢迎来到今天的“Docker秘籍之IP与端口大揭秘”讲堂!我是你们的老朋友,也是你们在Docker世界里值得信赖的向导——码农老王。

今天,咱们不讲那些晦涩难懂的理论,也不搞那些让人头昏脑胀的术语,咱们用最通俗易懂的语言,最生动形象的比喻,来聊聊Docker容器的IP地址和端口映射,保证让大家听得明白,学得会,用得上!

开场白:Docker容器,一个神秘的小盒子

想象一下,Docker容器就像一个精致的小盒子,里面装满了各种各样的应用程序和服务。这些小盒子彼此隔离,互不干扰,就像一个个独立王国,各自拥有自己的领地和资源。

那么问题来了,我们如何才能找到这些小盒子,并且与它们进行交流呢?这就涉及到IP地址和端口映射这两个关键概念了。

第一幕:IP地址,容器的身份证号码

首先,我们来聊聊IP地址。IP地址就像容器的身份证号码,是它在网络世界里的唯一标识。有了IP地址,我们才能准确地找到这个容器,并且向它发送指令或请求。

但是,Docker容器的IP地址和我们平时使用的IP地址有所不同。Docker容器通常运行在一个私有网络中,它的IP地址是由Docker守护进程动态分配的。这就意味着,每次启动容器,它的IP地址都可能发生变化。

那么,我们如何才能查看Docker容器的IP地址呢?别着急,码农老王这就教你几招:

方法一:docker inspect 命令,全能侦探

docker inspect 命令就像一个全能侦探,可以帮助我们获取容器的各种信息,包括IP地址。

使用方法如下:

docker inspect <容器ID或名称> | grep IPAddress

这条命令会输出容器的IP地址信息。例如:

"IPAddress": "172.17.0.2",

是不是很简单?就像找到了容器的身份证号码一样,心里是不是踏实多了?😊

方法二:docker exec 命令,潜入容器内部

docker exec 命令就像一个秘密特工,可以潜入容器内部,执行各种命令。我们可以利用这个命令,在容器内部查看IP地址。

使用方法如下:

docker exec -it <容器ID或名称> ip addr show

这条命令会在容器内部执行 ip addr show 命令,显示容器的网络接口信息,其中就包括IP地址。

例如:

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

看到 inet 172.17.0.2/16 这一行了吗?这就是容器的IP地址啦!

方法三:docker network inspect 命令,网络全局观

如果你想查看整个Docker网络的IP地址分配情况,可以使用 docker network inspect 命令。

使用方法如下:

docker network inspect <网络名称>

这条命令会输出Docker网络的详细信息,包括子网、网关、以及每个容器的IP地址。

例如:

{
    "Name": "bridge",
    "Id": "b7b49b7d7a9253293c941356073862b0b59368a707d384e9999d0b9b566426e1",
    "Created": "2023-10-27T08:00:00.000000000Z",
    "Scope": "local",
    "Driver": "bridge",
    "EnableIPv6": false,
    "IPAM": {
        "Driver": "default",
        "Options": null,
        "Config": [
            {
                "Subnet": "172.17.0.0/16",
                "Gateway": "172.17.0.1"
            }
        ]
    },
    "Containers": {
        "a1b2c3d4e5f6": {
            "Name": "my-container",
            "EndpointID": "f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2",
            "MacAddress": "02:42:ac:11:00:02",
            "IPv4Address": "172.17.0.2/16",
            "IPv6Address": ""
        }
    },
    "Options": {
        "com.docker.network.bridge.default_bridge": "true",
        "com.docker.network.bridge.enable_icc": "true",
        "com.docker.network.bridge.enable_ip_masquerade": "true",
        "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
        "com.docker.network.bridge.name": "docker0",
        "com.docker.network.driver.mtu": "1500"
    },
    "Labels": {}
}

在这个例子中,我们可以看到容器 my-container 的IP地址是 172.17.0.2

第二幕:端口映射,容器的对外窗口

有了IP地址,我们就可以找到容器了。但是,容器内部的服务通常监听在特定的端口上。如果我们想访问这些服务,还需要进行端口映射。

端口映射就像在容器上开设一个对外窗口,将容器内部的端口映射到宿主机的端口上。这样,我们就可以通过宿主机的IP地址和端口来访问容器内部的服务了。

举个例子,假设容器内部运行着一个Web服务器,监听在80端口上。我们可以将容器的80端口映射到宿主机的8080端口上。这样,我们就可以通过访问宿主机的IP地址和8080端口来访问容器内部的Web服务器了。

那么,我们如何进行端口映射呢?

方法一:docker run 命令,启动容器时指定

在启动容器时,我们可以使用 docker run 命令的 -p--publish 参数来指定端口映射。

使用方法如下:

docker run -p <宿主机端口>:<容器端口> <镜像名称>

例如:

docker run -p 8080:80 nginx

这条命令会将容器的80端口映射到宿主机的8080端口。

我们还可以指定宿主机的IP地址:

docker run -p 127.0.0.1:8080:80 nginx

这条命令会将容器的80端口映射到宿主机IP地址为 127.0.0.1 的8080端口。这意味着只有从宿主机才能访问这个服务。

方法二:docker-compose.yml 文件,集中管理

如果你的应用程序由多个容器组成,可以使用 docker-compose.yml 文件来集中管理端口映射。

例如:

version: "3.9"
services:
  web:
    image: nginx
    ports:
      - "8080:80"

在这个例子中,我们定义了一个名为 web 的服务,使用 nginx 镜像,并将容器的80端口映射到宿主机的8080端口。

方法三:docker port 命令,事后查看

如果你想查看容器的端口映射情况,可以使用 docker port 命令。

使用方法如下:

docker port <容器ID或名称>

这条命令会输出容器的端口映射信息。

例如:

80/tcp -> 0.0.0.0:8080

这意味着容器的80端口映射到了宿主机的8080端口。

第三幕:实战演练,手把手教你

理论讲了这么多,不如来点实际的。接下来,码农老王就带大家做一个实战演练,手把手教你查看Docker容器的IP地址和端口映射。

场景:

我们有一个运行着Nginx Web服务器的Docker容器,我们想查看它的IP地址和端口映射情况,并且通过浏览器访问这个Web服务器。

步骤:

  1. 启动Nginx容器:
docker run -d -p 8080:80 --name my-nginx nginx

这条命令会启动一个名为 my-nginx 的Nginx容器,并将容器的80端口映射到宿主机的8080端口。

  1. 查看容器的IP地址:
docker inspect my-nginx | grep IPAddress

这条命令会输出容器的IP地址信息。例如:

"IPAddress": "172.17.0.2",
  1. 查看容器的端口映射:
docker port my-nginx

这条命令会输出容器的端口映射信息。例如:

80/tcp -> 0.0.0.0:8080
  1. 通过浏览器访问Web服务器:

在浏览器中输入 http://localhost:8080http://<宿主机IP地址>:8080,就可以访问Nginx Web服务器了。

看到Nginx的欢迎页面了吗?恭喜你,你已经成功地查看了Docker容器的IP地址和端口映射,并且成功地访问了容器内部的服务!🎉

进阶技巧:

  • 使用Docker网络别名:

    我们可以为容器指定一个网络别名,这样就可以通过别名来访问容器,而不需要知道容器的IP地址。

    例如:

    version: "3.9"
    services:
      web:
        image: nginx
        ports:
          - "8080:80"
        networks:
          - my-network
        hostname: webserver  # 设置容器hostname,也可作为别名使用
    
    networks:
      my-network:
        name: custom_network # 指定网络名称

    在这个例子中,我们为 web 服务指定了一个网络别名 webserver。这样,我们就可以通过 http://webserver:80 来访问这个服务了。
    注意,需要保证容器之间在同一个网络中,才能通过别名访问。

  • 使用域名解析:

    我们可以将容器的IP地址与域名绑定,这样就可以通过域名来访问容器,而不需要知道容器的IP地址。

    例如,修改宿主机的 /etc/hosts 文件,添加以下内容:

    172.17.0.2  my-web-app.local

    这样,我们就可以通过 http://my-web-app.local:8080 来访问Web服务器了。

总结:

今天,我们一起学习了如何查看Docker容器的IP地址和端口映射。我们了解了IP地址就像容器的身份证号码,端口映射就像容器的对外窗口。我们学习了使用 docker inspectdocker execdocker network inspectdocker rundocker-compose.ymldocker port 命令来查看和配置IP地址和端口映射。最后,我们还做了一个实战演练,手把手教你如何访问Docker容器内部的服务。

希望今天的课程能够帮助大家更好地理解和使用Docker。记住,Docker的世界充满了无限可能,只要你敢于探索,勇于实践,就一定能够成为Docker高手!💪

彩蛋:

最后,码农老王给大家留一个小作业:

  1. 创建一个包含多个容器的Docker Compose应用程序。
  2. 使用不同的方法来查看每个容器的IP地址和端口映射情况。
  3. 尝试使用网络别名和域名解析来访问容器内部的服务。

希望大家能够认真完成作业,并在评论区分享你的学习成果。期待与大家共同进步,一起成长!

感谢大家的收听,我们下期再见!👋

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注