什么是 Docker 镜像?

Docker镜像是一个可执行软件包,包含运行应用程序所需的一切。该镜像指示容器应如何实例化,确定哪些软件组件将运行以及如何运行。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_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 的用途如下:

  1. 我们可以借助 docker 镜像轻松有效地运行容器。

  2. 所有代码、配置设置、环境变量、库和运行时都包含在 Docker 镜像中。

  3. Docker 镜像与平台无关。

  4. 图层是镜像的构成块。

  5. 通过使用构建命令,用户可以选择完全从头开始或使用现有镜像作为第一层。

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"]

Dockerfile

第 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)

app_py

步骤3:构建Docker镜像

  • 以下命令用于从 Dockerfile 构建 docker python 镜像:
 docker image build -t mypython-app:v1 .
  • 下面实际展示了如何从Dockerfile构建基于python的docker镜像:

docker_image_build_t_mypython-app-v1

步骤 4:验证 Docker 镜像

  • 使用以下命令验证docker应用程序是否构建成功:
docker images
  • 以下屏幕截图显示了基于 python 的 docker 镜像成功构建。

docker_images

步骤5:运行基于Python的Docker容器

  • 使用以下命令将容器运行到该 docker python 映像:
docker run -dit -p 80:80  --name  mycontainer1 mypython-app:v1
  • 以下命令是成功运行该基于python的docker容器:

运行基于 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 指令顺序并利用缓存来缩短构建时间。

Leave a Comment