使用主机网络启动 Docker 容器,同时保持通过 SSH 进入容器的能力?
Start Docker container with host network while maintaining the ability to SSH into the container?
我正在启动本地 docker 容器作为 运行 我的应用程序的环境,并且我使用 CLion 的远程主机功能来管理工具链。我的应用程序通过各种端口和 IP 地址在特定网络接口上进行通信。
在一个完美的世界中,我将能够在本地 运行 我的应用程序,然后还可以通过 CLion 在 docker 容器中启动一个应用程序并与本地 运行ning 应用程序通信。
我知道我可以使用 --network=host
启动一个 docker 容器,但这似乎移除了通过 SSH 进入 docker 容器的能力,这是使用 CLion 和 docker。有没有办法同时保持两者?使用主机网络,但也启用 ssh 进入 docker 容器?
我的 Dockerfile 中配置 SSH 代理的片段
########################################################
# Remote debugging and login in
########################################################
RUN mkdir /var/run/sshd
RUN echo 'root:root' | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile
# 22 for ssh server. 7777 for gdb server.
EXPOSE 22 7777
RUN useradd -ms /bin/bash debugger
RUN echo 'debugger:pwd' | chpasswd
CMD ["/usr/sbin/sshd", "-D"]
更新:
使用 CLion 2021.3,您不再需要通过 ssh 进入 docker 容器。它现在作为自己的工具链类型得到支持 https://blog.jetbrains.com/clion/2021/10/clion-2021-3-eap-new-docker-toolchain/#new_docker_toolchain
使用 --network=host
意味着您的容器将使用主机的端口 22,如果主机已经 运行 是一个使用端口 22 的进程,SSH 代理将失败。
要确认,您可以查看代理的日志文件。
您可以将 SSH 代理配置为 运行 与 22 不同的端口(例如 2233),从而避免端口冲突。在您的 Dockerfile 中添加以下行:
RUN sed -i 's/\(^Port\)/#/' /etc/ssh/sshd_config && echo Port 2233 >> /etc/ssh/sshd_config
然后将 CLion 配置为使用备用端口连接到容器。
我正在启动本地 docker 容器作为 运行 我的应用程序的环境,并且我使用 CLion 的远程主机功能来管理工具链。我的应用程序通过各种端口和 IP 地址在特定网络接口上进行通信。
在一个完美的世界中,我将能够在本地 运行 我的应用程序,然后还可以通过 CLion 在 docker 容器中启动一个应用程序并与本地 运行ning 应用程序通信。
我知道我可以使用 --network=host
启动一个 docker 容器,但这似乎移除了通过 SSH 进入 docker 容器的能力,这是使用 CLion 和 docker。有没有办法同时保持两者?使用主机网络,但也启用 ssh 进入 docker 容器?
我的 Dockerfile 中配置 SSH 代理的片段
########################################################
# Remote debugging and login in
########################################################
RUN mkdir /var/run/sshd
RUN echo 'root:root' | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile
# 22 for ssh server. 7777 for gdb server.
EXPOSE 22 7777
RUN useradd -ms /bin/bash debugger
RUN echo 'debugger:pwd' | chpasswd
CMD ["/usr/sbin/sshd", "-D"]
更新: 使用 CLion 2021.3,您不再需要通过 ssh 进入 docker 容器。它现在作为自己的工具链类型得到支持 https://blog.jetbrains.com/clion/2021/10/clion-2021-3-eap-new-docker-toolchain/#new_docker_toolchain
使用 --network=host
意味着您的容器将使用主机的端口 22,如果主机已经 运行 是一个使用端口 22 的进程,SSH 代理将失败。
要确认,您可以查看代理的日志文件。
您可以将 SSH 代理配置为 运行 与 22 不同的端口(例如 2233),从而避免端口冲突。在您的 Dockerfile 中添加以下行:
RUN sed -i 's/\(^Port\)/#/' /etc/ssh/sshd_config && echo Port 2233 >> /etc/ssh/sshd_config
然后将 CLion 配置为使用备用端口连接到容器。