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

时间:2016-02-02 09:32:12

标签: docker docker-compose salt-stack

我正在设置一个salt-master以在Docker容器中运行。我使用docker-compose构建并运行容器。当我启动容器时,我得到:

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上运行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

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

2 个答案:

答案 0 :(得分:0)

我不认为在您的情况下需要将数据作为单独的卷。您可以按照以下方式更改您的撰写文件,然后开始使用

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

有了这个,你就能明白什么是正确的,什么是不对的,因此你可以采取必要的行动。

答案 1 :(得分:0)

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

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

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

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

由于端口4505已映射到Docker主机,现在可以通过192.168.99.100:4505访问此服务,这意味着salt-minions应该能够通过此地址联系salt-master,方法是设置{{1在master: 192.168.99.100关于奴才。

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