使用主机网络启动 Docker 容器,同时保持通过 SSH 连接到容器的能力?

Mas*_*e36 4 networking docker clion rti-dds

我正在启动本地 Docker 容器作为运行应用程序的环境,并使用 CLion 的远程主机功能来管理工具链。我的应用程序通过各种端口和 IP 地址在特定网络接口上进行通信。

在完美的世界中,我将能够在本地运行我的应用程序,然后通过 CLion 在 Docker 容器中启动一个应用程序并与本地运行的应用程序进行通信。

我知道我可以启动一个 docker 容器,--network=host但这似乎消除了通过 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"]
Run Code Online (Sandbox Code Playgroud)

更新: 使用 CLion 2021.3,您不再需要 ssh 进入 docker 容器。现在支持它作为自己的工具链类型https://blog.jetbrains.com/clion/2021/10/clion-2021-3-eap-new-docker-toolchain/#new_docker_toolchain

Ari*_*rik 6

使用--network=host意味着您的容器将使用托管计算机的端口 22,如果该计算机已运行使用端口 22 的进程,则 SSH 代理将失败。

要进行确认,您可以查看代理的日志文件。

您可以将 SSH 代理配置为在 22 以外的端口(例如 2233)上运行,从而避免端口冲突。在您的 Dockerfile 中添加以下行:

RUN sed -i 's/\(^Port\)/#\1/' /etc/ssh/sshd_config && echo Port 2233 >> /etc/ssh/sshd_config
Run Code Online (Sandbox Code Playgroud)

然后配置 CLion 以使用备用端口连接到容器。