构建镜像

  1. 编写Dockerfile

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    # 1. 基础系统
    FROM ubuntu:22.04

    # 2. 换国内源 + 装依赖(如果公司内网有 apt 代理,把 sed 行删掉即可)
    RUN sed -i 's@http://.*.ubuntu.com@http://mirrors.aliyun.com@g' /etc/apt/sources.list && \
    apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
    # 编译工具链
    gcc g++ clang make cmake ninja-build gdb \
    # 常用库
    libboost-all-dev libssl-dev libcurl4-openssl-dev \
    # SSH 服务
    openssh-server \
    # 其他小工具
    git vim rsync \
    && rm -rf /var/lib/apt/lists/*

    # 3. 配置 SSH:root 密码 123456,允许 root 登录,加快连接
    RUN echo 'root:123456' | chpasswd && \
    sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && \
    sed -i 's@#PasswordAuthentication yes@PasswordAuthentication yes@' /etc/ssh/sshd_config

    # 4. 让 bash 自动补全忽略大小写(仅 root 用户)
    RUN echo 'set completion-ignore-case on' >> /root/.inputrc

    # 5. 工作目录
    WORKDIR /workspace
    RUN chmod 777 /workspace

    # 6. 暴露端口 & 启动脚本
    EXPOSE 22
    COPY entrypoint.sh /entrypoint.sh
    RUN chmod +x /entrypoint.sh
    CMD ["/entrypoint.sh"]
  2. 编写一个sh脚本,命名为entrypoint.sh

    1
    2
    3
    4
    5
    #!/bin/bash
    # 首次启动生成 host key,避免 ssh 客户端报警
    ssh-keygen -A
    # 前台跑 sshd,容器才不会退出
    exec /usr/sbin/sshd -D
  3. 构建镜像

    1
    2
    # 使用当前目录下的Dockerfile构建镜像,命名为cpp-dev-ubuntu:latest
    docker build -t cpp-linux-amd64 .

启动容器

  1. 启动容器

    1
    docker run -it -p 2222:22 -v C:\Users\RedTeamer\docker-volu\cpp-dev-ubuntu:/workspace -w /workspace --name cpp-amd64-linux cpp-linux-amd64:latest bash
    • docker run -it:创建并启动一个容器,启动之后进入虚拟终端(进入容器,可以输入命令)
    • -p:端口映射。将宿主机的2222端口和容器内的22端口进行映射,其他地方可以直接通过宿主机的2222端口进入到容器内的22端口(即ssh服务)
    • -v:磁盘映射。将宿主机的C:\Users\RedTeamer\docker-volu\cpp-dev-ubuntu目录和容器内的/workspace进行映射,任何一端发生变化,另一端都能实时同步(里用的是文件共享机制,注意,windwos上默认只能映射到家目录及其子目录中,其他地方默认没有权限)
    • -w:启动容器之后,默认进入/workspace目录
    • --name:给常见的容器命名为cpp-amd64-linux
    • cpp-linux-amd64:latest:指定根据哪个进行创建容器
    • bash:进入容器后默认执行的命令,配合前面的-it使用表示进入容器后,默认进入到bash终端,有的容器可能没有bash,而是sh或者其他。
  2. 进入容器,启动ssh服务、根据需要配置其他工具

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 启动ssh服务
    service ssh status
    service ssh start
    service ssh status

    # 安装网络工具
    apt-get udpate
    apt-get install net-tools iproute2

    # 检查22端口是否开放
    ss -tlpna|grep 22

CLion配置远程开发环境

  1. 在设置界面中,搜索ssh,Tools > SSH Configurations,新建一个配置,设置ssh为密码登录(Username:root, Password:123456),点击Test Connection,连接成功(别忘了Apply)!

    image-20251220132427848

  2. 在设置界面中,搜索toolchains,Build > Execution > Deployment,新建一个配置(点击加号,选择Remote Host),在Credentials中选择刚刚配置的SSH,就能自动识别编译工具。最后,将这个配置项移动到第一位(第一个位置是Default的,也可以不移动),Apply!

    image-20251220131239613

  3. 设置界面中,搜索cmake,Build > Execution > Deployment,修改默认的配置或者新建一个配置,构建类型Debug或者Release都行,Toolchain选择刚配置的工具链,Generator让CMake决定,最后Apply

    image-20251220132612110

  4. 新建一个C项目进行测试

    • CMake执行成功,文件保存在容器内的/tmp/tmp.pEK4Ow1Uno/CTest/cmake-build-cpp-linux-amd64-docker

      image-20251220132652467

    • 点击构建,编译成功 & 链接成功,文件保存在CMakeFiles/CTest.dir/main.c.o/tmp/tmp.pEK4Ow1Uno/CTest/cmake-build-cpp-linux-amd64-docker/CTest

      image-20251220133215301

    • 进容器查看,至此,艺术已成~!

      image-20251220133534390