Skip to content

Docker 常用命令

以下命令涵盖了将一个本地项目打包成 docker 镜像,并运行、导出。然后在其它主机上导入镜像,并通过挂载本地项目文件夹的方式对镜像进行修改、构建。也可将镜像内的文件导出到本地进行二次开发。

初始化 Dockerfile

bash
docker init

根据提示完成镜像文件初始化,需要自己手动在 Dockerfile 中处理 WORKDIR 创建时的权限问题。

一个 Dockerfile 示例如下:

bash
ARG NODE_VERSION=18

FROM node:${NODE_VERSION}-alpine

# Use production node environment by default.
ENV NODE_ENV production

# 调整 WORKDIR 的权限
RUN mkdir -p /usr/src/app && chown -R node:node /usr/src/app
WORKDIR /usr/src/app

# Download dependencies as a separate step to take advantage of Docker's caching.
# Leverage a cache mount to /root/.npm to speed up subsequent builds.
# Leverage a bind mounts to package.json and package-lock.json to avoid having to copy them into
# into this layer.
RUN --mount=type=bind,source=package.json,target=package.json \
    --mount=type=cache,target=/root/.npm

# Run the application as a non-root user.
USER node

# 复制 package.json 和 package-lock.json 并安装依赖
COPY package*.json ./
RUN npm install

# Copy the rest of the source files into the image.
COPY . .

# Expose the port that the application listens on.
EXPOSE 3003

# Run the application.
CMD node index.js

打包 docker 镜像

bash
docker buildx build -t your_image_name .

导出 docker 镜像

bash
docker save -o your_image_name.tar your_image_name

生成的文件为 tar 格式,在需要的地方通过 docker load 命令导入。

导入 docker 镜像

bash
docker load -i your_image_name.tar

查看 docker 镜像

bash
docker images

运行镜像

bash
docker run -d -p 3003:3003 --name your_container_name your_image_name

查看容器运行状态

bash
docker ps

挂载本地项目运行镜像(开发阶段)

bash
docker run -d -p 3003:3003 --name your_container_name -v C:\wc\code_dev\your_project_dir:/usr/src/app -v /usr/src/app/node_modules your_image_name

C:\wc\code_dev\your_project_dir 部分表示本地项目路径,/usr/src/app 部分表示构建镜像时设置的WORKDIR目录,必须是绝对路径。

-v /usr/src/app/node_modules 表示不挂载本地的 node_modules,让容器使用自身的依赖管理。这是因为在挂载本地项目时,会出现“挂载覆盖问题”导致项目无法运行。

这里的挂载其实就是做了一个软连接,在 DD 里操作起来就像是在做一个路径映射步骤。以下用 Docker 部署 TriliumNote 演示一下,如何挂载本地数据库映射。

docker部署_挂载本地数据库映射_Volume_设置

docker部署_挂载本地数据库映射Volume_展示

验证容器内是否包含某文件夹

bash
docker exec -it your_container_name ls /usr/src/app/node_modules

进入容器访问文件

bash
docker exec -it your_container_name sh

以此进入容器终端执行,可以执行 linux 指令或者安装项目以来,比如运行 npm install 安装 node 依赖。

将容器内的项目代码保存到本地

bash
docker cp your_container_name:/YOUR_WORKDIR C:\your_local_www_dir

⏰ 在 Windows 上如果遇到报错,如:

bash
...
symlink ..\cross-env\src\bin\cross-env.js C:\your_local_www_dir\node_modules\.bin\cross-env:

A required privilege is not held by the client.
...

这通常是由于 Windows 系统的权限问题,特别是在操作符号链接(symlink)时。Windows 在创建符号链接时通常需要管理员权限或特殊权限。

以“以管理员身份运行 PowerShell”,然后再执行相同命令即可解决。

Released under the MIT License.