少用容易忘的docker命令和使用经验


docker命令

docker inspect [containID] 查看容器信息

docker exec -it [containID] bash 进入到容器内部 docker rm [containID]删除容器

docker rmi [imagesname]删除镜像


docker网络


在docker的网络中容器部署了应用而端口映射是 "3001:3002"[宿主机网段端口:容器网段端口] 初学的时候以为3002是将容器监听在容器网络3002端口的意思实际上的意思是将宿主机的端口映射到容器网段的端口,而至于3002端口跟容器的关系?

大部份的时候是直接将容器监听在3002端口上,但是曾经遇到过我将一个postgre容器运行在20010网段上 ,但是这个容器还是监听在默认的postgre5432端口,导致宿主机映射到20010网段而找不到服务。 所以正确的映射是docker run -p 20010:5432 ... postgres

这样,宿主机的 20010 端口的流量就会被转发到容器内部 PostgreSQL 实际监听的 5432 端口


不使用IP地址 使用更优雅的内网地址来访问容器内/外应用

172.17.0.1 等 Docker 桥接网络网关 IP 的双重角色

  • 容器的默认网关: 对于连接到 Docker 默认 bridge 网络(通常是 172.17.0.0/16)的容器而言,172.17.0.1 是它们的默认网关。

  • 宿主机在容器网络中的 IP: 172.17.0.1 也是宿主机上 docker0 桥接接口的 IP 地址。类似地,如果您创建了其他用户自定义桥接网络(如 172.18.0.0/16),其网关 IP(如 172.18.0.1)也是宿主机在该网络中的 IP。

  • 通信枢纽: 因为这些网关 IP 都是宿主机自身的 IP,所以宿主机可以接收发往这些 IP 的流量,并根据路由表或 iptables 规则进行处理。

三、容器间通信

  • 同网段容器:

    • 直接 IP/服务名通信 : 如果容器在同一个用户自定义 Docker 网络中,它们可以通过彼此的容器内部 IP 地址直接通信,这是最常见和高效的方式。

    • 通过宿主机网关中转: 如果目标容器的端口映射到宿主机,则同一网段的容器也可以通过访问宿主机网关 IP (172.17.0.1) 和映射的端口来访问服务。

  • 跨网段容器:

    • 无法直接 IP 通信: 不同 Docker 桥接网络是相互隔离的,容器无法直接通过对方的内部 IP 进行通信。

    • 通过宿主机中转 (强制端口映射): 唯一的通信方式是,目标容器的服务端口必须映射到宿主机,然后发起请求的容器通过访问宿主机上目标网络网关的 IP 地址(如 172.17.0.1)以及映射的端口来访问服务。这利用了宿主机的路由和 iptables 转发能力。

四、容器访问宿主机

  • 容器可以通过访问其默认网关 IP(例如 172.17.0.1)以及宿主机上应用程序实际监听的端口来访问宿主机上的服务。宿主机直接将请求交付给本地监听的应用程序。

五、宿主机路由表的关键作用

  • 宿主机是路由器:Docker 在宿主机上创建每个桥接网络时,都会在宿主机的路由表中添加相应的路由条目。

  • 跨网段通信的关键: 这些路由条目使得宿主机能够理解并转发来自一个 Docker 网络发往另一个 Docker 网络(或宿主机自身)的流量。172.17.0.1 和 172.18.0.1 成为不同网段之间通信的关键,因为它们都是宿主机自身可路由的接口 IP。

以后容器之间访问可以通过172.17.0.0网段来进行请求访问,这样避免了dhcp接收不同的ip导致服务不可用。


docker存储

docker volume ls 查看所有的docker卷

docker inspect [volumename]查询容器的详细内容

奇难杂症


docker本地代理端口直接使用http端口 不要使用混合端口 否则会识别为udp流量来进行处理,我说的是clash

{
  "proxies": {
    "default": {
      "httpProxy": "http://192.168.21.114:7899",
      "httpsProxy": "http://192.168.21.114:7899",
      "noProxy": "localhost,127.0.0.1"
    }
  }
}
~                                                                                
~