Skip to main content

docker

docker 学习记录

时间

  • 2023 年 9 月 20 日

过程

  1. 跟着 docker 中文网 的教程走

  2. 下载安装 docker desktop

    安装完后运行提示 wsl 版本过低,docker 启动失败了。谷歌一下原来 wsl 是从 windows10 开始支持的 Linux 子系统,可以在 windows 上直接执行 Linux 二进制文件。顺手安装了一下 vscode 的 wsl 插件(不知道有什么用)

解决方法

根据提示运行 wsl --update 结果 --update 不是有效参数!!!

于是进入 微软网站 ,下载 wsl2 更新包 ,安装后重启系统

  1. 把教程中的 练手应用 clone 下来

    git clone --depth 1 https://github.com/docker/getting-started.git
  2. 在 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"]

    Dockerfile 语法

    Dockerfile 最佳实践

    Dockerfile reference

  3. 运行以下命令,创建 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 重新编译了一下

  4. 运行容器,访问 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
  5. 跟着 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) 小很多

  6. 可以在 docker hub 中搜索镜像运行

  7. Docker Compose 说有了它可以一次启动多个容器,示例应用

    克隆下来:

    git clone --depth 1 https://github.com/docker/multi-container-app

公司电脑安装 docker desktop

2024-08-28

貌似 docker 在 windows 上运行有两种模式

  1. wsl 2

    这里要注意 bios 需要启用 虚拟化 功能,公司电脑默认没启用,所以跑不起来

  2. 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 .

理解

  1. 需要在不同平台安装 docker
  2. 可以在任意平台制作 docker 镜像,docker 镜像中包含了应用运行时需要的所有依赖
  3. docker 镜像可以在任意安装了 docker 的平台运行
  4. docker 容器是一个隔离的沙盒环境,docker 镜像在容器中运行
  5. 2024-08-28 Dockerfile 在构建的时候会缓存每一步,如果拷贝的文件没有发生变化不会执行后面的命令

踩坑日记

  • ARG NODE_ENV=production 设置环境变量后,npm install 不会安装开发依赖,导致后续 webpack 命令找不到
  • 命令行构建镜像时无法下载源镜像,先登录 docker login