搭建docker开发环境

  • 兼容 Windows 11macOSLinux

环境分两种

生产环境

  • 一般使用 Linux 服务器(包括买云服务器)
  • 关闭 debug 端口
  • 使用 log 日志进行排错
  • 环境变量 举例:RAILS_ENV=production
  • 编辑器:vi 或者 vim,推荐 nano
  • Shellbash 或者 sh

开发环境

  • 一般使用 Windows 或者 macOS
  • 开启 debug 端口
  • 使用 log 或者断点进行排错
  • 环境变量 一般不设置,默认:development
  • 编辑器:VSCode 或者 Jetbrains 全家桶
  • Shellzsh 或者 fish

为了减少环境不一致带来的bug,确保生产环境和开发环境一致,需要使用 Docker

Docker 优缺点对比

优点

  • Windows 里运行 Linux 容器,开启 WSL2
  • macOS 里运行 Linux 容器
  • Linux 里运行 Linux 容器
  • 在所有操作系统重用同一套环境

缺点

  • 需要了解容器的概念
  • 需要做端口映射
  • 需要做数据卷映射
  • 需要会 Linux 命令
  • 占用内存和硬盘

Docker + VSCode

  • 安装 Docker DeskTop 客户端
    • Win11 开启 WSL
    • macOS 版本 10.15+,不可安装 VirtualBox
    • Linux 内核 3.10+
  • Docker 加速
  • 安装 VSCode
    • 安装 Dev Containers 插件
  • 使用模板代码 oh-my-env
    • 下载后删除 .git 使用
    • Docker 安装成功后,请在命令行运行 docker network create network1 以防报错
    • 输入 reopen in container 回车
  • 测试命令是否可用
    • 新建终端,输入版本检查命令
    • 确保 rubybundleirbnodenpm 等命令可用

配置 docker.desktop@v4.89.0 docker@29.7.2Docker Engine

  • Configure the Docker daemon by typing a JSON Docker daemon

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
    },
    "debug": false,
    "experimental": false,
    "insecure-registries": [
    "docker.mirrors.ustc.edu.cn"
    ],
    "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn/",
    "https://o3b9ba2s.mirror.aliyuncs.com",
    "https://reg-mirror.qiniu.com",
    "https://hub-mirror.c.163.com/"
    ]
    }

oh-my-env

oh-my-env 文件预览

.devcontainer/Dockerfile 镜像

1
FROM frankfang128/oh-my-docker:mangosteen

.devcontainer/devcontainer.json

 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
34
35
36
37
38
39
40
41
42
43
44
{
  "name": "OhMyEnv",
  "context": "..",
  "dockerFile": "./Dockerfile",
  "customizations": {
    "vscode": {
      "settings": {},
      "extensions": [
        "streetsidesoftware.code-spell-checker",
        "golang.go",
        "Shopify.ruby-lsp",
        "testdouble.vscode-standard-ruby",
        "sorbet.sorbet-vscode-extension",
        "dbaeumer.vscode-eslint",
        "esbenp.prettier-vscode",
        "castwide.solargraph",
        "kaiwood.endwise",
        "sianglim.slim",
        "jnbt.vscode-rufo",
        "Vue.volar",
        "mtxr.sqltools"
      ]
    }
  },
  "runArgs": [
    "--privileged",
    "--network=network1"
  ],
  "containerEnv": {
    "DISPLAY": "host.docker.internal:0.0"
  },
  "mounts": [
    "source=docker,target=/var/lib/docker,type=volume",
    "source=config,target=/root/.config,type=volume",
    "source=vscode-extensions,target=/root/.vscode-server/extensions,type=volume",
    "source=ssh,target=/root/.ssh,type=volume",
    "source=go-bin,target=/root/go/bin,type=volume",
    "source=pnpm-bin,target=/root/.local/share/pnpm,type=volume",
    "source=gems,target=/usr/local/rvm/gems,type=volume",
    "source=repos,target=/root/repos,type=volume"
  ],
  "remoteUser": "root",
  "postStartCommand": "nohup bash -c '/usr/sbin/dockerd &> /var/log/dockerd.log &' &> /dev/null"
}

oh-my-env 下载安装

  • 下载后删除 .git 使用 VSCode 打开
  • ctrl shift P 输入 reopen in container 选择后进入自动构建 Linux 镜像,等待
  • 可以关闭 第一个终端 ‘开发者容器’,也可以开着看日志
  • 点击 + 打开新终端,进入已经配置好的 zsh 终端环境
  • 在终端输入 pwd 查看当前目录 /workspaces/oh-my-env-2,说明已经进入了一个 Linux 环境
  • 在终端输入 uname -a 查看当前 Linux 环境版本信息
  • 在终端输入 echo $0 查看 Shell 信息 /bin/zsh

oh-my-env 检查已安装软件版本

在终端输入

  • rvm --version 查看为 rvm 1.29.12
  • 激活 ruby 输入命令: rvm use 3,可以看到 Using /usr/local/rvm/gems/ruby-3.0.0
  • ruby --version 版本为 ruby 3.0.0p0
  • bundle --version 版本为 Bundler version 2.2.3
  • irb --version 版本为 irb 1.3.0
  • irb --version 版本为 3.2.3

node 相关

  • nvm --version 查看为 0.39.1
  • 安装 node@20nvm install 20.19.1,使用 nvm use 20.19.1
  • npm --version
  • yarn --version
  • pnpm --version

重新打开 oh-my-env 环境

可以关闭后,再打开,注意查看最近项目 xxx [开发容器]

  • 可以打开容器项目文件,reopen 容器 oh-my-env
  • 也可以打开新窗口,在最近列表中找到带有 xxx [开发容器] 的项目打开

oh-my-env 环境说明

工作空间

  • oh-my-env 会自动映射为 workspaces/oh-my-env
    • 该目录里的文件是系统和容器 内外共享 的,由于是 ntfs,性能一般
    • temp 目录可作为文件中转
  • 提前另外准备好了 ~/repos 目录,该目录是 容器专属 的,性能较好
    • 默认会在 ~/repos 中工作
    • 需要共享时才会用到 workspaces/oh-my-env/temp 目录
    • cd ~/repos 或者 cd root/repos
    • docker deskop 的数据卷中可以查看

持久化

  • Ctrl + Shift + P 弹出框内输入 rebuild container 相当于 重装系统
  • 重新构建镜像后,未持久化的目录都会删除
  • 只有 mounts 中的目录和 oh-my-env 目录会被保留
    • 会被持久化到数据卷中,不会随容器重启或重建而消失

.devcontainer/devcontainer.json

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
{
  "//...": "",
  "mounts": [
    "source=docker,target=/var/lib/docker,type=volume",
    "source=config,target=/root/.config,type=volume",
    "source=vscode-extensions,target=/root/.vscode-server/extensions,type=volume",
    "source=ssh,target=/root/.ssh,type=volume",
    "source=go-bin,target=/root/go/bin,type=volume",
    "source=pnpm-bin,target=/root/.local/share/pnpm,type=volume",
    "source=gems,target=/usr/local/rvm/gems,type=volume",
    "source=repos,target=/root/repos,type=volume"
  ],
  "//...": ""
}
  • 需要自定义持久化的,双手也可以添加到 mounts

oh-my-env 环境功能

现有功能

  • archlinux
  • zsh 已配置终端,相当于 bash
  • fzf 索引当前目录下所有文件,可模糊查找,只可以找到文件目录路径,该命令无法打开
    • 使用自定义脚本,操作打开目录或者文件 vi ~/.bashrc
    • 命令 f 使用默认的 editor 打开文件
    • 命令 fd 打开文件所在的目录
    • 命令 j 会用 fzf 打开所有打开过的目录,可快速查找,回车可进入该目录
    • 命令 jj 反悔重新查找
  • rvm + ruby + gem + bundle
  • nvm + node + pnpm
  • go
  • 各种国内加速
  • 其他多余的已删除
    • docker in docker
    • 使用命令 dockerd 来启动
    • 新打开一个终端,输入 docker ps 查看运行的镜像
    • 可运行 docker run hello-world 成功显示 Hello from Docker!
    • chezmoi 可管理所有配置

如何自定义

  • 在系统命令行创建网络 docker network create network1 运行这个命令才能保证 reopen 不报错
    • 第一次成功,重复运行命令报错,但不影响功能
  • 打开 .devcontainer/Dockerfile
  • RUN 指令来添加你想要添加的依赖
    • RUN yes | pacman -S fish
    • 然后 rebuild container 即可
    • 其他例如 RUN npm i -g http-server 方便扩展
  • 更多功能可查看 oh-my-docker

如何让容器与宿主机共享 ssh 认证信息


oh-my-env 工作流

初始工作配置各种文件:拷贝配置

-

工作目录操作

  • cd ~/repos 或者 cd /root/repos 或者 j repos
  • 使用 code xxx-project-name 打开新的 IDE 窗口,可以把旧的关了
  • 新建 mkdir xxx-project-name 在用 VSCode 打开
  • 删除 rm -rf xxx 容器自动清除数据卷

备份文件

  • 删除镜像,还原备份

  • Docker 安装成功后,请在命令行运行 docker network create network1 以防报错
  • 38eda56ac8822aaf9fa4d1331301376acb31d8e7e0d04631e4e00c255428d4cb

·完待续·

参考文章

相关文章


  • 作者: Joel
  • 文章链接:
  • 版权声明
  • 非自由转载-非商用-非衍生-保持署名