使用docker在本地进行环境管理以及隔离开发

一个干净整洁的系统环境

Posted by YD Blog on July 21, 2023

使用docker在本地进行环境管理以及隔离开

本文将介绍:

  • 使用docker进行环境管理的原因
  • 如何构建自定义的docker镜像
  • 如何使用镜像构建容器并使用vs code在容器中进行开发

以下是具体内容。

原因

我之前使用的个人电脑的环境非常紊乱,比如为了学习使用java 8,而为了玩MC又装了java 17、19等,python也有好几个版本,早期学习时使用gcc,后来安装了VS,每当需要更改使用环境时就不得不去手动修改PATH路径,非常的繁琐而且麻烦,在这个前提下我才开始学习如何使用docker容器进行环境管理。

如何构建自定义docker镜像

dacker的镜像库中有大量的镜像提供给用户下载,但无奈由于各种各样的原因,中国用户使用时还是比较不方便的,另一方面官方仅会提供基础镜像,由其他用户上传的镜像用起来总是会觉得有点不太舒服什么二逼洁癖,所以开始研究通过官方提供的基础镜像进行自定义构建,具体可以选择如下两种方法:

  • 直接拉取官方镜像并构建容器,然后对容器进行自定义,最后再将容器重新打包为镜像,以此完成自定义工作
  • 使用dockerfile进行自定义容器,然后按照dockerfile进行自动构建

手动自定义镜像

首先需要拉取一个官方提供的基础镜像,指令格式如下:

docker pull [OPTIONS] NAME[:TAG]

OPTIONS:
-a,	--all-tags #拉取所有的版本的镜像
		--disable-content-trust #跳过镜像验证
		--platform string #设置平台
-q,	--quiet #静默模式

比如如果我想拉取一个ubuntu的最新的镜像,我就可以使用如下指令:

docker pull ubuntu:latest

在拉取这个镜像后就可以使用该镜像进行自定义容器了,首先需要启动一个容器,指令如下:

docker container run -name ${给你的容器起个名字} -p ${随便一个未被使用的端口号}:8080 -it ${镜像名:版本号} bash

启动后就可以在控制台或者使用docker桌面应用程序对容器进行自定义操作,比如安装各种各样的软件包,配置git等,在完成自定义后将容器重新打包为镜像

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

OPTIONS:
-a	#指定作者
-c	#使用dockerfile指令来创建镜像
-m	#提交生成镜像的说明信息
-p	#在commit时将容器暂停

打包为镜像后就可以进行迁移等操作了。

使用dockerfile进行自定义

dockerfile说白了就是一个镜像构建的自动化脚本,我将举个例子来说明dockerfile如何书写:

# 构建一个Ubuntu20.04下具备orcale JDK8、Maven3的开发环境,配置阿里云镜像
# 由于使用orcale的jdk8,而下载orcalejdk需要登陆,所以使用时需要手动下载到本地并与此文件放置同一目录下
# 
# 在本目录下使用如下指令构建镜像
# docker build -t "jdk8:test" .
# 使用docker images查询镜像列表
# 
# 镜像启动指令如下
# docker container run -name jdk8 -p {随便一个未被使用的端口号}:8080 -v {项目目录}:/data -v {maven本地库目录}:/maven-repository -it jdk8:test bash

# 基础镜像
FROM ubuntu:20.04

# 添加jdk8压缩包至 /usr/local 目录,压缩包会自动解压,解压后目录名称为jdk1.8.0_231
ADD jdk-8u381-linux-aarch64.tar.gz /usr/local/env/jdk8/
# 将自定义maven配置文件移入镜像
ADD settings.xml /tempfile/
# 配置JAVA_HOME环境变量
ENV JAVA_HOME /usr/local/env/jdk8/jdk1.8.0_381/
# 将JAVA_HOME/bin 添加至PATH环境变量
ENV PATH $JAVA_HOME/bin:$PATH

RUN \
apt update \ 
# 安装maven
&& DEBIAN_FRONTEND=noninteractive apt install -y maven \
# 创建本地maven库和项目目录
&& mkdir /data \
&& mkdir /maven-repository \
# 备份maven原始配置文件
&& mv /etc/maven/settings.xml /etc/maven/settings-primitive.xml \
&& mv /tempfile/settings.xml /etc/maven \
# 初始化maven脚本并输出设置信息
&& mvn help:effective-settings \
# 删除临时文件夹
&& rm -rf /tempfile

# 暴露端口
EXPOSE 8080
EXPOSE 22
EXPOSE 8009
EXPOSE 8005
EXPOSE 8443

WORKDIR /data

以上为一个orcale jdk8的环境镜像,基础镜像使用的ubuntu 20.04,在上面安装了maven,使用前需要将orcale的jdk压缩包和配置好镜像和仓库地址的maven设置文件放在此dockerfile同一目录下,就能直接使用

如下为dockerfile基本语句:

保留字 含义
FROM 指定基础镜像,用于后续的指令构建。
MAINTAINER 指定Dockerfile的作者/维护者。(已弃用,推荐使用LABEL指令)
LABEL 添加镜像的元数据,使用键值对的形式。
RUN 在构建过程中在镜像中执行命令。
CMD 指定容器创建时的默认命令。(可以被覆盖)
ENTRYPOINT 设置容器创建时的主要命令。(不可被覆盖)
EXPOSE 声明容器运行时监听的特定网络端口。
ENV 在容器内部设置环境变量。
ADD 将文件、目录或远程URL复制到镜像中。
COPY 将文件或目录复制到镜像中。
VOLUME 为容器创建挂载点或声明卷。
WORKDIR 设置后续指令的工作目录。
USER 指定后续指令的用户上下文。
ARG 定义在构建过程中传递给构建器的变量,可使用 “docker build” 命令设置。
ONBUILD 当该镜像被用作另一个构建过程的基础时,添加触发器。
STOPSIGNAL 设置发送给容器以退出的系统调用信号。
HEALTHCHECK 定义周期性检查容器健康状态的命令。
SHELL 覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令。

通过以上这些来对自己的容器进行自定义,在dockerfile目录下使用如下指令进行镜像构建:

docker build -t [镜像名称:版本号] .

构建完成后使用该镜像运行容器即可,具体如下:

docker container run -name [容器名] -p [随便一个未被使用的端口号]:[容器端口号] -v [项目目录]:[容器内目录] -v -it [镜像名:版本号]

这样就能获得一个自定义的容器了。

在容器里进行开发

在容器中进行开发有三种方式,一是通过编辑器插件完成连接进行开发,另一种是使用ssh连接容器进行开发,最后一种是直接在本机环境里进行文件操作,在容器终端下进行代码的调试运行等。

通过VScode在容器中进行开发

在vs code中安装Docker插件以及Dev Containers插件,通过vs code的code server远程服务对容器进行访问,具体操作为:

  1. 点击左下角的“打开远程窗口”
  2. 选择“附加到正在运行的容器”
  3. 选择你要使用的容器即可

需要注意的是有些较为精简的镜像在vs code自动安装code-server服务端时有可能会报错,此时可以选择自行从官网下载对应版本进行手动安装,或者选择ssh连接