etcd 使用 docker 部署为什么可以使用域名 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
mingge2333
V2EX    程序员

etcd 使用 docker 部署为什么可以使用域名

  •  < href="Javascript:" Onclick="downVoteTopic(927779);" class="vote">
  •   mingge2333 2023-03-28 11:10:22 +08:00 2813 次点击
    这是一个创建于 936 天前的主题,其中的信息可能已经有所发展或是发生改变。

    参考案例:

    docker run -d --name Etcd-server \ --network app-tier \ --publish 2379:2379 \ --publish 2380:2380 \ --env ALLOW_NONE_AUTHENTICATION=yes \ --env ETCD_ADVERTISE_CLIENT_URLS=http://etcd-server:2379 \ bitnami/etcd:latest 

    以及 docker-compose 第 56 行。

    不理解的点有: 1 、域名什么时候映射 ip 的 2 、如果是集群部署,每台机器都使用 http://etcd:2379 作为 url ,那么集群该如何发现服务 ip 地址

    第 1 条附言    2023-03-28 17:57:03 +08:00
    17 条回复    2023-03-29 09:55:10 +08:00
    muxueqz
        1
    muxueqz  
       2023-03-28 11:17:14 +08:00
    docker 根据 name 使用内置的 dns server 自动映射的
    mingge2333
        2
    mingge2333  
    OP
       2023-03-28 11:34:36 +08:00
    @muxueqz 这个不区分大小写的吗
    Twnysta
        3
    Twnysta  
       2023-03-28 12:06:16 +08:00
    http://etcd-server:2379 这个不是域名是服务名啊
    DiffView
        4
    DiffView  
       2023-03-28 13:41:28 +08:00
    Docker 可以使用 service name 作为类似于域名解析的原理是 Docker 内置了一个 DNS 服务器,它可以为 Docker 网络中的每个容器提供服务发现和名称解析的功能。在 Docker 网络中,每个容器都可以通过其名称来访问其他容器,就像它们在同一个网络中的计算机一样。

    当 Docker 容器启动时,它会自动注册其服务名和 IP 地址到 Docker 的内置 DNS 服务器中。这意味着其他容器可以通过服务名来解析并访问该容器的服务。Docker 的内置 DNS 服务器会自动将服务名解析为相应容器的 IP 地址,从而实现容器之间的服务发现和通信。

    此外,Docker 还支持自定义网络,并允许用户指定自己的 DNS 服务器。这使得用户可以在 Docker 网络中使用自己的域名解析方案。

    总之,Docker 的服务发现和名称解析功能是通过内置的 DNS 服务器和容器名称来实现的。通过这种方式,Docker 使得容器之间的通信更加方便和简单。
    yinmin
        6
    yinmin  
       2023-03-28 16:11:27 +08:00
    docker 部署一个系统,包含多个容器。我推荐:创建一个虚拟内网,然后每个容器都配置固定 IP 地址,不需要 docker 解析 DNS ,系统更稳定。

    例如,nginx 容器使用域名(容器名)proxy 后端程序容器。如果 nginx 先启动,后端程序容器后启动,nginx 会发现域名无法解析而报错,如果都使用 ip 地址,就没这个问题了。
    fairless
        7
    fairless  
       2023-03-28 16:26:20 +08:00
    使用自定义网络,荣期间就可以直接使用服务名相互访问了
    muxueqz
        8
    muxueqz  
       2023-03-28 16:45:22 +08:00
    @mingge2333 DNS A 记录不区分大小写,你可以试着解析 G.CN G.cn g.cn 看看
    mingge2333
        9
    mingge2333  
    OP
       2023-03-28 17:28:45 +08:00
    @muxueqz 谢谢大佬
    mingge2333
        10
    mingge2333  
    OP
       2023-03-28 17:45:41 +08:00
    @yinmin 很有用,那请问 etcd 使用的是容器名,示例在这,56 行 https://github.com/apache/apisix-docker/blob/master/example/docker-compose.yml ,这个目的是为了集群容器间方便查找吧,想确认下 http://etcd:2379 是容器名么,因为容器名是好像是随机生成的。参考这个: https://agarwalrounak.medium.com/default-container-names-in-docker-15bdbf56b539#:~:text=When%20a%20container%20is%20created,assigns%20the%20container%20a%20name.
    lovelylain
        11
    lovelylain  
       2023-03-28 18:21:20 +08:00 via Android   1
    @mingge2333 我记得是默认 bridge 不支持这样干,使用自定义的网络就可以用容器名当域名
    archean
        12
    archean  
       2023-03-28 18:24:53 +08:00
    @yinmin 个人觉得解决这个问题写个 depends on 就行了,固定 IP 地址徒增运维成本,请教固定 IP 地址还有额外好处吗?
    julyclyde
        13
    julyclyde  
       2023-03-28 21:35:14 +08:00
    没听说过 docker 内置 dns 服务器啊

    应该是 hosts 的吧?
    yinmin
        14
    yinmin  
       2023-03-29 00:35:29 +08:00
    @archean 的确可以通过 depends on(link)方式指定容器的启动次序,但是如果存在嵌套引用 (a->b, b->c, c->a),就没办法写 link 关系了。使用 ip 地址更接近于物理机的部署方式,以前我们使用域名(容器名)部署,但运行一段时间后,我们重新规划了虚拟网络,并把域名都改成固定 ip 地址访问了,这样更稳定些吧。
    yinmin
        15
    yinmin  
       2023-03-29 00:53:04 +08:00
    @mingge2333 容器名是在 yaml 里通过 container_name: <name>指定的,只有未指定名称时,docker 才随机生成。我看了 docker-compose.yml ,在这个示例里没有设置 container_name ,etcd 应该是 service name 。

    设定 container_name 的好处是:查看容器列表时,知道每个容器都是啥内容。
    不设定 container_name 的好处是:如果你要启用多套容器组,不会有名称冲突。

    我测试了,通过 service name 和 container name 都能做 DNS 解析。
    yinmin
        16
    yinmin  
       2023-03-29 01:00:55 +08:00   1
    @mingge2333 我发现 https://github.com/apache/apisix-docker/blob/master/example/docker-compose.yml 的 port 参数可能写的有问题。内网之间容器是可以直接访问的,不需要 port 抛出端口。

    这个 yml 示例里,只需要将给外部访问的 web 容器端口通过 port 抛出即可,内部使用的容器不需要 port ,否则会有安全隐患的。
    yinmin
        17
    yinmin  
       2023-03-29 09:55:10 +08:00 via iPhone   1
    在业务系统部署中,例如有 5 个容器:nginx 容器、web 业务系统容器、管理平台容器、mysql 容器、redis 容器。

    web 业务系统容器和管理平台容器会经常更新,在更新管理平台容器时,肯定不希望影响 web 业务系统容器。redis 容器通常也不重启。

    因此,5 个容器通常分多个 yaml 文件分别管理的,如果容器之间使用域名方式访问,可能会出现问题(先启动的容器没法解析后启动容器的 ip 地址),容器使用固定 ip 地址稳定性更佳。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2510 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 04:36 PVG 12:36 LAX 21:36 JFK 00:36
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86