如何在docker-compose容器内执行Docker命令获取同网络容器IP?
问题与解决方案
我部署了va-server、db、api-server三个容器,它们均处于同一Docker网络中。希望在容器内执行Docker命令,获取其他同网络容器的IP地址。
我的docker-compose配置文件如下:
version: "2.3" services: va-server: container_name: va_server image: nitinroxx/facesense:amd64_2022.11.28 #facesense:alpha runtime: nvidia restart: always mem_limit: 4G networks: - perimeter-network db: container_name: mongodb image: mongo:latest ports: - "27017:27017" restart: always volumes: - ./facesense_db:/data/db command: [--auth] networks: - perimeter-network api-server: container_name: api_server image: nitinroxx/facesense:api_amd64_2022.11.28 ports: - "80:80" - "465:465" restart: always networks: - perimeter-network networks: perimeter-network: driver: bridge ipam: config: - gateway: 10.16.239.1 subnet: 10.16.239.0/24
已在容器内安装Docker,但出现如下权限错误:docker.errors.DockerException: 获取服务器API版本时出错: ('连接已中止。', PermissionError(13, '权限被拒绝'))
解决权限错误的方法
1. 挂载Docker套接字到容器
容器内的Docker客户端需要连接宿主机的Docker守护进程,通过挂载宿主机的/var/run/docker.sock到容器内相同路径即可实现。修改docker-compose中需要执行Docker命令的服务配置,添加卷挂载:
# 以api-server为例,其他服务同理 api-server: container_name: api_server image: nitinroxx/facesense:api_amd64_2022.11.28 ports: - "80:80" - "465:465" restart: always volumes: - /var/run/docker.sock:/var/run/docker.sock # 添加该行 networks: - perimeter-network
2. 调整容器内用户权限
容器内执行命令的用户需要拥有访问/var/run/docker.sock的权限:
- 方法一:启动容器时指定宿主机docker组的ID(先在宿主机执行
getent group docker | cut -d: -f3获取组ID):api-server: # 其他配置... user: "你的用户ID:获取到的docker组ID" - 方法二:进入容器后将当前用户加入docker组:
sudo usermod -aG docker $USER
更安全的替代方案:无需Docker命令获取容器IP
Docker网络自带DNS解析功能,直接通过容器名称即可访问,也可以用以下命令获取IP,无需在容器内安装Docker:
- 使用
nslookup查询:nslookup va_server nslookup mongodb - 使用
getent hosts查询:getent hosts va_server
这种方式避免了暴露Docker套接字的安全风险,更推荐使用。
内容的提问来源于stack exchange,提问作者Nitin Ashutosh
相关产品推荐
相关产品推荐

