Docker技巧
Docker命令常用技巧
- 删除容器
docker rm 容器id
- 重启docker容器
docker restart my-nginx
- 进入nginx容器终端
# 进入nginx容器终端
docker exec -it my-nginx sh
docker exec -it 容器id sh
- 运行容器
# 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即可访问
# 排查指定的容器
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
| 指令 | 示例 | 解释与功能 |
|---|---|---|
| FROM | FROM ubuntu:18.04 | 指定基础镜像,用作新镜像的基础。 |
| MAINTAINER | MAINTAINER John Doe | 标记维护镜像的人员信息(已被LABEL取代)。 |
| LABEL | LABEL maintainer="John Doe" | 添加自定义元数据标签到镜像,如维护者信息、版本等。 |
| RUN | RUN apt-get update && | 在容器内执行命令。通常用于安装软件、配置环境。 |
| CMD | CMD ["executable","param1"] | 容器启动后默认执行的命令。可被docker run命令行参数覆盖。 |
| ENTRYPOINT | ENTRYPOINT ["executable"] | 容器启动时始终执行的命令。与CMD不同,CMD会被覆盖,而ENTRYPOINT则会成为执行的命令的前缀。 |
| EXPOSE | EXPOSE 80 | 指定容器内应用程序使用的端口。在运行容器时,可以使用-p或者-P参数映射这些端口到主机。 |
| ENV | ENV MY_ENV_VAR=value | 设置环境变量,供容器内的应用程序使用。 |
| ADD | ADD src dest | 将本地文件/目录复制到容器中。如果src为URL,也可以用来下载并复制文件。 |
| COPY | COPY src dest | 类似于ADD,但只支持复制本地文件/目录。推荐使用COPY,除非需要自动解压缩远程文件或使用URL。 |
| WORKDIR | WORKDIR /path/to/directory | 设置容器内工作目录,后续命令将在此目录下执行。 |
| VOLUME | VOLUME /data | 声明持久化数据卷,用于容器内外的数据交换。【可理解为挂载数据】 |
| USER | USER username | 指定容器内部运行命令的用户名或UID。 |
| HEALTHCHECK | HEALTHCHECK CMD | 添加容器健康检查指令,用于检测容器是否运行正常。 |
| ARG | ARG build_version | 声明构建时传递的参数,类似于环境变量,但仅在构建过程中有效。 |
| ONBUILD | ONBUILD COPY | 在当前Dockerfile的基础上创建新的镜像时执行的命令。 |
| STOPSIGNAL | STOPSIGNAL SIGTERM | 设置容器停止时发送的信号。 |
| RUN | RUN command | 可以多次使用,每次都会在镜像构建期间执行。 |
| CMD | CMD 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 多阶段构建 为了 减少最终镜像体积
# 构建阶段
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),你想让它们一起跑起来。
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端口