docker系列介绍到这一篇,想要以一次实战案例来进行阐述,于是产生了这篇文章。

(1)简单介绍

       clion作为jetbrains家族一款强劲的ide,多见于c++开发,而docker又是一个环境管理的利器,两者结合起来使用,在实际开发过程中往往可以做到事半功倍的效果,尤其是在一些多环境多版本控制开发中。那具体怎么结合呢,废话不多说,直接上干货。

(2)具体配置

》docker

至于docker的基本安装和使用,这里不再赘述,可以去查我看前面的文章。这里默认拉取的是一个ubuntu环境镜像(默认已经安装gcc g++ cmake这些等),接下来需要安装配置的是ssh,ubuntu下在docker里面安装ssh

apt install openssl openssh-server

然后修改ssh配置允许root登录,在docker容器内,编辑文件/etc/ssh/sshd_config,添加一行PermitRootLogin yes表示ssh允许root登录。

echo "PermitRootLogin yes" >> /etc/ssh/sshd_config # 或者 vim /etc/ssh/sshd_config 并手敲一行PermitRootLogin yes

随后一定要重启ssh服务

service ssh restart

至于在docker容器内,初始化root密码,用于下一步的登录,则具体操作如下,

passwd root

根据提示输入初始密码。然后可以在本地测试链接一下

ssh root@localhost -p  xx  ###容器22端口映射的本地端口

上面的开启方法只能在终端一直开启 状态下使用,一旦终端关闭重新打开就失效,如果想要开机自启动则需要进行下面操作。

      正常我们在linux操作系统内设置服务自启动的方法一般都是使用systemctl。

systemctl enable ssh

但是,一般在docker容器内我们一般不这么干,因为容器内没有systemctl权限……,我们依然还是使用脚本的形式将ssh设为自启,只不过这个的这个脚本和我们使用Dockerfile的脚本不一样。具体步骤如下:

  • 在 /root 目录下新建一个 start_ssh.sh文件,并给予该文件可执行权限。
touch /root/start_ssh.sh  vim /root/start_ssh.sh chmod +x /root/start_ssh.sh

而start_ssh.sh 脚本的内容,如下:

#!/bin/bash   

LOGTIME=$(date "+%Y-%m-%d %H:%M:%S") 
echo "[$LOGTIME] startup run..." >>/root/start_ssh.log 
service ssh start >>/root/start_ssh.log   ###其他服务也可这么实现
  • 将start_ssh.sh脚本添加到启动文件中
vim /root/.bashrc
  •  在 .bashrc 文件末尾加入如下内容:
# startup run 
if [ -f /root/start_ssh.sh ]; then       
    . /root/start_ssh.sh 
fi
  •  保存后,可以source一下看看有没有问题,等下次重启容器的时候,添加的服务也就跟着重启了。

至此docker内的配置完成了。

》clion

对于clion的用户,如果习惯pycharm的使用,相信不会太陌生,这里主要操作如下

1、首先在CLion中添加SSH

在设置中的 工具 —>  SSH配置  —>  点击+号添加

clion连接docker开发 docker clion_clion

注意这里的端口和本地端口是针对你在启动docker时做的端口映射,根据自己的情况进行修改。

2. 在Clion 添加工具链

在设置中的 构建、执行、部署  —>  工具链  —>  点击+号添加

clion连接docker开发 docker clion_clion连接docker开发_02

 3. 在Clion 添加远程cmake

  • 构建、执行、部署 
  • cmake
  • 点击+号添加
  • 修改名称为自己需要的名称
  • 构建类型选择自己需要的类型
  • 工具链选择刚刚创建的工具链
  • 其他选项看情况修改

clion连接docker开发 docker clion_c++_03

 Toolchian选择配置好的远程服务器。如果是cuda编程CMake options需要配置:

-DCMAKE_CUDA_COMPILER:PATH=/usr/local/cuda/bin/nvcc

否则会报“No CMAKE_CUDA_COMPILER could be found.”错误。点击ok确认保存后CLion就会进行连接加载,再次打开Preference可看到Deployment会自动增加部署文件。

在配置基于docker的ros环境时,按照上面的步骤配置完成后,如果还报找不到“catkin”错误,这还需要在clion的cmake里配置一下环境

clion连接docker开发 docker clion_clion连接docker开发_04

至于怎么找到docker里面ros相关的一些环境变量信息,可以运行下面sh脚本,然后复制即可

ros_env="AMENT_PREFIX_PATH CMAKE_PREFIX_PATH COLCON_PREFIX_PATH PKG_CONFIG_PATH PYTHONPATH LD_LIBRARY_PATH PATH ROS_DISTRO ROS_PYTHON_VERSION ROS_LOCALHOST_ONLY ROS_VERSION"
env_string=""
for e in ${ros_env}; do
    env_string+="$e=${!e};"
done
echo "$env_string"

4.重新载入cmake项目

点击主界面上栏的文件中的重新加载cmake项目。

5.查看、设置构建项

把构建配置选为刚刚设置的配置

clion连接docker开发 docker clion_clion_05

 6、运行、调试

运行可以看到在生成的目录是远程的目录

clion连接docker开发 docker clion_clion_06

 调试,调试也正常

clion连接docker开发 docker clion_c++_07

       上面的远程链接方式没有涉及到本地文件和远程服务器映射,如果需要做文件映射,则还可以采用如下的方式进行配置:

1、打开CLion -> 选择文件 -> 设置 -> 构建、执行、部署 -> 部署 -> 点击加号(添加一个远程配置) -> 设置为SFTP协议(默认)

clion连接docker开发 docker clion_服务器_08

 2、点击SSH配置后三点 -> 输入远程主机(IP)、端口、用户名(root)、密码 -> 点击测试链接(确定是否能成功连接到远程机)

clion连接docker开发 docker clion_服务器_09

 3、连接选项中的根路径和Web服务器URL不用管 -> 点击映射 -> 设置本地路径 -> 设置部署路径

本地路径:本地项目代码的根目录

部署路径:远程项目代码的根目录

clion连接docker开发 docker clion_clion_10

 4、一开始本地没有项目代码则右键本地项目目录 -> 点击部署 -> 点击下载(将远程代码同步到本地)

clion连接docker开发 docker clion_clion连接docker开发_11

 5、后面如果在本地修改代码之后需要同步到远程 -> 右键选择部署 -> 点击上传(可以开启自动上传,即本地代码修改之后自动同步到远程)

clion连接docker开发 docker clion_c++_12

 6、本地使用远程环境编译代码:点击终端 -> 点击下三角 -> 选择远程服务器地址

clion连接docker开发 docker clion_clion_13

 不过上面这种远程文件映射我觉得麻烦,还是比较喜欢在docker启动时直接利用-v做好文件挂载即可,这里看自己的使用习惯啦!

》配置关联

想要将上面的配置关联起来,其实就是在启动镜像时做好这俩点即可

docker run -it -p xxx:xx -v xxx:xxx image

设置好对应的端口和挂载的文件路径即可。

(3)使用体验

       当一切都配置好了,尤其是远程环境,就像正常本地运行脚本一样,这里就不放图啦,今天就记录到这吧!