制作自己的docker镜像,将docker镜像作为服务器,接受vscode连接
目录
[1. 制作开发环境镜像](#1. 制作开发环境镜像)
[1.1 选择基础镜像](#1.1 选择基础镜像)
[1.2 编写dockerfile](#1.2 编写dockerfile)
[1.3 构建镜像](#1.3 构建镜像)
[2. 启动镜像](#2. 启动镜像)
[3. 添加用户](#3. 添加用户)
[3.1 查看物理机上用户信息](#3.1 查看物理机上用户信息)
[3.2 登录到docker中](#3.2 登录到docker中)
[3.3 按照物理机的用户和组id增加用户](#3.3 按照物理机的用户和组id增加用户)
[4. 使用vscode连接](#4. 使用vscode连接)
[4.1 vscode添加ssh配置](#4.1 vscode添加ssh配置)
[4.2 vscode连接docker](#4.2 vscode连接docker)
[4.3 打开工作目录](#4.3 打开工作目录)
[4.4 查看共享目录](#4.4 查看共享目录)
分 4 步
-
(1)制作ubuntu20.04的开发环境
-
(2)启动镜像实例,将其作为开发环境
-
(3)添加用户(权限对齐物理开发机),可访问宿主开发机目录
-
(4)通过ssh或者vscode远程登录
1. 制作开发环境镜像
1.1 选择基础镜像
在dockerhub上找基础镜像 Docker Hub
这里以ubuntu20.04为例
1.2 编写dockerfile
基于ubuntu20.04的基础镜像,安装C++开发工具
FROM ubuntu:20.04 AS ubuntu20.04-base
LABEL author="authorname"
ENV DEBIAN_FRONTEND=noninteractive
# 1. 基础环境
# 1.1 切换国内源
RUN sed -i s@/archive.ubuntu.com/@/mirrors.tuna.tsinghua.edu.cn/@g /etc/apt/sources.list
RUN apt-get clean && apt-get update
# 1.2 安装基础包
RUN apt-get -yq install apt-utils vim git tmux bash-completion \
curl sudo locales gnupg lsb-release language-pack-zh-hans \
python3-pip openssh-server
# 1.3 语言
RUN locale-gen en_US en_US.UTF-8
RUN update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
ENV LANG=en_US.UTF-8
# 1.4 添加docker和root用户
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN useradd -rm -d /home/docker -s /bin/bash -g root -G sudo docker
RUN echo 'docker:docker' | chpasswd
RUN echo 'root:Aa123456' | chpasswd
USER docker
WORKDIR /home/docker
# 2. 安装ssh服务
FROM ubuntu20.04-base AS ubuntu20.04-base-sshd
USER root
# 2.1 ssh服务配置
# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
RUN sed -i 's/\#PubkeyAuthentication\ yes/PubkeyAuthentication\ yes/' /etc/ssh/sshd_config && \
sed -i 's/\#PasswordAuthentication\ yes/PasswordAuthentication\ yes/' /etc/ssh/sshd_config && \
sed -i 's/\#X11Forwarding\ no/X11Forwarding\ yes/' /etc/ssh/sshd_config && \
sed -i 's/\#AllowTcpForwarding\ yes/AllowTcpForwarding\ yes/' /etc/ssh/sshd_config && \
sed -i 's/\#AllowAgentForwarding\ yes/AllowAgentForwarding\ yes/' /etc/ssh/sshd_config
RUN mkdir /var/run/sshd
RUN bash -c 'install -m755 <(printf "#!/bin/sh\nexit 0") /usr/sbin/policy-rc.d'
RUN ex +'%s/^#\zeListenAddress/\1/g' -scwq /etc/ssh/sshd_config
RUN ex +'%s/^#\zeHostKey .*ssh_host_.*_key/\1/g' -scwq /etc/ssh/sshd_config
RUN RUNLEVEL=1 dpkg-reconfigure openssh-server
RUN ssh-keygen -A -v
RUN update-rc.d ssh defaults
# 3. sudo配置
RUN ex +"%s/^%sudo.*$/%sudo ALL=(ALL:ALL) NOPASSWD:ALL/g" -scwq! /etc/sudoers
FROM ubuntu20.04-base-sshd AS ubuntu20.04-dev
# 4. ssh指纹可免密登录
# Generate and configure user keys.
USER docker
WORKDIR /home/docker
RUN ssh-keygen -t rsa -b 4096 -C "xxx@gmail.ai" -f ~/.ssh/id_rsa_xxx_gmail -q -N ""
# 5. 基础开发环境
# 更新镜像的包索引并安装必要的软件包
RUN sudo apt-get install -yq \
cmake \
g++ \
gdb \
pkg-config
# 6. 默认启动命令
ENTRYPOINT sudo service ssh restart && bash
1.3 构建镜像
构建带有C++开发环境的新镜像
docker build -t myubuntu20.04:0.1 .
2. 启动镜像
-
将docker的ssh端口22映射到物理机的2222
-
将docekr的/mnt目录映射到物理机的/mnt/users/software目录
docker run -d -t -p 2222:22 --name ubuntu20.04_for_software -v /mnt:/mnt/users/software myubuntu20.04:0.1
3. 添加用户
为了保证docker机和开发机的用户权限一致,我们需要按照权限添加用户
假设现在要将用户名为cpf的用户添加到docker中,为了docker中用户能够访问物理机的目录,我们保证docker中的用户和物理机用户在同一组内
3.1 查看物理机上用户信息
在开发机上查看用户cpf的用户信息
# 有root权限可以直接查看
cat /etc/passwd | grep cpf
# 无root权限,用户登录后查看
id -u && id -g
3.2 登录到docker中
制作镜像的时候已经在docker里增加了docker用户,因此直接使用docker用户登录
# 在docker所在的物理机可以通过两种方式登录到docker中
# 1. 通过docker命令登录:docker exec -it ubuntu20.04_for_software /bin/bash
# 2. 通过ssh登录
ssh docker@127.0.0.1 -p2222
# 在其他设备上也可以通过ssh登录,10.31.2.204为docker所在物理机的IP地址
ssh docker@10.31.2.204 -p2222
3.3 按照物理机的用户和组id增加用户
# 1. 以用户和组id为1000来添加cpf用户到cpf组
sudo groupadd cpf -g 1000
sudo useradd -g cpf -ms /bin/bash cpf -u 1000
# 2. 如果需要sudo权限
# sudo usermod -aG sudo cpf
# 3. 修改cpf用户的密码
# 删除原密码
sudo passwd -d cpf
# 切换到cpf并修改密码
sudo su - cpf
passwd
4. 使用vscode连接
4.1 vscode添加ssh配置
点击图标
添加配置并保存
4.2 vscode连接docker
刷新后连接
输入密码并回车
连接成功后点击添加目录
4.3 打开工作目录
点击打开文件夹,然后输入文件夹,默认是打开home目录
4.4 查看共享目录
打开终端
docker中查看目录
然后就是下载代码并开始后续的开发工作了
一起学习,一起进步