你好呀,很高兴你来。我是一名大三计算机小菜~,我在这里分享我的平凡经历。感谢你的陪伴。


前提摘要:已经安装了Windows版Docker Desktop. ⬅️你可以点击进入官网下载安装。

在项目根目录下创建 dockerfile

Form | 指定一个基础镜像

  1. 首先我们在应用的根目录下创建一个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等等。
    image.png
    image.png
    由于这里我做的是Python应用的开发,我会使用Python的镜像,这样免去了安装步骤。这里的"python"是官方镜像的名字,冒号后面这一串是版本号,同时也是一个标签。我们可以点击"python"转到Docker Hub的镜像页面,里面可以找到所有支持的标签。
FROM python:3.10-slim-bullseye as builder

image.png

WORKDIR | 设置工作目录

# 使用多阶段构建
FROM python:3.10-slim-bullseye as builder
# 设置工作目录
WORKDIR /app

后面的WORKDIR指定了之后所有Docker命令的工作路径(注意是这个命令之后的所有Docker命令,比如我们马上要讲到的RUN、COPY等等)。当然如果这个路径不存在,Docker会帮你自动创建。这样可以避免使用绝对路径或者手动cd切换路径,增加程序的可读性。

COPY |拷贝依赖文件⭐️

  1. 之后呢,我们可以调用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
  1. 第二个参数“.”代表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会缓存之前的每一个操作。
    image.png

运行容器

有了镜像以后,我们可以通过"docker run"来启动一个容器。
这里需要注意的是"-p"参数,它会将容器上的某一个端口映射到你的本地主机上。前面的80是我们本地主机上的端口,后面是容器上的端口,这个不要搞反了。第二个参数"-d"让容器在后台运行,这样容器的输出就不会直接显示在控制台。

docker run -d -p 8000:8080 fastapi
  • 这样设置后,你就可以通过访问 http://localhost:8000 来访问容器内运行的 FastAPI 应用了
  • 你也可以在 Docker Desktop 中看到它们

创建、挂载数据卷

如果我们希望保留容器中的数据,我们可以使用Docker提供的Volume(数据卷)。你可以把它当做是一个共享文件夹。比如你在容器中修改了某一个Volume的数据,它会同时反映在其他的容器上

关于作者

  • CSDN 大三小白新手菜鸟咸鱼本科生长期更新强烈建议不要关注

作者的其他文章

RAG调优|AI聊天|知识库问答

Agent

docker

Python

前端

nginx

好用插件

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐