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权限:

  1. FROM ubuntu:18.04
  2. ENV USER=deploy
  3. ENV PASSWD=deploy
  4. ENV WORKDIR=projects
  5. # 替换为阿里云镜像,如不需要可以去掉本部分
  6. RUN printf '\n\
  7. deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse \n\
  8. deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse \n\
  9. deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse \n\
  10. deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse \n\
  11. deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse \n\
  12. deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse \n\
  13. deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse \n\
  14. deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse \n\
  15. deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse \n\
  16. deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse' > /etc/apt/sources.list
  17. # 安装开发环境必要的包
  18. RUN apt-get update \
  19. && apt-get install -y ssh openssh-server build-essential \
  20. gcc g++ gdb gdbserver cmake \
  21. # 无需libboost可以去掉下一行
  22. libboost-dev \
  23. # net-tools 提供了ifconfig
  24. net-tools tar rsync \
  25. # 无需python3可以去掉下一行
  26. python3 python3-pip \
  27. sudo git\
  28. && apt-get clean
  29. # 添加用户并配置密码
  30. RUN useradd -m ${USER} && yes ${PASSWD} | passwd ${USER}
  31. # 赋予sudo权限并允许无密码sudo
  32. RUN echo ${USER}' ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
  33. RUN chmod 644 /etc/sudoers
  34. CMD ["/usr/sbin/sshd", "-D"]
  35. USER ${USER}
  36. RUN mkdir -p /home/${USER}/${WORKDIR}/
  37. ENV LC_ALL C.UTF-8

接下来是对docker-compose的配置,有几个比较重要的地方在文件中以注释形式标注了出来:

  1. version: "3.4"
  2. x-defaults: &default
  3. restart: unless-stopped
  4. # 使用当前目录的 Dockerfile 来构建 docker 镜像
  5. build: .
  6. volumes:
  7. # 本文件存放于.devcontainer/中,因而此处要把上级目录(源代码目录)挂载到工作目录
  8. - ..:/home/deploy/projects/
  9. services:
  10. projects-dev:
  11. <<: *default
  12. container_name: projects-dev
  13. hostname: "projects"
  14. # 如果在Dockerfile中修改过用户名,此处也要对应修改用户名和工作目录
  15. user: deploy
  16. working_dir: /home/deploy/projects
  17. # 修改安全配置,以运行gdb server
  18. security_opt:
  19. - seccomp:unconfined
  20. cap_add:
  21. - SYS_PTRACE
  22. # 开启 ssh 服务,这样 clion 就能通过 ssh 连接进来了
  23. # 同时通过 tailf 命令保持 container 不要退出的状态
  24. command:
  25. bash -c "sudo service ssh restart && tail -f /dev/null"
  26. # 此处将容器的22端口映射到主机的2222上,且仅对本机开放
  27. ports:
  28. - "127.0.0.1:2222:22"

如果是在CLion中使用,Docker配置即可到此结束;如果在VSCode中使用,则还要进行下一步配置,见第3节。

CLion配置

在CLion中,并没有直接连接到Docker开发的功能。尽管CLion提供了Docker插件,但那不是为了这种场景使用的。因此,我们需要使用在Terminal中启动容器,然后使用CLion的远程Toolchains开发。
Terminal中,假定你在/home/user/projects/目录下,运行:

  1. 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下的:

  1. Toolchains
  2. CMake
  3. Deployment

下面分别进行说明

Toolchains

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

cmake

image.png
如果无需在本地编译,可以直接修改当前配置的Toolchain,使用上一步的配置。如果需要在本地编译、或者连接到多个Remote,就增加对应的配置即可。

Deployment

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

image.png

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