Docker构建镜像方法

目录

        • 1. Docker 环境准备
        • 2. 编写 Dockerfile
        • 3. 构建 Docker 镜像
        • 4. 运行容器
        • 5. 管理镜像和容器
        • 6. 镜像的导出和导入
          • 6.1 导出 Docker 镜像
          • 6.2 导入 Docker 镜像
          • 6.3 导出与导入的实际场景
          • 6.4 压缩导出的镜像
        • 7. 推送镜像到 Docker Hub
        • 8. Dockerfile 指令详解
          • 1. `FROM`
          • 2. `RUN`
          • 3. `WORKDIR`
          • 4. `COPY`
          • 5. `ADD`
          • 6. `CMD`
          • 7. `ENTRYPOINT`
          • 8. `ENV`
          • 9. `EXPOSE`
          • 10. `VOLUME`
          • 11. `ARG`
          • 12. `USER`
          • 13. `SHELL`
          • 14. `HEALTHCHECK`
        • 9. 总结

Docker 是一种轻量级的容器化平台,可以打包应用程序及其所有依赖项到一个容器中,从而实现跨平台、跨环境的部署。在开发和运维中,构建 Docker 镜像是一项常见的任务。本文将带你逐步了解如何构建自己的 Docker 镜像。

1. Docker 环境准备

在开始构建镜像之前,确保你已经安装了 Docker。如果未安装,可以先进行安装。

下载安装脚本

curl -fsSL https://get.docker.com -o get-docker.sh

运行安装脚本

sudo sh get-docker.sh

检查 Docker 版本
安装完成后,执行以下命令验证是否成功安装:

docker --version

成功安装后,你应该可以看到 Docker 版本号。

2. 编写 Dockerfile

Docker 镜像的构建主要依赖于 Dockerfile,它是一个包含指令的文本文件,告诉 Docker 如何一步步构建镜像。

在项目根目录下创建一个 Dockerfile 文件,假设我们要构建一个基于 Python 的简单应用。

示例 Dockerfile

# 基础镜像选择
FROM python:3.9-slim

# 设置工作目录
WORKDIR /app

# 将当前目录中的文件拷贝到容器中的 /app 目录
COPY . /app

# 安装依赖项
RUN pip install --no-cache-dir -r requirements.txt

# 暴露端口
EXPOSE 8000

# 指定启动命令
CMD ["python", "app.py"]

解释:

  • FROM:定义基础镜像,这里我们选择了官方 Python 3.9 的轻量版镜像。
  • WORKDIR:指定工作目录为 /app,所有的操作将在该目录下进行。
  • COPY:将本地文件复制到容器中。
  • RUN:执行构建时的命令,这里用来安装 Python 项目依赖。
  • EXPOSE:告知 Docker 该容器运行时会使用 8000 端口。
  • CMD:定义容器启动时执行的命令,这里我们启动 Python 脚本。
3. 构建 Docker 镜像

在编写好 Dockerfile 之后,使用 docker build 命令构建镜像:

docker build -t my-python-app .
  • -t my-python-app:给镜像打上标签 my-python-app
  • .:表示使用当前目录下的 Dockerfile 进行构建。

执行完成后,可以通过以下命令查看构建好的镜像:

docker images
4. 运行容器

构建好镜像后,可以使用 docker run 命令运行容器:

docker run -d -p 8000:8000 my-python-app
  • -d:后台运行容器。
  • -p 8000:8000:将宿主机的 8000 端口映射到容器的 8000 端口。

现在,你可以访问 http://localhost:8000 查看运行效果。

5. 管理镜像和容器

查看运行的容器:

docker ps

停止容器:

docker stop <container_id>

删除容器:

docker rm <container_id>

删除镜像:

docker rmi my-python-app
6. 镜像的导出和导入
6.1 导出 Docker 镜像

将镜像导出为 .tar 文件是将 Docker 镜像分享给其他人的一种常用方法。可以通过 docker save 命令来导出镜像:

docker save -o my-python-app.tar my-python-app

解释:

  • save:导出镜像到文件。
  • -o my-python-app.tar:指定导出文件的名称和路径,这里导出到当前目录下的 my-python-app.tar 文件。
  • my-python-app:要导出的镜像名称。

导出成功后,你将在当前目录下看到 my-python-app.tar 文件,这个文件可以拷贝或传输到其他机器上使用。

6.2 导入 Docker 镜像

当你收到一个 .tar 格式的 Docker 镜像文件时,可以通过 docker load 命令将其导入到 Docker 环境中:

docker load -i my-python-app.tar

解释:

  • load:导入镜像。
  • -i my-python-app.tar:指定要导入的 .tar 文件。

导入成功后,你可以通过 docker images 查看导入的镜像:

docker images

此时,镜像已经成功导入,你可以像使用其他镜像一样运行它:

docker run -d -p 8000:8000 my-python-app
6.3 导出与导入的实际场景

导出镜像的应用场景:

  • 将构建好的镜像分享给其他同事或部署到无互联网连接的服务器。
  • 在本地开发时,频繁更新镜像并打包导出,用于其他环境的测试。

导入镜像的应用场景:

  • 接收别人提供的 Docker 镜像,并导入到自己的环境中进行测试或部署。
  • 将镜像从一台服务器导入到另一台没有网络的服务器上。
6.4 压缩导出的镜像

Docker 镜像往往比较大,导出 .tar 文件后可以进行压缩,节省传输时间和空间。可以使用 gzip 命令进行压缩:

docker save my-python-app | gzip > my-python-app.tar.gz

这样会生成一个压缩后的 .tar.gz 文件。导入时,也可以直接解压缩并加载:

gunzip < my-python-app.tar.gz | docker load
7. 推送镜像到 Docker Hub

你还可以将构建好的镜像推送到 Docker Hub,方便在不同环境下使用。

  1. 登录 Docker Hub:输入正确的用户名和密码。
docker login
  1. 将镜像标记为 Docker Hub 用户名下的镜像:
docker tag my-python-app username/my-python-app
  1. 推送镜像到 Docker Hub:
docker push username/my-python-app

推送完成后,你可以在 Docker Hub 上看到自己的镜像,其他人可以通过 docker pull username/my-python-app 下载并运行你的镜像。

8. Dockerfile 指令详解

下面是常用 Dockerfile 指令的详解:

1. FROM

格式:

FROM <镜像名称>:<标签>

作用:
指定镜像的基础层。每个 Dockerfile 都必须以 FROM 指令开始,它定义了构建镜像所基于的基础镜像。

示例:

FROM ubuntu:20.04

使用 Ubuntu 20.04 作为基础镜像。

2. RUN

格式:

RUN <命令>

作用:
执行命令并在镜像中创建一层新的文件系统层。通常用于安装软件包、执行脚本等操作。

示例:

RUN apt-get update && apt-get install -y python3

更新包管理器并安装 Python 3。

3. WORKDIR

格式:

WORKDIR <路径>

作用:
设置工作目录,后续的命令都会在该目录下执行。如果目录不存在,Docker 会自动创建。

示例:

WORKDIR /app

/app 目录设为工作目录。

4. COPY

格式:

COPY <源路径> <目标路径>

作用:
将主机上的文件或目录复制到镜像内的指定路径。

示例:

COPY . /app

将本地当前目录下的所有文件复制到镜像内的 /app 目录。

5. ADD

格式:

ADD <源路径> <目标路径>

作用:
COPY 类似,但功能更强大,可以处理压缩文件并自动解压,还可以从远程 URL 下载文件。

示例:

ADD myfile.tar.gz /app

myfile.tar.gz 文件解压后放入 /app 目录。

6. CMD

格式:

CMD ["可执行文件", "参数1", "参数2"]

作用:
指定容器启动时执行的默认命令或脚本。注意,CMD 只能有一个,并且如果在 docker run 时传递了其他命令,则会覆盖 CMD

示例:

CMD ["python3", "app.py"]

启动容器时执行 python3 app.py

7. ENTRYPOINT

格式:

ENTRYPOINT ["可执行文件", "参数1", "参数2"]

作用:
CMD 类似,定义容器启动时执行的命令,但 ENTRYPOINT 不会被 docker run 的参数覆盖。

示例:

ENTRYPOINT ["python3", "app.py"]

指定容器启动时始终执行 python3 app.py,即使 docker run 传递了其他命令。

8. ENV

格式:

ENV <环境变量名> <值>

作用:
设置环境变量,容器中的程序可以访问这些变量。

示例:

ENV PORT=8000

设置环境变量 PORT8000

9. EXPOSE

格式:

EXPOSE <端口号>

作用:
声明容器在运行时监听的端口。这仅仅是一个声明,容器不会自动将这些端口映射到主机,需要在运行容器时使用 -p 参数进行端口映射。

示例:

EXPOSE 8000

声明容器使用 8000 端口。

10. VOLUME

格式:

VOLUME ["/路径"]

作用:
声明数据卷,指定一个挂载点,以便在容器和主机之间共享数据。容器中的数据可以被持久化,或与其他容器共享。

示例:

VOLUME ["/data"]

创建挂载点 /data

11. ARG

格式:

ARG <变量名>=<默认值>

作用:
定义构建时的变量,可以在 docker build 时传递参数来覆盖默认值。

示例:

ARG VERSION=1.0
RUN echo "Building version $VERSION"

构建镜像时可以使用 --build-arg 参数来传递不同的版本号:

docker build --build-arg VERSION=2.0 -t myapp .
12. USER

格式:

USER <用户名或UID>

作用:
指定运行容器时的用户身份,默认是 root。可以通过 USER 切换到非 root 用户,增强安全性。

示例:

USER appuser
13. SHELL

格式:

SHELL ["可执行文件", "参数"]

作用:
指定默认的 Shell 解释器,默认情况下 Linux 镜像使用 /bin/sh -c,而 Windows 镜像使用 cmd /S /C

示例:

SHELL ["/bin/bash", "-c"]

将 Shell 改为 bash

14. HEALTHCHECK

格式:

HEALTHCHECK [选项] CMD <命令> || exit 1

作用:
定义容器健康检查,通过定期执行某些命令来判断容器的健康状态。

示例:

HEALTHCHECK --interval=30s --timeout=10s CMD curl -f http://localhost/health || exit 1

每 30 秒检查一次容器的健康状态,超过 10 秒未响应则视为失败。

9. 总结

通过本教程,你学会了如何通过 Dockerfile 构建自己的 Docker 镜像,并且学会了如何运行和管理容器。Docker 的强大之处在于它能够将环境和应用程序封装在一个镜像中,实现高度可移植性。

你可能感兴趣的:(docker)