3

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

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

我知道我可以启动一个 docker 容器,--network=host但这似乎消除了 SSH 进入 docker 容器的能力,这是使用 CLion 和 docker 的先决条件。有没有办法同时保持两者?使用主机网络但也启用 ssh'ing 到 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

4

1 回答 1

2

Using--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

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

于 2020-06-17T07:57:42.293 回答