Docker构建镜像方法

2024-09-06 12:12
文章标签 镜像 构建 方法 docker

本文主要是介绍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构建镜像方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141972

相关文章

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

docker如何删除悬空镜像

《docker如何删除悬空镜像》文章介绍了如何使用Docker命令删除悬空镜像,以提高服务器空间利用率,通过使用dockerimage命令结合filter和awk工具,可以过滤出没有Tag的镜像,并将... 目录docChina编程ker删除悬空镜像前言悬空镜像docker官方提供的方式自定义方式总结docker

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

Idea实现接口的方法上无法添加@Override注解的解决方案

《Idea实现接口的方法上无法添加@Override注解的解决方案》文章介绍了在IDEA中实现接口方法时无法添加@Override注解的问题及其解决方法,主要步骤包括更改项目结构中的Languagel... 目录Idea实现接China编程口的方法上无法添加@javascriptOverride注解错误原因解决方

MySql死锁怎么排查的方法实现

《MySql死锁怎么排查的方法实现》本文主要介绍了MySql死锁怎么排查的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言一、死锁排查方法1. 查看死锁日志方法 1:启用死锁日志输出方法 2:检查 mysql 错误

Java通过反射获取方法参数名的方式小结

《Java通过反射获取方法参数名的方式小结》这篇文章主要为大家详细介绍了Java如何通过反射获取方法参数名的方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、解决方式方式2.1: 添加编译参数配置 -parameters方式2.2: 使用Spring的内部工具类 -

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.