4

我是 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 地址。

我的集群中也使用了法兰绒。

谢谢!


我找到了一种解决方法:

[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

4

2 回答 2

4

我在我的车队环境中使用注册器进行发现。当我启动我的舰队时,我修改了 cloud-config 文件以包括注册器(以及 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}

可以修改您的应用程序来做到这一点。或者,您可以运行自动为您更新 dns 的容器skydns,这样您就有了 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

于 2015-03-13T16:08:20.467 回答
3

根据 Greg 的说法,我使用了 SkyDNS 和 Registrator :

我在我的车队环境中使用注册器进行发现。当我启动我的舰队时,我修改了 cloud-config 文件以包括注册器(以及 etcd、flannel、fleet 等)。注册器驻扎在 docker 上并识别新容器何时启动/终止/停止。Registrator 管理已发现容器的数据库,它以多种方式进行(如 consul、skydns)。我将我的配置为在 skydns 模式下运行。

您可以在下面找到我的工作云配置,请记住我使用的是 CoreOS 607,并且我的测试是在 VMware 上执行的。我的目标是设置 3 台机器来组成一个小型集群,每台机器上运行一个 etcd,就像这样

感谢 Greg 在这个主题上以及与 Vagrant 一起使用的这个 cloud-config 文件,我设法找到了这个解决方案。

我希望它会有所帮助:)


#cloud-config

coreos:
  etcd:
    discovery: https://discovery.etcd.io/4c8c3f9a67048e76e9075c97d9d63c0c
    addr: 192.168.1.13:4001
    peer-addr: 192.168.1.13:7001
  fleet:
    public-ip: 192.168.1.13
  units:
    - name: etcd.service
      command: start
    - name: flanneld.service
      drop-ins:
        - name: 50-network-config.conf
          content: |
            [Service]
            ExecStartPre=/usr/bin/etcdctl set /coreos.com/network/config '{ "Network": "172.16.0.0/16" }'
      command: start
    - name: fleet.service
      command: start
    - name: skydns.service
      enable: false
      content: |
        [Unit]
        Description=Skydns
        After=docker.service
        After=fleet.service
        [Service]
        ExecStartPre=/usr/bin/docker pull skynetservices/skydns
        ExecStart=/usr/bin/env bash -c '/usr/bin/docker run -p 53:53 --name skydns -e ETCD_MACHINES="http://$(ifconfig docker0 | awk \'/\<inet\>/ { print $2}\'):4001" skynetservices/skydns -nameservers="8.8.8.8:53" --addr="0.0.0.0:53"'
        ExecStop=/usr/bin/docker stop skydns
        Restart=always

        [X-Fleet]
        Global=true

        [Install]
        WantedBy=multi-user.target
    - name: registrator.service
      enable: false
      content: |
        [Unit]
        Description=Registrator
        After=docker.service
        After=fleet.service

        [Service]
        ExecStartPre=/usr/bin/docker pull gliderlabs/registrator
        ExecStart=/usr/bin/env bash -c '/usr/bin/docker run --net=host -p 8080:8080 -p 8443:8443 -v /var/run/docker.sock:/tmp/docker.sock --name registrator gliderlabs/registrator skydns2://$(ifconfig docker0 | awk \'/\<inet\>/ { print $2}\'):4001/skydns.local'
        ExecStop=/usr/bin/docker stop registrator
        Restart=always

        [X-Fleet]
        Global=true
    - name: primordial.service
      command: start
      content: |
        [Unit]
        Description=Load and start fleet services
        After=fleet.service
        Requires=fleet.service
        After=etcd.service
        Requires=etcd.service
        After=flanneld.service
        Requires=flanneld.service

        [Service]
        Type=oneshot
        RemainAfterExit=yes
        ExecStartPre=/usr/bin/systemctl stop docker.service
        ExecStartPre=/usr/bin/ifconfig docker0 down
        ExecStartPre=/usr/bin/brctl delbr docker0
        ExecStartPre=/usr/bin/systemctl start docker.service
        ExecStart=/usr/bin/fleetctl start /etc/systemd/system/skydns.service
        ExecStart=/usr/bin/fleetctl start /etc/systemd/system/registrator.service
ssh_authorized_keys:
  - ssh-rsa AAAA....
于 2015-03-26T13:51:50.730 回答