我正在设置一个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
这不是我想要的。
答案 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
。