一种容器技术,解决跨环境迁移问题
核心概念
- 镜像: 容器的模板 (模具)
- 容器: 镜像的实例 (糕点)
- 镜像仓库: 存储镜像的中心仓库 (模具库)
相关命令行
1 | docker --version # 查看docker 版本 安装成功 |
dockerfile

dockerfile 是一个文件,用于描述如何构建一个镜像
制作镜像步骤
实际脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18docker_test/main.py
# 启动一个fastapi服务,默认端口为8000
import uvicorn
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
docker_test/requirements.txt
fastapi
uvicorn创建Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15docker_test/Dockerfile
# 注意Dockerfile 是一个文本文件,所有命令都大写,不带任何后缀
# 指定基础镜像为python:3.13-slim
FROM python:3.13-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
EXPOSE 8000
CMD ["python3", "main.py"]构建镜像
1
2
3
4
5
6
7docker build -t docker_test . # 在docker_test 目录下,构建镜像,镜像名称为docker_test
docker run -d -p 8000:8000 docker_test # 启动容器,映射端口8000:8000,容器名称为docker_test,本地测试
docker login # 登录docker 镜像仓库,需要输入用户名和密码,登录后即可推送镜像到仓库
docker build -t yoohannah/docker_test . # 在docker_test 目录下,重新构建携带用户名的镜像,镜像名称为yoohannah/docker_test,这里用户名充当namespace作用
docker push yoohannah/docker_test # 推送镜像到仓库查找使用
在https://hub.docker.com/ 查找yoohannah/docker_test1
docker pull yoohannah/docker_test
其他人即可以使用刚刚创建的镜像
docker 网络
默认bridge ,桥接模式
容器内部有容器网络,容器可以根据分配的IP 地址进行通信
容器网络和宿主机网路隔离
1 | docker network create network1 # 创建一个子网network1, 属于bridge 模式一种 |
可以指定容器加入不同子网,
在不同子网的容器之间不能直接通信,
在相同子网的容器之间可以相互通信,docker 子网内部有一个dns机制,可以把名字转成IP地址
因此,同一个子网的容器,可以直接使用容器名字互相访问,而不必使用IP地址
1 | docker run -d --name docker_test --network network1 docker_test |
host 模式
docker 容器直接共享宿主机的网络
容器直接使用宿主机的IP地址,无-p 映射端口,容器服务直接运行在宿主机的端口上
通过宿主机的IP地址和端口,可以直接访问到容器的服务
mac 需要开启设置
开启路径是:Settings → Resources → Network → Enable host networking。1
2
3
4
5
6
7docker run -d --network host nginx
# 进入容器内部 产看ip 信息
docker exec -it ae2a9a90a075 /bin/sh
apt-get update
apt-get install iproute2 -y
ip addr show# 查看容器内ip 信息
直接用宿主机的IP地址和端口,可以直接访问到容器的服务1
http://127.0.0.1:80
none 模式
容器不联网
查看docker 网络
1 | docker network list # 展示所有docker网络 |
docker compose
容器编排技术
使用yml文件管理多个容器,里面列出了容器之间是如何创建以及如何协同工作的
docker compose 文件可以被理解成一个多个docker run 命令 按照特定格式列到了一个文件中
docker 为每一个 compose 文件会自动创建子网,同一个 compose 文件中定义的所有容器自动加入同一个子网,所以在文件中不用二外写入网络创建和指定子网
compose 文件 可以自定义容器启动顺序

1 | # 当前目录下有docker-compose.yaml 文件 |
动手操作 部署nextjs 项目到docker 容器
官方文档:https://docs.docker.com/guides/nextjs
1 | // 创建项目 |
下面进入主要部署阶段将项目打包,打包产物放到docker 里面的ngnix 容器中,然后通过端口转发进行访问
即打包静态产物上传服务器后,修改ngnix配置指向这个目录,即可访问到项目
准备工作
使用合适node 版本,防止镜像生成失败
1 | # 看下当前本地node 版本 |
方式一: Next.js with standalone output
这种方式将nextjs项目打包成node服务,适合全栈场景
Standalone output (output: “standalone”) makes Next.js build a self-contained output that includes only the files and dependencies needed to run the application. A single node server.js can serve the app, which is ideal for Docker and supports server-side rendering, API routes, and incremental static regeneration. For details, see the Next.js output configuration documentation (including the “standalone” option).
The container runs the Next.js server with Node.js on port 3000.
next.config.ts
1 | // next.config.ts |
复制官网dockerfile 修改node 版本
1 |
|
构建镜像
本地构建运行镜像后,上传到docker 仓库 ,下载测试1
2
3
4
5
6
7docker build -t nextjs-standalone .
docker run -d -p 8000:3000 nextjs-standalone
docker build -t yoohannah/nextjs-standalone .
docker push yoohannah/nextjs-standalone
docker pull yoohannah/nextjs-standalone
docker run -d -p 8002:3000 yoohannah/nextjs-standalone
方式二: Next.js with export output
这种方式将nextjs项目打包成静态文件, 适合静态网站部署
准备工作
依赖 nginxinc/nginx-unprivileged 镜像
1 | docker pull nginxinc/nginx-unprivileged:alpine3.22 |
修改next.config.ts
指定打包方式为export1
2
3
4
5
6
7
8
9
10import type { NextConfig } from "next";
const nextConfig: NextConfig = {
output: "export",
trailingSlash: true,
images: {
unoptimized: true,
},
};
export default nextConfig;
复制官网dockerfile 修改node 版本
1 | # ============================================ |
创建nginx.conf 配置文件
1 | # Minimal Nginx config for static Next.js app |
创建compose.yaml 文件
1 | services: |
创建.dockerignore file
The .dockerignore file tells Docker which files and folders to exclude when building the image.
注意跟打包不同,打包的时候,output = export 的时候会将所有静态文件打包到out 目录下,
如果项目中有api 文件也会进行打包,所以当前项目将api 目录通过添加下划线前缀‘_’ 来排除, 避免打包
1 | # Dependencies (installed inside the image, never copy from host) |
生成镜像并运行
1 | docker build -t nextjs_export . |
小结
- 创建项目,npm run dev, npm run build 没问题后再开始构建镜像
- 先构建本地镜像,运行测试没问题后,再构建上传到hub 的镜像
- docker pull 获取远端镜像,后运行测试,确认正常
容器内网络测试
1 | docker run -d -p 8000:3000 yoohannah/nextjs-standalone |


























































