在 Docker 容器中设置 salt-master:端口不可用于绑定错误

Setting up salt-master in Docker container: The ports are not available to bind error

我正在 Docker container. I'm using docker-compose 中设置一个 salt-master 到 运行 来构建和 运行 容器。当我启动容器时,我得到:

salt_master       | [WARNING ] Unable to bind socket, error: [Errno 99] Cannot assign requested address
salt_master       | The ports are not available to bind
salt_master exited with code 4

– 知道为什么这个端口不能绑定,我该如何解决?


我将以下设置为 /etc/salt/master:

interface: 192.168.99.100

...因为这是我 docker-machine 的 IP(我在 OS X 上 运行ning Docker Toolbox):

docker-machine ip default
> 192.168.99.100

我的 Dockerfile 的内容:

FROM centos:7

RUN rpm --import https://repo.saltstack.com/yum/redhat/7/x86_64/latest/SALTSTACK-GPG-KEY.pub

RUN touch /etc/yum.repos.d/saltstack.repo
RUN echo "[saltstack-repo]" >> /etc/yum.repos.d/saltstack.repo
RUN echo "name=SaltStack repo for RHEL/CentOS $releasever" >> /etc/yum.repos.d/saltstack.repo
RUN echo "baseurl=https://repo.saltstack.com/yum/redhat/$releasever/$basearch/latest" >> /etc/yum.repos.d/saltstack.repo
RUN echo "enabled=1" >> /etc/yum.repos.d/saltstack.repo
RUN echo "gpgcheck=1" >> /etc/yum.repos.d/saltstack.repo
RUN echo "gpgkey=https://repo.saltstack.com/yum/redhat/$releasever/$basearch/latest/SALTSTACK-GPG-KEY.pub" >> /etc/yum.repos.d/saltstack.repo

RUN yum clean expire-cache
RUN yum update -y

RUN yum install -y virt-what
RUN yum install -y salt-master salt-minion salt-ssh salt-syndic salt-cloud


EXPOSE 4505
EXPOSE 4506

docker-compose.yml

的内容
image:  
  build: salt
  container_name: salt_master_image

master:
  image: saltmaster_image
  container_name: salt_master
  hostname: salt-master
  ports:
    - "4505:4505"
    - "4506:4506"
  volumes:
    - ./salt/assets/etc/salt:/etc/salt
    - ./salt/assets/var/cache/salt:/var/cache/salt
    - ./salt/assets/var/logs/salt:/var/logs/salt
    - ./salt/assets/srv/salt:/srv/salt
  command: /usr/bin/salt-master --log-file=/var/logs/salt/salt-master.log --log-file-level=debug

为了构建和运行我执行:

docker-compose build
docker-compose up

如果我从 /etc/salt/master 中省略 interface: 192.168.99.100,我就不会收到这些错误。但随后日志显示 Starting the Salt Publisher on tcp://0.0.0.0:4505 这不是我想要的。

在您的情况下,我认为没有必要将数据作为单独的卷。您能否按如下方式更改您的撰写文件并试一试

image:  
  build: salt
  container_name: salt_master_image

master:
  image: salt_master_image
  container_name: salt_master
  hostname: salt-master
  restart: always
  ports:
    - "4505:4505"
    - "4506:4506"
  volumes:
    - ./salt/assets/etc/salt:/etc/salt
    - ./salt/assets/var/cache/salt:/var/cache/salt
    - ./salt/assets/var/logs/salt:/var/logs/salt
    - ./salt/assets/srv/salt:/srv/salt
  command: /usr/bin/salt-master --log-file=/var/logs/salt/salt-master.log --log-file-level=debug

编辑了更多细节: 我建议您最好以交互方式连接到容器,看看容器内部发生了什么。要以交互方式启动 docker 容器,您应该使用以下命令:

docker run -it --name salt_master -p 4505:4505 -p 4506:4506 -v ./salt/assets/etc/salt:/etc/salt -v ./salt/assets/var/cache/salt:/var/cache/salt -v ./salt/assets/var/logs/salt:/var/logs/salt -v ./salt/assets/srv/salt:/srv/salt salt_master_image /bin/bash

通过上面的命令,你会登录到容器的bash shell,然后你可以手动执行命令:

/usr/bin/salt-master --log-file=/var/logs/salt/salt-master.log --log-file-level=debug

有了这个,您可以了解什么是正确的,什么是错误的,并相应地采取必要的行动。

容器的 IP 地址不是 192.168.99.100。这是 Docker 主机的 IP 地址。

容器的IP地址可以通过检查运行容器获得:docker inspect salt_master | grep IPAddress。这表明容器的 IP 地址可以是例如172.17.0.2.

/etc/salt/master中定义interface 172.17.0.2时,服务启动没有错误,在日志中可以找到以下内容:

Starting the Salt Publisher on tcp://172.17.0.2:4505

由于端口 4505 被映射到 Docker 主机,现在可以通过 192.168.99.100:4505 访问此服务,这意味着 salt-minions 应该能够通过此地址联系 salt-master ,通过在小兵的 /etc/salt/minion 中设置 master: 192.168.99.100

编辑:由于容器的 IP 地址必然会发生变化,因此假设它的 IP 地址将始终为例如是不安全的。 172.17.0.2相反,根据@Phani 的建议,使用 interface: 172.0.0.1 会更好。 – 事实证明这不起作用,而是使用 interface: 0.0.0.0