基于Docker容器的Linux C/C++编译环境

Linux C/C++·Docker / Docker Swarm · 02-04 · 852 人浏览
基于Docker容器的Linux C/C++编译环境

C/C++编译时经常需要配置环境,有的时候不想安装在本机上,环境太多容易混乱,安装步骤麻烦,出错也不好撤销修改。我最近在学习Linux C/C++,但是我的电脑是win10系统,正好可以结合vscode+VMware+Docker+SSH做出一套Linux下面的C/C++编译环境,配置方便快捷

安装软件及功能列表

  • gcc
  • g++
  • gdb
  • make
  • man
  • psmisc(killall命令)
  • openssh-server
  • vsftpd(FTP服务)

编写Dockerfile文件

  • 进入到~目录,创建cpp_env文件夹,创建Dockerfile文件
cd ~
mkdir cpp_dev
cd cpp_dev
vi Dockerfile
  • 粘贴以下内容

    • 脚本中的developer为账号
    • 脚本中的password为密码
# 使用最新的Ubuntu镜像作为基础镜像
FROM ubuntu:22.04

# 禁用SELinux
ENV container SELINUX=disabled

# 更换为阿里云的Ubuntu存储库镜像,以加速更新
RUN sed -i 's/http:\/\/archive.ubuntu.com/http:\/\/mirrors.aliyun.com/g' /etc/apt/sources.list

# 创建SSH目录并更新apt包列表
RUN mkdir /run/sshd && \
    apt-get update && \
    apt-get install -y gcc g++ gdb make man psmisc openssh-server vsftpd && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# 创建一个新用户(这里使用了用户名为bill,您可以更改为您喜欢的用户名)
RUN useradd -m -s /bin/bash bill && \
    echo 'bill:bill' | chpasswd && \
    usermod -aG sudo bill

# 允许SSH远程连接
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config && \
    sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config

# 配置vsftpd
RUN echo "local_enable=YES" >> /etc/vsftpd.conf && \
    echo "write_enable=YES" >> /etc/vsftpd.conf && \
    echo "local_umask=022" >> /etc/vsftpd.conf && \
    echo "chroot_local_user=YES" >> /etc/vsftpd.conf && \
    echo "pasv_enable=YES" >> /etc/vsftpd.conf && \
    echo "pasv_min_port=30000" >> /etc/vsftpd.conf && \
    echo "pasv_max_port=30009" >> /etc/vsftpd.conf && \
    echo "allow_writeable_chroot=YES" >> /etc/vsftpd.conf && \
    echo "local_root=/home/bill/ftp" >> /etc/vsftpd.conf

# 创建FTP所需目录并设置权限
RUN mkdir -p /var/run/vsftpd/empty && \
    chmod 555 /var/run/vsftpd/empty

# 允许外部连接
EXPOSE 22 21 30000-30009

# 启动SSH和FTP服务器
CMD ["/bin/bash", "-c", "/usr/sbin/sshd && /usr/sbin/vsftpd /etc/vsftpd.conf"]

打包成Docker镜像

sudo docker build -t my_cpp_env .

运行容器

  • 所有容器的端口号均设置2200的偏移量,例如SSH端口号为2222,避免与宿主机冲突
  • 设置启动参数--restart always,容器总是随着主机启动而启动
  • -v /home/bill:/home/bill 将本地主机的 /home/bill 文件夹映射到容器内的 /home/bill 文件夹
  • 容器的22端口(SSH端口)映射到主机的22端口,将20和21端口(FTP端口)映射到主机的20和21端口,并将30000到30009端口(FTP被动模式端口)映射到主机的30000到30009端口(只用主动模式操作)
sudo docker run -d \
-v /home/bill:/home/bill \
-p 2222:22 \
-p 20-21:20-21 \
--restart always \
--name my_cpp_container \
my_cpp_env
  • 查看容器日志
sudo docker logs -f my_cpp_container
  • 删除容器
# 先停止容器再删除
sudo docker container stop my_cpp_container
sudo docker container rm my_cpp_container
# 或者强制删除
sudo docker container rm -f my_cpp_container
  • 查看容器运行状态
[bill@localhost cppenv]$ sudo docker container ls
CONTAINER ID   IMAGE        COMMAND               CREATED          STATUS          PORTS                                   NAMES
205356368e4f   my_cpp_env   "/usr/sbin/sshd -D"   36 minutes ago   Up 36 minutes   0.0.0.0:2222->22/tcp, :::2222->22/tcp   my_cpp_container

容器正常启动,随后可以通过SSH连接。

容器开机自启

  • 在容器运行参数中设置启动参数--restart always,容器总是随着主机启动而启动
  • 设置docker开机自启
sudo systemctl enable docker

配置vscode远程连接

安装Remote - SSH插件

  • 插件商店搜索SSH关键字,找到如下插件,进行安装

安装成功后,左侧功能栏会有如下图标:

添加SSH远程连接

  • 点击+添加SSH连接

image-20240204164144542

Enter SSH Connection Command连接命令文本框中输入

# 用户名、IP地址、端口号改成自己定义的即可
ssh bill@192.168.149.137 -p 2222

在弹出的custom SSH configuration file中选择第一个备选项即可,这个配置文件存到了当前用户的.ssh文件夹中

image-20240204164444660

Host 192.168.149.138(Docker)
    HostName 192.168.149.138
    User bill
    Port 2222

连接

  • 点击➡小箭头进行连接

  • 连接成功

测试编译

image-20240204165123978

  • 编译成功,环境配置完成


Docker C C++
Theme Jasmine by Kent Liao And Bill

本站由提供云存储服务