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配置 —> 点击+号添加
注意这里的端口和本地端口是针对你在启动docker时做的端口映射,根据自己的情况进行修改。
2. 在Clion 添加工具链
在设置中的 构建、执行、部署 —> 工具链 —> 点击+号添加
3. 在Clion 添加远程cmake
- 构建、执行、部署
- cmake
- 点击+号添加
- 修改名称为自己需要的名称
- 构建类型选择自己需要的类型
- 工具链选择刚刚创建的工具链
- 其他选项看情况修改
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里配置一下环境
至于怎么找到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.查看、设置构建项
把构建配置选为刚刚设置的配置
6、运行、调试
运行可以看到在生成的目录是远程的目录
调试,调试也正常
上面的远程链接方式没有涉及到本地文件和远程服务器映射,如果需要做文件映射,则还可以采用如下的方式进行配置:
1、打开CLion -> 选择文件 -> 设置 -> 构建、执行、部署 -> 部署 -> 点击加号(添加一个远程配置) -> 设置为SFTP协议(默认)
2、点击SSH配置后三点 -> 输入远程主机(IP)、端口、用户名(root)、密码 -> 点击测试链接(确定是否能成功连接到远程机)
3、连接选项中的根路径和Web服务器URL不用管 -> 点击映射 -> 设置本地路径 -> 设置部署路径
本地路径:本地项目代码的根目录
部署路径:远程项目代码的根目录
4、一开始本地没有项目代码则右键本地项目目录 -> 点击部署 -> 点击下载(将远程代码同步到本地)
5、后面如果在本地修改代码之后需要同步到远程 -> 右键选择部署 -> 点击上传(可以开启自动上传,即本地代码修改之后自动同步到远程)
6、本地使用远程环境编译代码:点击终端 -> 点击下三角 -> 选择远程服务器地址
不过上面这种远程文件映射我觉得麻烦,还是比较喜欢在docker启动时直接利用-v做好文件挂载即可,这里看自己的使用习惯啦!
》配置关联
想要将上面的配置关联起来,其实就是在启动镜像时做好这俩点即可
docker run -it -p xxx:xx -v xxx:xxx image
设置好对应的端口和挂载的文件路径即可。
(3)使用体验
当一切都配置好了,尤其是远程环境,就像正常本地运行脚本一样,这里就不放图啦,今天就记录到这吧!