docker - 如何获取在一台机器上启动的设备的 IP 地址并在另一台设备中使用它?

标签 docker coreos etcd

我是 CoreOS 和 Docker 的新手,我遇到了舰队问题。

我有一个启动 POSTGRES 容器的标准单元,我想知道启动该单元的计算机的 IP 地址。 我实际上有一个由 3 台机器组成的集群,并且 POSTGRES 单元并不总是在同一台机器上启动(这意味着 IP 不是静态的)。

当我启动另一个需要 POSTGRES 的单元(见下文)时,我需要它。

我目前正在使用名为 BindsTo 的单位参数:

[Unit]
Description=Test
After=docker.service
After=postgres@1.service

Requires=docker.service
Requires=postgres@1.service

BindsTo=postgres@1.service

[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill test%i
ExecStartPre=-/usr/bin/docker rm test%i
ExecStart=/usr/bin/docker run -rm --name test%i -e HOST="HereThePostgresIP" sryther/test
ExecStop=/usr/bin/docker stop test%i

注意:此单元不需要与 POSTGRES 单元在同一台计算机上启动。

我尝试使用 %H 变量,但它返回主机名而不是机器的 IP 地址。

我的集群中也使用了 Flannel。

谢谢!

<小时/>

我找到了解决方法:

[Unit]
Description=Test
After=docker.service

Requires=docker.service

[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill test%i
ExecStartPre=-/usr/bin/docker rm test%i

ExecStart=/usr/bin/docker run -rm --name test%i --link postgres1:postgres sryther/test
ExecStop=/usr/bin/docker stop test%i

并且IP地址在容器环境中设置为POSTGRES_PORT_5432_TCP_ADDR

最佳答案

我正在使用registrator用于在我的车队环境中进行发现。当我启动我的舰队时,我修改云配置文件以包含注册器(以及 etcd、flannel、fleet 等)。注册器驻留在 docker 上并识别新容器何时启动/终止/停止。 Registrator 管理已发现容器的数据库,它有多种风格(如 consul、skydns)。我将我的配置为在 skydns 模式下运行。所以,这是我用一个单元文件启动我的 postgres 服务器的一个例子,我不知道它会落在哪里:

[Unit]
Description=Postgres
After=docker.service
Requires=flanneld.service docker.service etcd.service

[Service]
Restart=always
ExecStartPre=-/usr/bin/env docker kill postgresql
ExecStartPre=-/usr/bin/env docker rm postgresql
ExecStartPre=/usr/bin/env docker pull sameersbn/postgresql:9.4
ExecStart=/usr/bin/docker run --name postgresql sameersbn/postgresql:9.4
ExecStop=-/usr/bin/docker stop postgresql

当 postgres 启动时,我会使用 postgres 条目更新 etcd:

/skydns/net/tacodata/postgresql/aup1:postgresql:5432

如果我拿到那个,我';;查看ip和端口:

$ etcdctl get /skydns/net/tacodata/postgresql/aup1:postgresql:5432
{"host":"10.1.43.5","port":5432}

可以修改您的应用程序来做到这一点。或者,您可以运行容器 skydns它会自动为您更新 dns,因此您有一条 SRV 记录和一条 A 记录。在我的安装中,我使用一个名为 tacodata.net 的测试域,因此,在 postgresql 出现后,我有 dns 记录!

root@f7e403be967a:/# host -t srv postgresql.tacodata.net 10.1.45.1
Using domain server:
Name: 10.1.45.1
Address: 10.1.45.1#53
Aliases: 

postgresql.tacodata.net has SRV record 10 100 5432
aup1:postgresql:5432.postgresql.tacodata.net.

当我启动依赖应用程序时,我让它们需要 postgresql.service,然后我只需使用 postgresql.tacodata.net 将 IP 地址引用到应用程序。

-g

关于docker - 如何获取在一台机器上启动的设备的 IP 地址并在另一台设备中使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29033884/

相关文章:

Dockerfile:理解 VOLUME 指令

java - Alpine Linux - 未找到 javac

django - Docker-compose 添加 Postgres 密码

docker - 在OS(CoreOS)重新启动时,Docker启动多个容器

ssl - 如何修复etcd集群 "error "tls : first record does not look like a TLS handshake""

windows - 是否可以将 kubernetes 作为 docker 容器运行?

kubernetes - 存储在 GKE "etcd"中的信息是否加密?

Docker如何修改现有图像

coreos - 无法为 vethXXXXX : No such file or directory 生成永久 MAC 地址

amazon-web-services - 如何使用 boto3 指定 core-os ec2 实例的根卷大小?