为什么需要Docker
有时我们在本地开发好程序并成功运行之后,却在服务器上运行不起来,通过观察日志通常会发现,哦原来是这个库没安装,于是我们就需要先安装需要用到的库,然后再启动服务你可能还会发现用到的数据库信息或者 API 密钥缺失,于是你需要添加配置文件,最后启动服务又发现安装的库版本不行,于是你又开始升本或者降本.....诸如此类的繁琐的操作可能还会因为服务器的OS不同而差生其他错误。想想就头疼🤕。于是便产生了诸如Docker这样的技术。
什么是Docker
Docker 是一个开源的平台,用于开发、部署和运行应用程序。它通过使用容器技术来实现应用程序的隔离和打包,使得应用程序可以在任何环境中一致地运行。Docker 容器包含了应用程序及其所有依赖项(如库、配置文件等),从而确保应用程序在不同环境中的行为一致。
Docker的基本操作
如果你还没有安装 Docker,请参照官方文档进行安装: docs.docker.com/desk...
你可以在命令行中运行 docker info 或者 docker version 来验证自己是否安装成功。
在正式开始之前,我们先来了解一下 Docker的相关概念:
- Docker 镜像(Image)是一个只读的模板,用于创建 Docker 容器。它包含了应用程序及其运行所需的所有依赖项(如代码、库、环境变量、配置文件等)。镜像是不可变的,这意味着一旦创建,就不能被修改。
- Docker 容器(Container)是从 Docker 镜像(Image)创建的一个运行实例。容器是一个轻量级、独立的可执行软件包,它包含了应用程序及其所有依赖项(如库、配置文件等),从而确保应用程序在任何环境中都能一致地运行。
-
Dockerfile:Dockerfile 是一个文本文件,里面记录着创建 Image 的详细步骤。它包含了一系列的指令,告诉 Docker 如何从头开始构建镜像。
举个简单的例子帮助你理解上述的概念:
在我们建造房屋的时候,通常需要先知道所需的材料、步骤和设计图纸构造出一副房屋的蓝图(Dockerfile)。然后根据建筑蓝图(Dockerfile),你可以预先制造出房屋的各个模块(如墙壁、屋顶、地板等)。这些模块是静态的、不可变的,一旦制造完成,就不能再修改,这就是镜像。最后Docker 容器就像是根据预制模块(镜像)建成的房屋。你可以根据预制的房屋模块(镜像)在不同的地点(主机)快速搭建出一栋完整的房屋(容器)。
镜像相关
列出镜像列表
docker images
-
REPOSITORY:表示镜像的仓库源
-
TAG:镜像标签
-
IMAGE ID:镜像ID
-
CREATED:镜像创建时间
-
SIZE:镜像大小
获取镜像
当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。
在获取之前可以先通过docker search 来查找所需要的具体镜像,或者在https://hub.docker.com/中查找后再拉取。
拉取
使用Dockerfile构建镜像
在实际的开发当中我们往往需要构建出自己项目的镜像,这时就需要用到Dockerfile文件了。
Dockerfile文件应位于项目的根目录下,文件的内容就是镜像构建的过程。
# 使用官方的 Python 基础镜像
FROM python:3.8-slim
# 设置工作目录
WORKDIR /app
# 复制当前目录下的所有文件到工作目录
COPY . /app
# 安装依赖项
RUN pip install --no-cache-dir -r requirements.txt
# 设置环境变量
ENV PYTHONUNBUFFERED=1
# 暴露应用程序运行的端口
EXPOSE 5000
# 运行应用程序
CMD ["python", "app.py"]
详细解释:
- FROM:指定基础镜像,所有 Dockerfile 必须以 FROM 指令开始。
- WORKDIR: 设置工作目录。之后的指令(如 RUN、CMD等)都会在这个目录下执行。
- COPY:将文件或目录从本机复制到容器中的指定路径。COPY 的第一个参数表示源路径,是一个相对于 Dockerfile 所在位置的路径。第二个参数是相对于工作目录的路径(当然也可以是绝对路径)
- RUN:在镜像中运行指定的命令。通常用于安装软件包或者依赖。
- ENV: 设置环境变量。
- EXPOSE: 声明容器运行时监听的端口
- CMD:指定容器启动时要运行的命令。每个 Dockerfile 只能有一个 CMD,如果指定了多个,只有最后一个生效。
更多指令可以参考官方文档
构建镜像:docker build -t 镜像名:标签 Dockerfile所在路径
删除镜像
docker rmi 镜像
可以用来删除指定镜像
容器相关
有了镜像之后就可以通过镜像启动容器。
启动容器
或者你可以以后台的方式启动,并为容器指定一个名字
成功的话你会看到类似上面的输出,这是容器的唯一id
查看容器
查看所有容器,包括运行中和停止的容器
docker ps -a
docker ps查看运行中的容器,我这里没有正在运行的。
-
CONTAINER ID:容器唯一标识符(ID)。是一个简短的哈希值,用于唯一标识每个容器。
-
IMAGE:容器所使用的镜像名称。例如,
python:3.8-slim
。 -
COMMAND:容器启动时执行的命令,可以在启动容器时覆盖。一般在Dockerfile末尾
-
CREATED:容器创建的时间。例如,
2 minutes ago
或3 days ago
。 -
STATUS:容器的当前状态。可能的状态包括:
Restarting
:容器正在重启。Paused
:容器已暂停。Exited
:容器已停止,后面通常跟着退出代码和停止时间。Up
:容器正在运行。
-
PORTS:容器的端口映射信息。显示主机端口和容器端口之间的映射关系。例如,
0.0.0.0:80->80/tcp
表示主机的 80 端口映射到容器的 80 端口。 -
NAMES:容器的名称。可以在启动容器时通过
--name
选项指定。如果没有指定,Docker 会自动生成一个随机名称。
停止容器
docker stop 容器ID(上述的CONTAINER ID字段)
删除容器
docker rm -f 容器ID
后台运行容器&进入后台运行的容器
在使用-d选项后台运行容器之后可以通过使用docker attach 或者 docker exec进入容器。
查看正在运行的容器
进入后台运行的容器docker exec
docker exec
命令会在一个正在运行的容器中启动一个新的进程,并附加到这个新进程上。这个新进程的标准输出和标准错误输出是独立的,不会显示容器主进程的输出。因此,当你使用docker exec -it
进入容器时,你看不到主进程的输出。
docker attach
查看容器的执行日志
通过docker exec进入容器并不能查看到容器的标准输出,所以我们可以通过查看容器的日志来查看
docker log -f 容器ID或名字
Docker构建镜像的原理
todo