Docker镜像是一个可执行软件包,包含运行应用程序所需的一切。该镜像指示容器应如何实例化,确定哪些软件组件将运行以及如何运行。Docker容器是一个虚拟环境,它将应用程序代码与运行应用程序所需的所有依赖项捆绑在一起。应用程序可以在不同计算环境之间快速可靠地运行。
什么是 Docker 镜像?
Docker 镜像是使用Dockerfile](/docker/what-is-dockerfile/)构建的, Dockerfile包含一组容器化应用程序所需的指令。Docker 镜像包含以下内容以运行软件。Docker 镜像是一个独立于平台的镜像,可以在 Windows 环境中构建,并且可以将其推送到Docker Hub,并由其他使用不同操作系统(例如 Linux)的人员拉取。
-
应用程序代码。
-
运行时。
-
库文件
-
环境工具。
Docker 镜像非常轻量,因此可以轻松移植到不同的平台。为了深入了解如何在 DevOps 流水线中创建和管理 Docker 镜像,请参阅“DevOps 工程 – 从规划到生产”课程,其中涵盖了 Docker 镜像的创建、优化和部署。
Docker 镜像的组成
以下是与 Docker Image 相关的术语和组件:
-
层 (Layers):不可变的文件系统层堆叠在一起形成完整的镜像。
-
基础映像:基础层,通常是最小的操作系统或运行时环境。
-
Dockerfile:包含构建 Docker 镜像的指令的文本文件。
-
镜像 ID:每个 Docker 镜像的唯一标识符。
-
标签:用于管理和版本控制 Docker 镜像的标签。
Docker Image 的子命令
以下是与 Docker Image 一起使用的一些子命令:
命令 | 描述 |
---|---|
docker 镜像构建 | 此命令用于从 Dockerfile 构建镜像 |
docker 镜像历史记录 | 它用于了解docker镜像的历史记录 |
docker 镜像检查 | 用于显示一个或多个镜像的详细信息 |
docker 镜像修剪 | 它用于删除与任何容器无关的未使用的镜像 |
docker 镜像保存 | 此命令有助于将 docker 镜像保存到 tar 归档文件中 |
docker 镜像标签 | 它有助于为目标镜像创建引用源镜像的标签。 |
Docker 镜像修剪
Docker image prune 是在docker主机上使用的命令,用于删除未使用的镜像,或者使用Docker image prune命令来删除未使用的docker镜像。
docker image prune
- 所有未使用的镜像也称为悬空镜像,它们不与任何容器关联
Docker 镜像构建
以下是用于构建docker镜像的命令。
docker build -t your_image_name:tag -f path/to/Dockerfile .
-
Docker 构建:启动构建过程。
-
-t your_image_name:tag:为您正在创建的镜像提供名称,如果需要,还可以提供标签。
-
path/to/Dockerfile . :指定Dockerfile 的位置。如果不在当前目录中,请提供正确的路径。“(.)DOT”代表当前路径。
Docker 镜像标签
Docker 标签是容器镜像的标签,用于在开发和部署过程中区分镜像的版本和变体。Docker标签可以帮助您识别 Docker 镜像的不同版本,并帮助区分它们。Docker 镜像将帮助我们快速构建持续部署
Docker 镜像的用途
Docker Images 的用途如下:
-
我们可以借助 docker 镜像轻松有效地运行容器。
-
所有代码、配置设置、环境变量、库和运行时都包含在 Docker 镜像中。
-
Docker 镜像与平台无关。
-
图层是镜像的构成块。
-
通过使用构建命令,用户可以选择完全从头开始或使用现有镜像作为第一层。
Docker 镜像与 Docker 容器之间的区别
Docker Image 和Docker Container的区别如下:
Docker 镜像 | Docker 容器 |
---|---|
Docker 镜像是 Docker 容器的源代码。 | Docker 容器是 Docker 镜像的实例。 |
Dockerfile 是 Docker Image 的先决条件。 | Docker Image 是 Docker Container 的先决条件。 |
借助 Docker Registry,用户可以共享 Docker 镜像。 | Docker 容器不能在用户之间共享。 |
要在 Docker 镜像中进行更改,我们需要在 Dockerfile 中进行更改。 | 我们可以直接与容器交互并进行所需的更改。 |
Docker镜像的结构
组成 Docker 镜像的软件层使得配置执行容器所需的依赖项变得更加容易。
-
基础镜像:基础镜像将成为大多数 Dockerfile 的起点,可以从头开始制作。
-
父镜像:父镜像是我们的镜像所基于的镜像。我们可以使用FROM命令在 Dockerfile 中引用父镜像,之后的每个声明都会影响父镜像。
-
层: Docker 镜像有多个层。为了创建一系列中间镜像,每个层都会在前一个层之上创建。
-
Docker Registry:请参阅Docker Registry上的此页面以获取更多信息。
如何创建 Docker 镜像并将其作为容器运行?
按照以下步骤创建 Docker 镜像并运行容器:
步骤 1:创建 Dockerfile。
第 2 步:在终端中运行以下命令,它将创建应用程序的 docker 镜像并下载应用程序成功运行所需的所有必要依赖项。
docker build -t <name>:<tag>
这将开始构建镜像。
步骤 3: 我们已成功为其创建了Dockerfile和相应的 Docker 镜像。
步骤 4:在终端中运行以下命令,它将创建一个包含所有所需依赖项的运行容器并启动应用程序。
docker run -p 9000:80 <image-name>:<tag>
9000 是我们想要访问应用程序的端口。80 是容器向主机公开的端口。
如何构建 Docker Python 镜像?分步指南
步骤1:创建Dockerfile
- 首先编写一个用于支持 Python 应用程序的 dockerfile,并尝试使用默认运行的 CMD 选项来运行 Python 应用程序。以下是我们在此处使用的示例 dockerfile:
# Use the official Python image as a base
FROM python:3.9-slim
# Set the working directory in the container
WORKDIR /app
# Copy the current directory contents into the container at /app
COPY . /app
# Install any needed dependencies specified in requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
# Make port 80 available to the world outside this container
EXPOSE 80
# Define environment variable
ENV NAME World
# Run app.py when the container launches
CMD ["python", "app.py"]
第 2 步:创建 requirements.txt 和 app.py 文件
- 尝试提供 requirements.txt 文件,其中指定了所需软件的名称,并提供了 app.py 文件,用于编写 Python 应用程序。以下是 requirements.txt 和 app.py 的示例代码。
文件名:requirements.txt
Flask==2.1.0
Werkzeug==2.1.2 # 确保与 Flask 2.1.0 兼容
文件名:app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=80)
步骤3:构建Docker镜像
- 以下命令用于从 Dockerfile 构建 docker python 镜像:
docker image build -t mypython-app:v1 .
- 下面实际展示了如何从Dockerfile构建基于python的docker镜像:
步骤 4:验证 Docker 镜像
- 使用以下命令验证docker应用程序是否构建成功:
docker images
- 以下屏幕截图显示了基于 python 的 docker 镜像成功构建。
步骤5:运行基于Python的Docker容器
- 使用以下命令将容器运行到该 docker python 映像:
docker run -dit -p 80:80 --name mycontainer1 mypython-app:v1
- 以下命令是成功运行该基于python的docker容器:
步骤 6:访问 Docker 容器
- 现在,尝试使用主机系统的公网 IP 和暴露的端口访问 docker 容器,看看容器化的 Python 应用程序是否成功运行。以下截图展示了访问成功的情况。
Docker 镜像命令
以下是一些广泛使用的 Docker 镜像命令:
列出 Docker 镜像
docker images
例子
$ docker ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 0d9c6c5575f5 4 days ago 126MB
ubuntu 18.04 47b199b0cb85 2 weeks ago 64.2MB
从镜像仓库中拉取 Docker 镜像
docker image pull <image-name>
例子
$ docker pull alpine:3.11
3.11: Pulling from library/alpine
Digest: sha256:9f11a34ef1c67e073069f13b09fb76dc8f1a16f7067eebafc68a5049bb0a072f
Status: Downloaded newer image for alpine:3.11
Docker 镜像 Prune
- Docker Image Prune 将删除未使用且未与任何容器关联的 Docker 镜像。命令如下:
docker image prune
Docker 镜像过滤器
- 当我们想要过滤某些特定镜像时,可以使用选项 –filter,通过其标签或元信息标签过滤掉它们。命令如下:
docker image ls -f "reference=mypython-app"
从 Docker 中删除镜像
- 以下命令用于从本地注册表中删除 docker 镜像:
docker rmi <id-of-image>
例子
$ docker rmi <image_id>
Untagged: <image_id>
Deleted: sha256:<image_id>
在 Docker Hub 上搜索特定镜像
docker search ubuntu
例子
$ docker search ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating s... 4458 [OK]
ubuntu-upstart Upstart is an event-based replacement for ... 62 [OK]
tutum/ubuntu Simple Ubuntu docker images with ssh access 49 [OK]
ansible/ubuntu14.04-ansible
Docker 镜像的最佳实践
以下是使用 Docker 镜像的一些最佳实践:
-
优化镜像大小:尝试使用多阶段构建和最小基础镜像来减小镜像大小。
-
利用缓存:通过对指令进行排序(例如先排列变化较少的指令,再排列变化频繁的指令),我们可以最大限度地利用缓存并加快构建速度。
-
保持镜像安全:通过定期更新镜像和扫描漏洞,我们可以确保镜像的安全。
-
明智地使用标签:通过练习对镜像使用特定标签而不是指定最新标签,我们可以确保稳定性和一致性。
解决与 Docker 镜像相关的常见问题
以下是一些与docker镜像相关的常见问题的排查:
-
大镜像尺寸:使用多阶段构建并清理不必要的文件以减小镜像尺寸。
-
依赖冲突:通过在 Dockerfile 中指定依赖项的确切版本来确保兼容性。
-
构建失败:检查 Dockerfile 语法和命令的正确性,并验证是否包含所有必需的文件。
-
性能缓慢:优化 Dockerfile 指令顺序并利用缓存来缩短构建时间。