【山竹记账】搭建docker开发环境 ⇧
大纲链接 §
[TOC]
1. 环境 ⇧
环境主要分两种:生产环境 和 开发环境 兼容
Windows 11、macOS、Linux
生产环境 ⇧
- 一般使用
Linux服务器(包括买云服务器) - 关闭
debug端口 - 使用
log日志进行排错 - 环境变量 举例:
RAILS_ENV=production - 编辑器:
vi或vim或neovim Shell:bash或者sh
开发环境 ⇧
- 一般使用
Windows或者macOS - 开启
debug端口 - 使用
log或者断点进行排错 - 环境变量 一般不设置,默认:
development - 编辑器:
VSCode(直连Docker) 或JetBrains(无法直连Docker) Shell:zsh或者fish
生产环境 与 开发环境 系统不一致导致的 bug ⇧
- 缺少依赖库
API不兼容
为了减少环境不一致带来的bug,确保每个开发运维人员生产环境和开发环境一致,需要使用
Docker,保证环境一致
Docker 优缺点对比 ⇧
优点:
- 在所有地方(操作系统)使用同一套环境
- 在
Windows里运行Linux容器,开启WSL2 - 在
macOS里运行Linux容器 - 在
Linux里运行Linux容器
- 在
缺点:
- 学习门槛较高
- 需要会
Linux命令 - 需要了解容器的概念
- 需要做端口映射
- 需要做数据卷映射
- 需要会
- 占用内存和硬盘
2. Docker知识归纳 ⇧
|
|
3. 使用Docker的准备工作 ⇧
各个操作系统的基本要求
Win11开启WSLmacOS版本10.15+,不可安装VirtualBoxLinux内核3.10+
win11 开启 WSL2 ⇧
控制面板\所有控制面板项\程序和功能点击启用或关闭Windows功能,勾选Hyper-V、Windows拟机监控程序平台、适用于Linux的Windows子系统,确认并重启- 家庭版开启
Hyper-V需额外设置 - Windows 11 安装 WSL2,启动终端或打开Power Shell 以管理员命令输入下方代码:
bcdedit /set hypervisorlaunchtype auto - 使用
PowerShell,以管理员权限启动,输入下方命令执行:wsl --install -d Ubuntu,需要重启计算机 - 系统登录,设置默认账户和密码,该账户默认为该Linux系统的管理员,具备和root相同的权限。(root已经有了不能起重复的账户名)
- 升级WSL内核:
wsl --update - 重启WSL内核:
wsl -l -shutdown - 查看本系统WSL情况:
wsl -l -v - 在
Ubuntu命令行中,升级Linux系统的包:sudo apt update && sudo apt upgrade - 查看可用发行版列表:
wsl --list --online/wsl -l -o - 更改默认安装的 Linux 发行版:
wsl --install -d <Distribution Name> - 如果要通过 Linux/Bash 命令行(而不是通过 PowerShell 或命令提示符)安装其他发行版,必须在命令中使用 .exe:
wsl.exe --install -d <Distribution Name>或若要列出可用发行版,则使用:wsl.exe -l -o - 使用
wsl --install命令安装的新 Linux 安装将默认设置为WSL 2,无需额外设置:wsl --set-default-version 2 - 在终端启动运行,
ubuntu.exe或ubuntu或wsl.exe - 查看当前目录路径在 WSL 中的装载位置:
wsl pwd - 如果已在 Windows 提示符或 PowerShell 窗口中打开 WSL 命令行并想退出,请输入命令:
exit
参考
安装Docker最新版客户端 ⇧
Install Docker Desktop on Windows: Docker Desktop 2.0+- 安装成功后,需要在命令行运行
docker network create network1创建网络 - 运行这个命令才能保证
reopen不报错 - 第一次成功,重复运行命令会报错,但不影响功能
给Docker加速 ⇧
配置
docker.desktop@v4.89.0docker@29.7.2的Docker Engine
- Configure the Docker daemon by typing a JSON Docker daemon
设置
Docker Engine国内镜像地址
- 启动
Docker Desktop,在设置中找到Docker Engine 修改
daemon.json1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19{ "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" ] }检查加速器是否生效,运行命令
docker info
安装Visual Studio Code最新版 ⇧
- 安装
Remote - ContainersDev Containers插件
尝试使用Docker镜像,创建容器 ⇧
创建 Dockerfile ⇧
尝试使用
Dockerfile创建容器
- 在工作目录中新建
docker-test目录,新建.devcontainer目录 - 新建名为
Dockerfile的文件,无后缀 - 使用
Docker Hub上开源的镜像,在Dockerfile文件中写入FROM frankfang128/oh-my-docker:latest - 按
Ctrl + Shift + P,键入Reopen in Container - 在弹出的选项中点击第二项
From 'Dockerfile' VSCode自动重新启动,并运行一个container- 等到全部安装成功后,点击终端的
+,打开一个zsh,输入以下命令- 查看路径
pwd - 查看版本
node -v;pnpm -v;npm -v;yarn -v
- 查看路径
- 创建
.devcontainer/devcontainer.json
devcontainer.json配置
|
|
在workspace中新建项目文件夹 ⇧
- 最外层新建
node-demos文件夹 - 在
VSCode菜单选项中,打开文件夹,默认在/workspaces/中,点击下一级 - 会把新建的都映射到
windows目录中
区分是
VSCode直接打开的项目 或 使用容器打开的项目
- 容器打开的项目名后跟着
[开发容器:EXISTING DOCKERFILE]或[DEV CONTAINER:EXISTING DOCKERFILE]
使用 oh-my-env 模板代码 ⇧
下载oh-my-env ⇧
git clone git@github.com:FrankFang/oh-my-env-1.git,下载后删除.git,使用VSCode打开- 按
Ctrl + Shift + P输入reopen in container选择该选项后进入自动构建Linux镜像,等待 - 可以关闭 第一个终端 ‘开发者容器’,也可以开着看日志
- 点击
+打开新终端,进入已经配置好的zsh终端环境 - 在终端输入
pwd查看当前目录/workspaces/oh-my-env-2,说明已经进入了一个Linux环境 - 在终端输入
uname -a查看当前Linux环境版本信息 在终端输入
echo $0查看Shell信息/bin/zsh1 2 3 4 5 6pwd # 当前系统信息 uname -a # 读取当前用户名 whoami echo $0
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.0p0bundle --version版本为Bundler version 2.2.3irb --version版本为irb 1.3.0gem --version版本为3.2.3VSCode版本code --versiongit --version
node相关
nvm --version查看为0.39.1- 安装
node@20:nvm install 20.19.1,使用nvm use 20.19.1 npm --versionyarn --versionpnpm --version
重新打开 oh-my-env 环境 ⇧
可以关闭后,再打开,注意查看最近项目
xxx [开发容器]
- 可以打开容器项目文件,
reopen容器oh-my-env - 也可以打开新窗口,在最近列表中找到带有
xxx [开发容器]的项目打开
查看
oh-my-env的.devcontainer/Dockerfile
- 山竹记账的镜像
FROM frankfang128/oh-my-docker:mangosteen
新版
.devcontainer/devcontainer.json
|
|
小结
- 各个操作系统的基本要求
Win11开启WSLmacOS版本10.15+,不可安装VirtualBoxLinux内核3.10+
- 给
Docker加速 - 安装
VSCode- 安装
Dev Containers插件
- 安装
- 安装
Docker DeskTop客户端 - 直接使用模板代码 oh-my-env
- 下载后删除
.git使用 Docker安装成功后,请在命令行运行docker network create network1以防报错- 输入
reopen in container回车
- 下载后删除
- 测试命令是否可用
- 新建终端,输入版本检查命令
- 确保
ruby、bundle、irb、node、npm等命令可用
4. oh-my-env 环境说明 ⇧
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的数据卷中可以查看
- 默认会在
oh-my-env 持久化 ⇧
- 在
Ctrl + Shift + P弹出框内输入rebuild container相当于 重装Linux系统 - 重新构建镜像后,未持久化的目录都会被删除
- 只有写在
mounts配置中的目录和oh-my-env目录(容器外系统可访问)会被保留- 会被持久化到数据卷中,不会随容器重启或重建而消失
.devcontainer/devcontainer.json
|
|
- 需要自定义持久化的,也可以添加到
mounts中 - 修改之前请看一下上面内容是否已经包含你需要的挂载
- 重复挂载将导致容器启动失败
主要使用的持久化的工作目录
~/repos供容器内部系统使用/workspaces/oh-my-env2供容器内外系统中转数据使用
oh-my-env 环境功能 ⇧
现有功能
archlinuxzsh已配置终端,相当于bashfzf索引当前目录下所有文件,可模糊查找,只可以找到文件目录路径,该命令无法打开- 使用自定义脚本,操作打开目录或者文件
vi ~/.bashrc - 命令
fd打开文件所在的目录 - 命令
f使用默认的editor打开文件 - 命令
j会用fzf打开所有打开过的目录,可快速查找,回车可进入该目录 - 命令
jj反悔重新查找
- 使用自定义脚本,操作打开目录或者文件
rvm + ruby + gem + bundlenvm + node + pnpmgogitvscode- 各种国内加速
- 其他多余的已删除
neovim
docker in docker(dockerd)- 使用命令
dockerd来启动 - 新打开一个终端,输入
docker ps查看运行的镜像 - 可运行
docker run hello-world成功显示Hello from Docker! chezmoi可管理所有配置
- 使用命令
如何自定义
- 打开
.devcontainer/Dockerfile - 使用
RUN命令来添加想要的依赖,方便扩展,例如:RUN yes | pacman -S fishRUN npm i -g http-server- 然后
rebuild container即可
- 更多功能可查看 oh-my-docker
如何让容器与宿主机共享 ssh 认证信息
5.新建项目示例 ⇧
- 运行容器后,
cd ~/repos或cd /root/repos或使用j命令查找 - 运行
code .在当前目录下开发 - 创建新目录
mkdir xxx,之后code xxx - 删除项目目录,先
cd ..到上一级,再rm -rf xxx删除,会自动关闭对应Linux目录
步骤小结
- 创建目录
mkdir ~/repos/hellocode ~/repos/hello
- 切换窗口
- 关闭
oh-my-env窗口 - 使用
hello窗口
- 关闭
- 原则
- 每次只打开一个目录
- 不要一次打开很多目录,会卡
6.VSCode 端口转发 ⇧
- 由于开启了 windows 中的 Linux 子系统,实现自动映射端口
测试 在容器项目目录中创建
server.js
|
|
运行
node server.js
- 在终端点击跳转网页,可以看到
Hello, World! VSCode提示端口窗口,如果网页中没有显示,则可以在端口删除原来的后重新添加3000端口,再刷新
说明
- 实际上需要监听的是
Linux的3000端口,windows本地并没有 VSCode检测到docker中Linux的3000端口,自动在windows中做一个映射
docker 容器开启 github443 端口 ⇧
- 打开
Ubantu命令行 运行以下命令行
1 2 3sudo apt-get update sudo apt-get install -y iputils-ping sudo sudo apt install net-tools
7.高性能文件: docker volume ⇧
在容器项目中运行
mkdir aaa;touch aaa/frank.txt
- 发现需要手动刷新
VSCode目录才能看到添加的文件/文件夹 docker没有立即检测到文件变化
加速方法
- 在
docker desktop > Volumes中,新建一个Docker volume,自定义命名 - 相当于在命令行运行
docker volume create xxx 在
my-projects/.devcontainer/devcontainer.json中改写mounts为1 2 3 4 5 6 7{ "//xxx": "...", "mounts": [ "source=刚才创建的volume的名字,target=${containerWorkspaceFolder}/high_speed_files,type=volume" ], "//...": "..." }在 VSCode 中运行
rebuild Container这样一来
high_speed_files目录里的文件的性能就非常高了,名称可以任意相当于专门给
docker使用的硬盘,提升文件性能,但windows中不能直接访问该文件/文件夹,需要导出volume不过要记得经常把 volume 中的文件上传到 GitHub,不然你哪天不小心把 volume 删了,代码就彻底没了
参考
8.连接任意数据库 ⇧
连接
MYSQL步骤
- 创建
network1 - 启动
mysql1 server容器服务,连入network1 - 让
oh-my-docker连入network1 - 预装
mysql客户端镜像 - 重启重新构建容器
rebuild - 验证连接
mysql -u root -h mysql1 -p
创建 network1 ⇧
- 打开
windows终端(非容器内),运行命令docker network create network1 - 相当于组建了一个局域网 wifi,需要将mysql服务器和 docker连入该wifi
- 如果报错,就换一个网络名称
network2
启动 mysql 镜像,得到数据库服务的容器 ⇧
- 搜索 docker hub mysql
- mysql docker
windows终端中运行docker run --name mysql1 -e MYSQL_ROOT_PASSWORD=123456 --network=network1 -d mysql:5.7.35- 说明:
docker run --name 数据库名称 -e MYSQL_ROOT_PASSWORD=数据库密码 --network=需要连入的网络 -d mysql:数据库版本号 -d表示deamon
让 oh-my-docker 连入 network1 ⇧
在
.devcontainer/devcontainer.json配置中,确保写入以下配置1 2 3 4 5{ "//xxx": "...", "runArgs": ["--network=network1"], "//...": "...", }写完保存后
Ctrl + Shift + p选择rebuild
预装 mysql 客户端软件 ⇧
在
Dockerfile中写入
|
|
- 写完保存后
Ctrl + Shift + p选择rebuild
验证链接 ⇧
mysql -u root -h mysql1 -p- 会提示输入密码
关机重启
|
|
9.常用的 docker 命令一览表 ⇧
docker ps查看正在运行的容器docker ps -a查看运行过的容器docker pull ubuntu:20.04下载ubuntu镜像docker pull myregistry.local:5000/testing/test-image:0.1下载指定域名下的镜像docker run --name test -dit alpine由镜像得到容器(容器在后台运行),并把容器取名为 testdocker run alpine sh由镜像得到容器,并运行 sh 命令(容器在当前终端运行)docker run -p 9090:8080 -dit alpine端口映射docker run -e ENV1=foo -dit alpine设置环境变量docker run --network=xxx -dit alpine设置网络docker stop container_id或docker kill container_id停止容器(二者区别见这里)docker start container_id开始运行容器docker rm container_id删除已停止运行的容器docker rm -f container_id强制删除容器,不管有没有在运行docker rm $(docker ps --filter status=exited -q)删除所有已停止运行的容器docker rmi image_id删除镜像docker system prune删除占用硬盘的垃圾对象,包括没用的container、images、networkdocker image prune -a删除所有没被用到的镜像
10.配置git/github,创建.ssh 密钥 ⇧
已经预装,查看版本
git --version1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17cd ~ git config --global user.name xmasuhai git config --global user.email xmasuhai@163.com git config --global push.default simple git config --global core.quotepath false git config --global core.editor "code --wait" git config --global core.autocrlf input # 生成ssh key ssh-keygen -t rsa -b 4096 -C "xmasuhai@163.com" # 查看并复制生成的密钥,填写到 GitHub SSH key cat ~/.ssh/id_rsa.pub # 测试是否配置 ssh -T git@github.com # 备份 cd ~/.ssh ll
确保
SSH agent service on Windows服务正在运行
- 在 docker 容器命令行zsh中 重新配置 .ssh 后,命令行提示
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 按照网络上提示删除提示信息中,对应的行数后,vscode 又警告无法连接到 local 主机 (\.\pipe\openssh-ssh-agent) 上的 ssh-agent。请确保服务正在运行。
1 2 3 4 5 6 7 8ssh-keyscan github.com github.com:22 SSH-2.0-babeld-dd067d10 github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl # github.com:22 SSH-2.0-babeld-dd067d10 github.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk= # github.com:22 SSH-2.0-babeld-dd067d10 github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=
将新生成的公钥写入
known_hosts
|
|
英语报错文字
1
|
Could not connect to ssh-agent on local host (\\.\pipe\openssh-ssh-agent). Make sure the service is running. |
原因
- SSH agent service on Windows is not running
- Windows upgrade had for some reason disabled the ssh-agent service
解决步骤
管理员打开
powershell1 2 3 4 5 6 7 8 9 10 11 12 13PS C:\Developer> ssh-agent unable to start ssh-agent service, error :1058 PS C:\Developer> Get-Service ssh-agent Status Name DisplayName ------ ---- ----------- Stopped ssh-agent OpenSSH Authentication Agent PS C:\Developer> Get-Service ssh-agent | Select StartType StartType --------- Disabled依次输入命令
Get-Service -Name ssh-agent | Set-Service -StartupType Manualssh-agentGet-Service ssh-agent
看到正在运行
1 2 3Status Name DisplayName ------ ---- ----------- Running ssh-agent OpenSSH Authentication Agent
参考
- openssh agent not working inside devcontainer with Win10 2004 and WSL2
- Starting ssh-agent on Windows 10 fails: “unable to start ssh-agent service, error :1058”
- building remote-container fails
- How to Fix the GitHub Error ‘Remote Host Identification Has Changed’
- Using SSH keys
完整过程
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 |
PS C:\Windows\system32> Get-Service ssh-agent Status Name DisplayName ------ ---- ----------- Stopped ssh-agent OpenSSH Authentication Agent PS C:\Windows\system32> Get-Service ssh-agent | Select StartType StartType --------- Disabled PS C:\Windows\system32> Get-Service -Name ssh-agent | Set-Service -StartupType Manual PS C:\Windows\system32> ssh-agent PS C:\Windows\system32> Get-Service ssh-agent Status Name DisplayName ------ ---- ----------- Running ssh-agent OpenSSH Authentication Agent PS C:\Windows\system32> ssh-add -l The agent has no identities. PS C:\Windows\system32> ssh-agent PS C:\Windows\system32> |
避免每次需要重启服务,需要设置
ssh-agent启动方式
oh-my-env 工作流 ⇧
初始工作配置各种文件:拷贝配置
-
工作目录操作
cd ~/repos或者cd /root/repos或者j repos- 使用
code xxx-project-name打开新的IDE窗口,可以把旧的关了 - 新建
mkdir xxx-project-name在用VSCode打开 - 删除
rm -rf xxx容器自动清除数据卷
备份文件
- 删除镜像,还原备份
参考文章
- 常见报错点击 https://docs.qq.com/doc/DU1VBVkJvS3VYSFVV 即可查看
- docker docs Overview of the get started guide
- VSCode + Docker 配置完美开发环境 方应杭
- PPT docs.google.com
- oh-my-env-1
- oh-my-env-1 如何 trojan
相关文章
- 在线文档
- API文档仓库 FrankFang/morney-api-doc
- Docker 镜像加速
- 教程:使用 Visual Studio Code 创建 Docker 应用
- 教程:Windows 终端中的 SSH
- 作者: Joel
- 文章链接:
- 版权声明
- 非自由转载-非商用-非衍生-保持署名