Skip to content
zhongpeng

Docker notes 01

Dockerfile

从基础镜像开始,执行安装依赖、拷贝代码、配置环境、启动应用等操作,每一步指令都会生成一个镜像层,最终所有层叠加成完整镜像。能够进行缓存复用,如果后续构建指令和文件未发生变化则可以直接复用实现增量更新。 所以尽量将不常变化的指令写在前面(基础依赖等),拷贝项目代码等放在后面。

FROM 用于指定基础镜像

FROM <镜像名>:<标签>
# 构建空镜像
FROM scratch

优先选择alpine 版本的基础镜像(体积小、轻量化、安全性高),避免用 latest 标签(版本不固定,易导致构建不一致)。

# 指定容器内工作目录,后续指令的相对路径都基于此目录
# WORKDIR /app
WORKDIR <容器内目录路径>
# COPY <源路径> <目标路径>
# 第一个. 表示当前目录下的所有文件
# 第二个. 表示WORKDIR目录
COPY . .

分层复制

先单独构建依赖,后续主要代码变更不需要再次安装依赖。

WORKDIR /app
# 先只复制依赖清单
COPY requirements.txt .
# 安装依赖 (缓存)
RUN pip install -r requirements.txt
# 最后再复制剩下的源代码
COPY . .
# 启动命令
CMD ["uvicorn", ...]

.dockerignore

用法与 .gitignore 的使用相同,可以忽略 .env node_modules 文件。

Main

  1. Image构建命令
docker build .
# docker build -t <镜像名:标签名>
docker build -t app .
docker build -t app:v1 .
docker build -t app:latest .
# 推送到Docker Hub:用户名/镜像名:标签
docker build -t username/my-app:v1.0 .
# 推送到私有仓库:仓库地址/镜像名:标签
docker build -t 192.168.1.100:5000/my-app:v1.0 .
# 不适用缓存构建
docker build --no-cache -t app:v1.0 .
# 查看本地所有镜像
docker images
# 过滤指定镜像
docker images app
  1. Container
# 默认占用终端前台运行
docker run <镜像名/镜像ID>
docker start
docker stop
# -d 后台运行
# --name 指定容器名称
docker run -d --name <容器自定义名称> <镜像名:标签>
# -p 宿主机端口号:容器内端口
docker run -d --name my-nginx -p 8080:80 nginx:latest
# 启动已停止的容器(通过名称/ID)
docker start my-nginx
# 停止运行中的容器
docker stop my-nginx
# 重启容器
docker restart my-nginx
# 删除停止的容器(-f 强制删除运行中的容器)
docker rm my-nginx
docker rm -f my-nginx # 强制删除
# 批量删除所有停止的容器
docker container prune
--restart always # 总是重启(容器退出/宿主机重启后都自动启动)
--restart on-failure # 容器异常退出(退出码非0)时重启
--restart unless-stopped # 除非手动docker stop,否则一直重启(推荐生产环境)

查询启动后状态

# 查看运行中的容器
docker ps
# 查看所有容器(运行+停止)
docker ps -a
# 查看容器日志(-f 实时跟踪日志,适合排障)
docker logs my-nginx
docker logs -f api-server
# 查看容器详细信息(IP、挂载、网络等)
docker inspect my-nginx
  1. Volume 挂载数据卷

Windows/Mac 宿主机路径需用绝对路径,Windows 用/c/Users/xxx/(而非C:\Users\xxx\),Mac 用/Users/xxx/

# 宿主机绝对路径
-v /宿主机绝对路径/目录:容器内路径
-v 自定义卷名:容器内路径
# MySQL持久化
docker run -d --name my-mysql -p 3306:3306 \
-v /usr/local/mysql/data:/var/lib/mysql \ # 持久化数据
-v /usr/local/mysql/conf:/etc/mysql/conf.d \ # 挂载配置
-e MYSQL_ROOT_PASSWORD=123456 \ # 设置root密码(MySQL镜像要求必传)
mysql:8.0
# Nginx:宿主机/html目录映射容器/usr/share/nginx/html(修改宿主机html即可更新页面)
docker run -d --name my-nginx -p 8080:80 -v /usr/local/nginx/html:/usr/share/nginx/html nginx
  1. Repository

类似Github,我们可以自己上传image到Docker Hub,这样我们可以Pull别人的镜像,别人也可以拉取我们的镜像文件了。

# 把本地的 count 镜像,复制一份,贴上 xiaoming/count:v1.0 的标签
docker tag count joneleee/count:v1.0
# 推送
docker push joneleee/count:v1.0
# 拉取
docker pull xiaoming/count:v1.0

映射

  1. 端口映射

-p 8080:8000 将本机的8080端口连接到Docker的8000端口

  1. 挂载卷

-v ${PWD}/data:/app/data 把本机的 data 文件夹 映射到 容器内部的 /app/data。

© 2026 zhongpeng LI