在 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
。
我正在 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
。