docker
docker 学习记录
时间
- 2023 年 9 月 20 日
过程
-
跟着 docker 中文网 的教程走
-
下载安装 docker desktop
安装完后运行提示 wsl 版本过低,docker 启动失败了。谷歌一下原来 wsl 是从 windows10 开始支持的 Linux 子系统,可以在 windows 上直接执行 Linux 二进制文件。顺手安装了一下 vscode 的 wsl 插件(不知道有什么用)
解决方法
根据提示运行 wsl --update
结果 --update 不是有效参数!!!
于是进入 微软网站 ,下载 wsl2 更新包 ,安装后重启系统
-
把教程中的 练手应用 clone 下来
git clone --depth 1 https://github.com/docker/getting-started.git
-
在 app 文件夹下创建一个 Dockerfile
# syntax=docker/dockerfile:1
FROM node:12-alpine
RUN apk add --no-cache python g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]2024-08-17 随笔:
发现之前学习过程中对 Dockerfile 根本一无所知
其实写起来有点像 shell 脚本
现在逐行来解释一下
# 以 node:12-alpine 镜像为模板构建新镜像
FROM node:12-alpine
# 运行命令安装 python g++ make ,其实对于示例中的 node 项目来说用不上
RUN apk add --no-cache python g++ make
# 设置工作目录为 /app ,类似于创建并进入目录
WORKDIR /app
ARG V=1 # 构建时的环境变量
# 把当前目录下的所有文件复制到镜像的 /app 目录下
COPY . .
EVN V=2 # 设置运行时环境变量
# 运行命令 安装项目依赖
RUN yarn install --production
# 设置容器启动时执行的命令
# RUN 和 CMD 的区别 :RUN 在构建镜像时执行,CMD 在容器启动时执行 , CMD 可以被 docker run 命令行参数覆盖
CMD ["node", "src/index.js"] -
运行以下命令,创建 docker 镜像
# -t 指定镜像名称
# . 指定上下文目录,即 Dockerfile 所在目录
docker build -t getting-started .发现报错:
ERROR: unable to select packages: 1.464 python (no such package)
在 Stackoverflow 找到了答案,需要指定 python 版本
修改 Dockerfile 中下面语句,指定 python3:
RUN apk add --no-cache python3 g++ make
重新运行命令,又收到一个错误
error jest@29.3.1: The engine "node" is incompatible with this module. Expected version "^14.15.0 || ^16.10.0 || >=18.0.0". Got "12.22.12"
看意思是 node 版本问题,在 这里 找到可用的版本号
修改 Dockerfile ,node 版本改为 20:
FROM node:20-alpine
再次执行编译,成功生成镜像,在 docker desktop 中也能看到了(发现大小有 540M)
我心想这文档中给的例子怎么就不能直接跑起来呢,就找到 英文文档 ,一看 Dockerfile 是这样:
# syntax=docker/dockerfile:1
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000没了 python 依赖,node 版本也提升了,搞半天是中文文档版本落后了
用英文文档中的 Dockerfile 重新编译了一下
-
运行容器,访问 localhost:3000
# -d 后台运行
# -p 指定端口映射 外部端口:容器端口
# getting-started 指定镜像名称
docker run -dp 3000:3000 getting-started
# -it 以交互模式运行
# bash 进入容器
docker run -it getting-started bash
# -e 设置环境变量
# npm start 启动应用
docker run -it -p 30:3000 -e DEBUG="true" getting-started npm start
# -v 挂载本地目录到容器目录
# -v 本地目录:容器目录
# getting-started 指定镜像名称
docker run -it -v 本地目录:容器目录 getting-started -
跟着 docker desktop 的引导,跑了一下 welcome-to-docker 容器
有源码的,跟着克隆下来(自己加上 --depth 1):
git clone --depth 1 https://github.com/docker/welcome-to-docker
同样的先 build 再 run,发现自带的 docker/welcome-to-docker (13.4M) 比自己 build 的 welcome-to-docker (260M) 小很多
-
可以在 docker hub 中搜索镜像运行
-
Docker Compose 说有了它可以一次启动多个容器,示例应用
克隆下来:
git clone --depth 1 https://github.com/docker/multi-container-app
公司电脑安装 docker desktop
2024-08-28
貌似 docker 在 windows 上运行有两种模式
-
wsl 2
这里要注意 bios 需要启用 虚拟化 功能,公司电脑默认没启用,所以跑不起来
-
Microsoft-Hyper-V ,是 windows 自带的虚拟机功能
开启方式
dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All
# 如果还不行,再试试下面命令
bcdedit /set hypervisorlaunchtype auto
一些 docker 命令
- 清除构建缓存 docker builder prune
- 清除未使用的镜像和构建缓存 docker system prune
- 禁用构建缓存 docker build --no-cache -t your_image_name .
理解
- 需要在不同平台安装 docker
- 可以在任意平台制作 docker 镜像,docker 镜像中包含了应用运行时需要的所有依赖
- docker 镜像可以在任意安装了 docker 的平台运行
- docker 容器是一个隔离的沙盒环境,docker 镜像在容器中运行
- 2024-08-28 Dockerfile 在构建的时候会缓存每一步,如果拷贝的文件没有发生变化不会执行后面的命令
踩坑日记
- ARG NODE_ENV=production 设置环境变量后,npm install 不会安装开发依赖,导致后续 webpack 命令找不到
- 命令行构建镜像时无法下载源镜像,先登录 docker login