如何通过名称对运行中的Docker容器执行ping操作及SSH连接
Docker容器SSH访问配置及构建报错解决方案
一、Dockerfile构建报错修复
报错原因
invoke-rc.d报错:Docker镜像构建阶段无运行中的systemd环境,使用systemctl enable sshd命令会执行失败- 符号链接层级过多报错:基础镜像systemd相关配置存在循环链接,安装openssh-server时触发systemd初始化逻辑导致报错
修复后的Dockerfile对应片段
COPY launchpad.key /tmp/launchpad.key RUN apt-get update && \ apt-get install -y software-properties-common && \ # 安装ssh服务,不触发systemd操作 apt-get install -y openssh-client openssh-server && \ # 手动配置sshd,允许密码登录,若用公钥登录可跳过该步,自行把公钥放入对应用户的~/.ssh/authorized_keys文件即可 sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && \ sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config && \ # 不需要systemctl enable,容器启动时手动启动sshd即可 apt-key add /tmp/launchpad.key && \ add-apt-repository -y ppa:git-core/ppa && apt-get update && \ apt-get install -y git libxt-dev libxtst6 libnss3 libnspr4 \ libgbm-dev libxss-dev libasound2 libatk-bridge2.0-0 \ libcanberra-gtk-module libcanberra-gtk3-module valgrind sudo \ libx11-xcb-dev && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* && \ rm -rf /tmp/* RUN groupadd --system ${UNAME} --gid ${UID} && \ useradd --uid ${UID} --system --gid ${UNAME} --home-dir /home/${UNAME} --create-home --comment "Docker image user" ${UNAME} && \ chown -R ${UNAME}:${UNAME} /home/${UNAME} && \ usermod -aG sudo ${UNAME} && \ echo "${UNAME} ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/${UNAME} && \ # 给用户设置SSH登录密码,可自行替换为自定义密码 echo "${UNAME}:your_custom_password" | chpasswd COPY --from=tool_base ${TOOL_DIR} ${TOOL_DIR} # 修正原有语法错误,补全变量符号$ USER ${UNAME}
容器启动命令修正
原有启动命令同时配置了--net host和-p 127.0.0.1:2222:22,二者存在冲突,host网络模式下端口映射规则不生效,根据需求二选一即可:
- 若使用桥接网络:删除
--net host参数,保留端口映射,容器内22端口会映射到宿主机127.0.0.1的2222端口 - 若使用host网络:删除端口映射参数,容器sshd的22端口会直接占用宿主机的22端口
容器启动后手动执行sudo service ssh start即可启动sshd服务,也可以将该命令放进容器启动脚本中实现自动执行。
二、问题解答
1. 如何对该Docker容器执行ping操作
- 桥接网络模式:执行
docker inspect my_docker | grep IPAddress获取容器IP,直接ping该IP即可 - host网络模式:容器和宿主机共享网络栈,直接ping宿主机IP即可
2. 如何通过SSH连接到该Docker容器
- 桥接网络模式:执行
ssh ${UNAME}@127.0.0.1 -p 2222,输入之前设置的密码即可登录 - host网络模式:执行
ssh ${UNAME}@127.0.0.1 -p 22即可登录
3. 如何从宿主机之外的其他电脑通过SSH连接到该Docker容器
- 桥接网络模式:启动容器时将端口映射规则改为
-p 0.0.0.0:2222:22,放开宿主机防火墙的2222端口入站规则,外部设备执行ssh ${UNAME}@宿主机局域网/公网IP -p 2222即可 - host网络模式:放开宿主机防火墙22端口入站规则,外部设备执行
ssh ${UNAME}@宿主机局域网/公网IP -p 22即可
内容的提问来源于stack exchange,提问作者Gulzar
相关产品推荐
相关产品推荐

