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 演示一下,如何挂载本地数据库映射。
验证容器内是否包含某文件夹
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”,然后再执行相同命令即可解决。