跳到主要内容

Docker技巧

Docker命令常用技巧​

  • 删除容器
bash
docker rm 容器id
  • 重启docker容器
bash
docker restart my-nginx
  • 进入nginx容器终端
bash
# 进入nginx容器终端
docker exec -it my-nginx sh
docker exec -it 容器id sh
  • 运行容器
bash
# docker run -d -p 宿主端口:容器端口 app-demo:latest
docker run -d -p 80:3000 app-demo:latest

注意这里的容器端口,比如这里通过命令端口映射了3000,那么在容器内启动的服务也需要3000端口,否则无法访问容器的服务

  • 比如在nuxt的ecosystem.config.cjs的配置了端口是3000,那么这里的端口映射需要和这里对应上

可能出现的问题

  • 已经运行了docker容器,docker run -d -p 3002:3000 nuxt-demo:latest,但是在浏览器打开http://127.0.0.1:3002/,显示无法访问?
    • 最大的原因可能是这里的指定的端口映射3000,和启动容器服务的端口对应不上
    • 因为在ecosystem.config.cjs的配置了端口是3001,而映射的端口是3000,导致无法匹配,因此将ecosystem.config.cjs的配置了端口修改为3000即可访问
bash
# 排查指定的容器
docker ps -a | grep nuxt-demo
# 查看容器的日志
docker logs 容器id
# 重新修改配置之后,停止并删除当前容器
docker stop 容器id
docker rm 容器id
docker run -d -p 3002:3000 nuxt-demo:latest

Dockerfile前端常用配置​

  • FROM
  • WORKDIR
  • RUN
  • EXPOSE
  • ENV
  • CMD
指令示例解释与功能
FROMFROM ubuntu:18.04指定基础镜像,用作新镜像的基础。
MAINTAINERMAINTAINER John Doe标记维护镜像的人员信息(已被LABEL取代)。
LABELLABEL maintainer="John Doe"添加自定义元数据标签到镜像,如维护者信息、版本等。
RUNRUN apt-get update &&在容器内执行命令。通常用于安装软件、配置环境。
CMDCMD ["executable","param1"]容器启动后默认执行的命令。可被docker run命令行参数覆盖。
ENTRYPOINTENTRYPOINT ["executable"]容器启动时始终执行的命令。与CMD不同,CMD会被覆盖,而ENTRYPOINT则会成为执行的命令的前缀。
EXPOSEEXPOSE 80指定容器内应用程序使用的端口。在运行容器时,可以使用-p或者-P参数映射这些端口到主机。
ENVENV MY_ENV_VAR=value设置环境变量,供容器内的应用程序使用。
ADDADD src dest将本地文件/目录复制到容器中。如果src为URL,也可以用来下载并复制文件。
COPYCOPY src dest类似于ADD,但只支持复制本地文件/目录。推荐使用COPY,除非需要自动解压缩远程文件或使用URL。
WORKDIRWORKDIR /path/to/directory设置容器内工作目录,后续命令将在此目录下执行。
VOLUMEVOLUME /data声明持久化数据卷,用于容器内外的数据交换。【可理解为挂载数据】
USERUSER username指定容器内部运行命令的用户名或UID。
HEALTHCHECKHEALTHCHECK CMD添加容器健康检查指令,用于检测容器是否运行正常。
ARGARG build_version声明构建时传递的参数,类似于环境变量,但仅在构建过程中有效。
ONBUILDONBUILD COPY在当前Dockerfile的基础上创建新的镜像时执行的命令。
STOPSIGNALSTOPSIGNAL SIGTERM设置容器停止时发送的信号。
RUNRUN command可以多次使用,每次都会在镜像构建期间执行。
CMDCMD command只能在Dockerfile中使用一次,指定容器启动时要运行的命令。

Docker前端部署常用配置​

  • 基础镜像选择:优先选择官方、轻量级(如 alpine)镜像,减小体积。

  • 多阶段构建:前端项目推荐用多阶段构建,先用 Node 镜像打包,再用 Nginx 镜像托管静态资源,减小最终镜像体积。

  • 缓存优化:先 COPY package.json,再 RUN npm install,最后 COPY 代码,充分利用缓存。

  • .dockerignore:忽略 node_modules、dist、.git 等无关文件,加快构建速度。

  • 暴露端口:EXPOSE 80,明确容器对外服务端口。

  • 健康检查:HEALTHCHECK 指令可用于容器健康监控。

  • 环境变量:ENV 设置运行时变量,ARG 设置构建时变量。

  • 卷挂载:-v 参数挂载本地目录,实现数据持久化或代码热更新。

前端项目多阶段构建​

  • 定义多个FROM, 实现多阶段构建
    • 构建阶段 (安装依赖、打包)
    • 生产阶段 *(启动服务)
  • Docker 多阶段构建 为了 减少最终镜像体积
bash
# 构建阶段
FROM node:16-alpine as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# 生产阶段
FROM nginx:stable-alpine as production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Docker Compose部署​

例子​

  • 假设

    你有一个前端(nginx)和一个后端(nodejs),你想让它们一起跑起来。

yam
version: '3'
services:
frontend:
image: nginx:stable-alpine
ports:
- "8080:80" # 把本机8080端口映射到容器的80端口
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf # 挂载本地nginx配置
depends_on:
- backend # 依赖后端服务

backend:
image: node:16
working_dir: /app
volumes:
- ./server:/app # 挂载本地server目录到容器/app
command: npm start # 启动命令
ports:
- "3000:3000" # 本机3000端口映射到容器3000端口