Docker notes 01

February 3, 2026

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。