【docker0基础教学】手把手教你将你的本地项目进行docker部署
在Dockerfile的最后我们会用到CMD来指定**当Docker容器运行起来以后要执行的命令**。大家需要注意这里容器和镜像的区别,并且它和我们之前讲到的RUN不一样:**RUN是创建镜像时候使用的,而CMD是运行容器的时候使用的。**
你好呀,很高兴你来。我是一名大三计算机小菜~,我在这里分享我的平凡经历。感谢你的陪伴。
前提摘要:已经安装了Windows版Docker Desktop. ⬅️你可以点击进入官网下载安装。
在项目根目录下创建 dockerfile
Form | 指定一个基础镜像
- 首先我们在应用的根目录下创建一个Dockerfile文件。第一行我们需要用FROM命令指定一个基础镜像,这样可以帮我们节省许多软件安装配置的时间。
在Docker Hub:Docker Hub Container Image Library | App Containerization上提供了许多高质量的操作系统镜像,比如Ubuntu、Debian、Fedora、Alpine等等。不同的操作系统提供不同的包管理工具,比如APT、YUM、DNF等。但是在Docker Hub上还有许多方便某一种语言、某种框架开发的镜像,比如Nginx、Redis、Node、Python、Tomcat等等。

由于这里我做的是Python应用的开发,我会使用Python的镜像,这样免去了安装步骤。这里的"python"是官方镜像的名字,冒号后面这一串是版本号,同时也是一个标签。我们可以点击"python"转到Docker Hub的镜像页面,里面可以找到所有支持的标签。
FROM python:3.10-slim-bullseye as builder

WORKDIR | 设置工作目录
# 使用多阶段构建
FROM python:3.10-slim-bullseye as builder
# 设置工作目录
WORKDIR /app
后面的WORKDIR指定了之后所有Docker命令的工作路径(注意是这个命令之后的所有Docker命令,比如我们马上要讲到的RUN、COPY等等)。当然如果这个路径不存在,Docker会帮你自动创建。这样可以避免使用绝对路径或者手动cd切换路径,增加程序的可读性。
COPY |拷贝依赖文件⭐️
- 之后呢,我们可以调用COPY命令将所有的程序拷贝到Docker镜像中。第一个参数代表本地的依赖文件requirements.txt。根据你的不同项目选择不同的依赖文件:
| 语言 | 依赖文件 | 工具/命令 |
|---|---|---|
| Python | requirements.txt |
pip install -r requirements.txt |
pyproject.toml (PDM/Poetry) |
pdm install / poetry install |
|
| Node.js | package.json + package-lock.json |
npm install |
| Go | go.mod + go.sum |
go mod tidy |
| Java | pom.xml (Maven) |
mvn install |
build.gradle (Gradle) |
gradle build |
|
| Rust | Cargo.toml + Cargo.lock |
cargo build |
【如果你使用pdm,建议生成requirements.txt。因为在docker安装的Python镜像中是不包含pdm的,需要额外下载。】 |
- 开发环境依赖
pdm export -f --without-hashes requirements -o requirements.txt
- 生产环境依赖
pdm export --prod --without-hashes -o requirements.txt
- 第二个参数“.”代表Docker镜像中的路径(这里的"."代表当前的工作路径,也就是之前指定的/app目录)。
# 使用多阶段构建
FROM python:3.10-slim-bullseye as builder
# 设置工作目录
WORKDIR /app
# 首先只复制依赖相关文件
COPY requirements.txt .
RUN | 运行shell
随后的RUN允许我们在创建镜像时运行任意的shell命令。因为我们用的是Linux镜像,所以像echo、pwd、cp、rm这些都是合法的。比如这里我用的"pip install"来安装Python程序的所有依赖。
参数https://pypi.tuna.tsinghua.edu.cn/simple 指定了清华镜像源,这不仅下载依赖更快,还能避免掉很多很多问题(这坑死我了)
```dockerfile
# 使用多阶段构建
FROM python:3.10-slim-bullseye as builder
# 设置工作目录
WORKDIR /app
# 首先只复制依赖相关文件
COPY requirements.txt .
# 安装依赖
RUN pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
- 当然这里也是根据你的项目来决定:
| 语言 | 依赖文件 | RUN |
|---|---|---|
| Python | requirements.txt |
pip install -r requirements.txt |
pyproject.toml (PDM/Poetry) |
pdm install / poetry install |
|
| Node.js | package.json + package-lock.json |
npm install |
| Go | go.mod + go.sum |
go mod tidy |
| Java | pom.xml (Maven) |
mvn install |
build.gradle (Gradle) |
gradle build |
|
| Rust | Cargo.toml + Cargo.lock |
cargo build |
COPY . . |复制全部项目文件
```dockerfile
# 使用多阶段构建
FROM python:3.10-slim-bullseye as builder
# 设置工作目录
WORKDIR /app
# 首先只复制依赖相关文件
COPY requirements.txt .
# 安装依赖
RUN pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
# 复制全部项目文件
COPY . .
EXPOSE |暴露端口
# 使用多阶段构建
FROM python:3.10-slim-bullseye as builder
# 设置工作目录
WORKDIR /app
# 首先只复制依赖相关文件
COPY requirements.txt .
# 安装依赖
RUN pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
# 复制项目文件
COPY . .
# 暴露端口
EXPOSE 8080
CMD |启动命令
- 通过以上的所有命令,我们就可以完成一个Docker镜像的创建。
- 在Dockerfile的最后我们会用到CMD来指定当Docker容器运行起来以后要执行的命令。大家需要注意这里容器和镜像的区别,并且它和我们之前讲到的RUN不一样:RUN是创建镜像时候使用的,而CMD是运行容器的时候使用的。
因为我的项目是fastapi,使用了uvicorn这个web框架。
我的项目启动的命令是 uvicorn src.main:app --host 0.0.0.0 --port 8080
这里可以根据你的项目启动命令来编写它。
# 使用多阶段构建
FROM python:3.10-slim-bullseye as builder
# 设置工作目录
WORKDIR /app
# 首先只复制依赖相关文件
COPY requirements.txt .
# 安装依赖
RUN pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
# 复制项目文件
COPY . .
# 暴露端口
EXPOSE 8080
# 启动命令
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]
至此dockerfile编写完成
有了 dockerfile,我们便可以开始构建docker镜像↓
构建镜像
-t 或 --tag 参数,用于给构建的镜像打上标签。这是你为镜像指定的名字,`
构建镜像
docker build -t fastapi .
-
接下来我们可以使用"docker build"来创建一个镜像。这里的"-t"指定了我们镜像的名字,可以根据你的喜好修改。我的名为
fastapi;最后面的"."告诉Docker应该在当前目录下寻找这个Dockerfile,这个不能漏了。 -
第一次调用"docker build"会比较慢,因为Docker会下载必要的镜像文件,然后一行行运行我们的指令。不过再次调用就会快很多,因为Docker会缓存之前的每一个操作。

运行容器
有了镜像以后,我们可以通过"docker run"来启动一个容器。
这里需要注意的是"-p"参数,它会将容器上的某一个端口映射到你的本地主机上。前面的80是我们本地主机上的端口,后面是容器上的端口,这个不要搞反了。第二个参数"-d"让容器在后台运行,这样容器的输出就不会直接显示在控制台。
docker run -d -p 8000:8080 fastapi
- 这样设置后,你就可以通过访问 http://localhost:8000 来访问容器内运行的 FastAPI 应用了。
- 你也可以在 Docker Desktop 中看到它们
创建、挂载数据卷
如果我们希望保留容器中的数据,我们可以使用Docker提供的Volume(数据卷)。你可以把它当做是一个共享文件夹。比如你在容器中修改了某一个Volume的数据,它会同时反映在其他的容器上
- 更多好用进阶方法可以查看这里:
手工原创0基础手把手教你将你的本地项目进行docker部署基于Docker的本地项目部署指南
关于作者
- CSDN 大三小白新手菜鸟咸鱼本科生长期更新强烈建议不要关注!
作者的其他文章
RAG调优|AI聊天|知识库问答
- 你是一名平平无奇的大三生,你投递了简历和上线的项目链接,结果HR真打开链接看!结果还报错登不进去QAQ!【RAG知识库问答系统】新增模型混用提示和报错排查【用户反馈与优化-2025.04.28-CSDN博客
- 你知不知道像打字机一样的流式输出效果是怎么实现的?AI聊天项目实战经验:流式输出的前后端完整实现!图文解说与源码地址(LangcahinAI,RAG,fastapi,Vue,python,SSE)-CSDN博客
- 【豆包写的标题…】《震惊!重排序为啥是 RAG 调优杀手锏?大学生实战项目,0 基础也能白嫖学起来》(Langchain-CSDN博客
- 【Langchain】RAG 优化:提高语义完整性、向量相关性、召回率–从字符分割到语义分块 (SemanticChunker)-CSDN博客
- 【RAG】向量?知识库的底层原理:向量数据库の技术鉴赏 | HNSW(导航小世界)、LSH、K-means-CSDN博客
Agent
docker
Python
前端
nginx
好用插件
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)