Docker镜像配置
我们使用docker-compose + Dockerfile的方式进行配置,优点在于可移植性强,且修改配置较为方便,无需每次启动时都使用很长的docker run -d —name xxx —port……的命令。
假设你的项目存放于本地文件夹/home/user/projects/,那么你需要创建一个/home/user/projects/.devcontainer/以放置Dockerfile与docker-compose.yml。配置中使用的是相对路径,因而如果有放在其它文件夹的项目,只需要将.devcontainer/拷贝过去即可,无需修改配置文件。
在Dockerfile中,以ubuntu:18.04为基础镜像,首先添加阿里云镜像(不需要的可以去掉),然后安装一些开发中会用到的包,最后添加一个部署用户并赋予sudo权限:
FROM ubuntu:18.04ENV USER=deployENV PASSWD=deployENV WORKDIR=projects# 替换为阿里云镜像,如不需要可以去掉本部分RUN printf '\n\deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse \n\deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse \n\deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse \n\deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse \n\deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse \n\deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse \n\deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse \n\deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse \n\deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse \n\deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse' > /etc/apt/sources.list# 安装开发环境必要的包RUN apt-get update \&& apt-get install -y ssh openssh-server build-essential \gcc g++ gdb gdbserver cmake \# 无需libboost可以去掉下一行libboost-dev \# net-tools 提供了ifconfignet-tools tar rsync \# 无需python3可以去掉下一行python3 python3-pip \sudo git\&& apt-get clean# 添加用户并配置密码RUN useradd -m ${USER} && yes ${PASSWD} | passwd ${USER}# 赋予sudo权限并允许无密码sudoRUN echo ${USER}' ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoersRUN chmod 644 /etc/sudoersCMD ["/usr/sbin/sshd", "-D"]USER ${USER}RUN mkdir -p /home/${USER}/${WORKDIR}/ENV LC_ALL C.UTF-8
接下来是对docker-compose的配置,有几个比较重要的地方在文件中以注释形式标注了出来:
version: "3.4"x-defaults: &defaultrestart: unless-stopped# 使用当前目录的 Dockerfile 来构建 docker 镜像build: .volumes:# 本文件存放于.devcontainer/中,因而此处要把上级目录(源代码目录)挂载到工作目录- ..:/home/deploy/projects/services:projects-dev:<<: *defaultcontainer_name: projects-devhostname: "projects"# 如果在Dockerfile中修改过用户名,此处也要对应修改用户名和工作目录user: deployworking_dir: /home/deploy/projects# 修改安全配置,以运行gdb serversecurity_opt:- seccomp:unconfinedcap_add:- SYS_PTRACE# 开启 ssh 服务,这样 clion 就能通过 ssh 连接进来了# 同时通过 tailf 命令保持 container 不要退出的状态command:bash -c "sudo service ssh restart && tail -f /dev/null"# 此处将容器的22端口映射到主机的2222上,且仅对本机开放ports:- "127.0.0.1:2222:22"
如果是在CLion中使用,Docker配置即可到此结束;如果在VSCode中使用,则还要进行下一步配置,见第3节。
CLion配置
在CLion中,并没有直接连接到Docker开发的功能。尽管CLion提供了Docker插件,但那不是为了这种场景使用的。因此,我们需要使用在Terminal中启动容器,然后使用CLion的远程Toolchains开发。
Terminal中,假定你在/home/user/projects/目录下,运行:
docker-compose -f .devcontainer/docker-compose.yml up -d
可以使用docker ps检查运行状态,只要STATUS一栏显示不是Restarting (1) 21 seconds ago类似的错误即说明成功启动,接下来可以开始使用CLion进行开发。
此处以muduo网络库为例进行编译和测试,假设已经将该项目git clone https://github.com/chenshuo/muduo.git到./muduo/目录。
CLion中需要修改三处配置,位于 Preferences - Build, Execution, Deployment下的:
- Toolchains
- CMake
- Deployment
下面分别进行说明
Toolchains

在此处添加一个配置(无需设为默认),用户名与密码均为deploy,地址为localhost,端口为2222,其余配置均由CLion自动检测。
cmake

如果无需在本地编译,可以直接修改当前配置的Toolchain,使用上一步的配置。如果需要在本地编译、或者连接到多个Remote,就增加对应的配置即可。
Deployment
首先在Connection中配置好连接。注意:不要修改图中两个蓝框,否则CMake会不可用。
其次,添加目录映射,如图所示,你可以直接点远程端的查看目录按钮选择,无须手动输入:
最后,因为我们使用的是目录挂载,因此并不需要由CMake接管文件同步,所以在Excluded Paths中直接将项目文件夹全部排除掉:
这样我们就完成了项目的配置,可以使用CMake进行Build了。同样,也可以在代码中加入断点进行变量监控等操作:

提示:Muduo网络库CMakeFiles.txt部分配置有问题,直接Build可能会出错。本文不涉及这部分的修复工作,因此遇到时可以在CLion右上角的Build config中加入环境变量:MUDUO_BUILD_EXAMPLES=false以跳过出错部分的编译。
