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

相关文章

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

webm怎么转换成mp4?这几种方法超多人在用!

webm怎么转换成mp4?WebM作为一种新兴的视频编码格式,近年来逐渐进入大众视野,其背后承载着诸多优势,但同时也伴随着不容忽视的局限性,首要挑战在于其兼容性边界,尽管WebM已广泛适应于众多网站与软件平台,但在特定应用环境或老旧设备上,其兼容难题依旧凸显,为用户体验带来不便,再者,WebM格式的非普适性也体现在编辑流程上,由于它并非行业内的通用标准,编辑过程中可能会遭遇格式不兼容的障碍,导致操

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo