当前位置: 首页 > news >正文

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构建镜像教程

目录 1. Docker 环境准备2. 编写 Dockerfile3. 构建 Docker 镜像4. 运行容器5. 管理镜像和容器6. 镜像的导出和导入6.1 导出 Docker 镜像6.2 导入 Docker 镜像6.3 导出与导入的实际场景6.4 压缩导出的镜像 7. 推送镜像到 Docker Hub8. Dockerfile 指令详解1. FROM2. RUN3. WORK…...

扑捉一只耿鬼(HTML文件)

图例&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>耿鬼</title><style>body {background: #fff;font-family: Comfortaa, sans-serif;}* {box-sizing:…...

Address localhost:1099 is already in use:tomcat频繁重启端口占用问题

错误提示 Unable to open debugger port (127.0.0.1:58198): java.net.SocketException "Socket closed" Address localhost:1099 is already in use 端口被占用 报错原因 由于短时间内频繁运行tomcat服务器。 为了避免出现这一错误。可以点击刷新uodate resourc…...

HTTPS SEO优势

搜索引擎优化&#xff08;SEO&#xff09;是提高网站在搜索引擎结果页&#xff08;SERP&#xff09;中的排名以吸引更多访问者的过程。HTTPS作为网站安全的标准&#xff0c;对SEO有着直接和间接的优势&#xff1a; 1. HTTPS作为排名信号 2014年&#xff0c;Google宣布HTTPS成…...

UE5 C++ 读取图片插件(一)

原来UE可以使用 static,之前不知道&#xff0c;一用就报错。 static TSharedPtr<IImageWrapper> GetImageWrapperByExtention(const FString InImagePath); //智能指针&#xff0c;方便追寻引用C,加载ImageWrapperstatic UTexture2D* LoadTexture2D(const FString& …...

C语言行地址列地址区别,内存的分配

开辟了10个字节的空间在栈中 "abc"常量在代码段 char a[10]"abc"; p&#xff1a;8个字节存"abc"的地址 "abc"常量在代码段中 char *p"abc" char *q"abc" p,q的值是一样的 到…...

Unity 一键修改图片缩放保存为当前的一半大小

用来压缩贴图大小还是比较方便的 支持 png,jpg,tga 话不多说 直接上代码 [MenuItem("Assets/扩展功能/缩放贴图一半尺寸&#xff08;png | jpg | tga&#xff09;", false)]static void ScaleHalfTextureSizeMenu(){foreach(var obj in Selection.objects) {Texture…...

Identifying User Goals from UI Trajectories论文学习

通过UI轨迹识别用户的需求。 这篇论文同样聚焦于UI agent&#xff0c;只是思路比较特别。他们想要通过训练agent通过用户的行为轨迹反推出他们想要干什么的能力来锻炼agent识别&#xff0c;理解&#xff0c;使用UI的能力。同时这个训练项目本身也有一定的实际意义&#xff0c;…...

[STM32]从零开始的STM32标准库环境搭建(小白向)

一、我们为什么要搭建STM32标准库开发环境 如果你对STM32有一定的了解&#xff0c;相信你已经认识了STM32的几种开发方式。基于STM32寄存器开发&#xff0c;基于ST官方的标准库开发&#xff0c;基于ST官方的HAL库开发。我们现在来了解一下这些库的优缺点。首先就是基于寄存器开…...

解决 Android 上的 .NET MAUI/Xamarin.AndroidX 应用调用 ASP.NET Core API 端点时 SSL 连接被拒绝的问题

从虚拟机调用本地API报各种 SSL 连接不上的错误&#xff0c;这给本地调试造成了极大的不便&#xff0c;在被这个问题困扰了多日以后&#xff0c;终于在GitHub上找到答案 基于这个 帖子 &#xff0c;有一个回复 他写了一个帮助类&#xff0c;专门用来调试本地的API&#xff0c;…...

助贷CRM系统:为金融中介行业打造全新营销管理模式

助贷CRM&#xff08;客户关系管理&#xff09;系统是针对金融中介行业&#xff0c;特别是从事贷款助贷业务的机构设计的一套综合管理系统。该系统旨在通过数字化、智能化的手段&#xff0c;优化金融中介机构的营销、销售、客户管理及服务流程&#xff0c;提升运营效率&#xff…...

HBase 部署及shell操作

HBase 数据库 一、HBase 概述1.1 HBase 是什么HBase 的特点 二、HBase 模型及架构2.1 HBase 逻辑模型2.2 HBase 数据模型2.3 HBase 物理模型2.3.1 列簇物理模型2.3.2 Rowkey 字段排序2.3.3 Region 存储到不同节点2.3.4 Region 结构 2.4 HBase 基本架构 三、搭建 HBase 分布式集…...

使用Fign进行客户端远程调用和SpringFormEncoder的使用

1、引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> 2、启动类加上注解 EnableFeignClients SpringBootApplication public class FeignTe…...

golang 数据库使用注意事项

1.在使用 fmt.Sprintf 构建 SQL 插入语句时&#xff0c;参数包含特殊符号&#xff08;如引号 、分号 ;、反斜杠 \ 等&#xff09;&#xff0c;可能会导致 SQL 注入或插入失败的问题。为了解决这个问题&#xff0c;推荐使用占位符&#xff08;如 $1, $2, 等&#xff09;和参数化…...

Leetcode面试经典150题-221.最大正方形

解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {/**本题一看就是典型的动态规划&#xff0c;要找以每个点为右下角的正方形的面积&#xff0c;然后取最大的这个题要注意找规律&#xff0c;我找到的规律如下&#xff1a;1.以第一行为右下角的&#xff0c;因为正…...

51单片机-DS1302,操作简述

DS1302的命令字&#xff08;Command Byte&#xff09;是由控制DS1302芯片的主机&#xff08;通常是单片机&#xff0c;如51单片机&#xff09;来生成和发送的。DS1302是一款实时时钟&#xff08;RTC&#xff09;芯片&#xff0c;它通过串行通讯接口与单片机进行数据交换。 DS1…...

Vue3+Vite+Echarts 出现Missing semicolon错误

使用的echarts代码如下: import * as echarts from echarts;type EChartsOption echarts.EChartsOption;var chartDom document.getElementById(main)!; var myChart echarts.init(chartDom); var option: EChartsOption;option {series: [{type: gauge,center: [50%, 6…...

iOS——frame和bounds的区别

把frame理解为占用区域&#xff0c;把bounds理解为边界。View在旋转过程中&#xff0c;其实自己的坐标系统并没有发生改变&#xff0c;bounds中的origin只能通过setBounds方法修改。 frame 定义了视图在其父视图坐标系统中的位置和大小。其坐标系是相对于俯视图的坐标系。 bou…...

Trm理论 3(注意力机制)

注意力机制&#xff08;attention&#xff09; 在使用LSTM&#xff0c;CNN等模型的时候&#xff0c;很难决定对于一个信息什么是重要的&#xff0c;什么是不重要的。因此注意力机制就是为了优化这一问题 怎么做注意力机制 注意力机制包含&#xff0c;查询对象&#xff08;Q&…...

Vue2和Vue3项目创建的区别和 element ui 和element plus的导入方式

文章目录 创建项目Vue2Vue3 Vue2项目机构Vue 2 Element UI VUE3项目结构Vue 3 Element Plus 创建项目 Vue2 Vue CLI 3 及之前版本&#xff1a; 使用 vue-cli 创建项目&#xff1a; npm install -g vue/cli vue create my-project-vue2 cd my-project-vue2Vue3 Vue CLI 4…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗&#xff1f; 在ComfyUI中实现图生视频并延长到5秒&#xff0c;需要结合多个扩展和技巧。以下是完整解决方案&#xff1a; 核心工作流配置&#xff08;24fps下5秒120帧&#xff09; #mermaid-svg-yP…...

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...