Docker Compose容器间通信故障:无法解析主机名mysshserver
问题:Docker Compose容器无法解析服务名称
mysshserver 执行ssh命令时出现如下错误:
appuser@54e703cf6eb6:/app$ ssh test@mysshserver ssh: Could not resolve hostname mysshserver: Name or service not known
已通过docker compose up --build mysshserver -d启动mysshserver服务,相关配置文件及容器网络信息如下:
Docker Compose文件
version: '3.9' services: mysshserver: image: mysshserver build: dockerfile: ssh/Dockerfile ports: - "22:22" myapp: image: myapp build: dockerfile: app/Dockerfile
ssh Dockerfile
FROM ubuntu:latest COPY shared/ssh-keys/id_rsa.pub /keys/ # Update package list and install [openssh-server, sudo] RUN apt update && \ apt install openssh-server sudo -y && \ # Configure user test with password test useradd -rm -d /home/test -s /bin/bash -g root -G sudo -u 1000 test && \ echo 'test:test' | chpasswd && \ # Add ssh key mkdir -p /home/test/.ssh/ && \ chmod 0700 /home/test/.ssh && \ touch /home/test/.ssh/authorized_keys && \ chmod 600 /home/test/.ssh/authorized_keys && \ cat /keys/id_rsa.pub >> /home/test/.ssh/authorized_keys && \ # Start ssh service ssh start EXPOSE 22 CMD ["/usr/sbin/sshd","-D"]
app Dockerfile
FROM ubuntu:latest # Keeps Python from generating .pyc files in the container ENV PYTHONDONTWRITEBYTECODE=1 # Turns off buffering for easier container logging ENV PYTHONUNBUFFERED=1 RUN apt update && \ apt install -y openssh-client python3-pip python3 # Install pip requirements COPY app/requirements.txt . RUN pip install -r requirements.txt WORKDIR /app COPY app /app # Creates a non-root user with an explicit UID and adds permission to access the /app folder RUN adduser --home /home/appuser -u 5678 --disabled-password --gecos "" appuser && \ chown -R appuser /app && \ mkdir -p /home/appuser/.ssh # Setup ssh public key COPY shared/ssh-keys/id_rsa /home/appuser/.ssh USER appuser CMD ["python3", "app.py"]
容器inspect网络信息
"Networks": { "codespaces-blank_default": { "IPAMConfig": null, "Links": null, "Aliases": [ "codespaces-blank-mysshserver-1", "mysshserver", "624f5d61df83" ], "NetworkID": "6d6278f57d215ab3d28fea84d44957e43d480b6b262e8d1f6323ff38becaa852", "EndpointID": "9160e6bc48689fdfb36bbdf614913121a0528d93a1dfe5a1e6d60e75fbb4082b", "Gateway": "172.26.0.1", "IPAddress": "172.26.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:1a:00:02", "DriverOpts": null } }
排查与解决方法
确认容器是否在同一网络
执行以下命令检查myapp容器的网络归属:docker inspect myapp --format '{{.NetworkSettings.Networks}}'如果
myapp不在codespaces-blank_default网络,停止容器后用docker compose up myapp -d启动,Docker Compose会自动将服务加入默认网络。检查DNS配置
进入myapp容器查看DNS配置文件:docker exec -it myapp cat /etc/resolv.conf确认是否包含Docker DNS服务器(通常是容器网关地址,比如
172.26.0.1)。如果配置异常,重启myapp容器即可自动修复。用IP测试连通性
在myapp容器内直接pingmysshserver的IP:ping 172.26.0.2若能ping通但无法解析名称,说明是DNS解析问题;若ping不通,检查
mysshserver容器是否正常运行,或是否有防火墙规则拦截22端口。调整服务启动顺序
在Docker Compose中给myapp添加depends_on,确保mysshserver先启动:services: myapp: # ...其他配置 depends_on: - mysshserver若需要等待
mysshserver服务完全就绪,可添加健康检查:mysshserver: # ...其他配置 healthcheck: test: ["CMD-SHELL", "ssh -o ConnectTimeout=1 test@localhost echo ok"] interval: 5s timeout: 2s retries: 3 myapp: depends_on: mysshserver: condition: service_healthy重置Docker网络
若短名称解析存在临时问题,尝试用完整容器名称codespaces-blank-mysshserver-1测试,若能解析则重置网络:docker compose down docker network prune docker compose up -d
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

