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,方便在不同环境下使用。
- 登录 Docker Hub:输入正确的用户名和密码。
docker login
- 将镜像标记为 Docker Hub 用户名下的镜像:
docker tag my-python-app username/my-python-app
- 推送镜像到 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
设置环境变量 PORT 为 8000。
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文件)
图例: 代码: <!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优势
搜索引擎优化(SEO)是提高网站在搜索引擎结果页(SERP)中的排名以吸引更多访问者的过程。HTTPS作为网站安全的标准,对SEO有着直接和间接的优势: 1. HTTPS作为排名信号 2014年,Google宣布HTTPS成…...
UE5 C++ 读取图片插件(一)
原来UE可以使用 static,之前不知道,一用就报错。 static TSharedPtr<IImageWrapper> GetImageWrapperByExtention(const FString InImagePath); //智能指针,方便追寻引用C,加载ImageWrapperstatic UTexture2D* LoadTexture2D(const FString& …...
C语言行地址列地址区别,内存的分配
开辟了10个字节的空间在栈中 "abc"常量在代码段 char a[10]"abc"; p:8个字节存"abc"的地址 "abc"常量在代码段中 char *p"abc" char *q"abc" p,q的值是一样的 到…...
Unity 一键修改图片缩放保存为当前的一半大小
用来压缩贴图大小还是比较方便的 支持 png,jpg,tga 话不多说 直接上代码 [MenuItem("Assets/扩展功能/缩放贴图一半尺寸(png | jpg | tga)", false)]static void ScaleHalfTextureSizeMenu(){foreach(var obj in Selection.objects) {Texture…...
Identifying User Goals from UI Trajectories论文学习
通过UI轨迹识别用户的需求。 这篇论文同样聚焦于UI agent,只是思路比较特别。他们想要通过训练agent通过用户的行为轨迹反推出他们想要干什么的能力来锻炼agent识别,理解,使用UI的能力。同时这个训练项目本身也有一定的实际意义,…...
[STM32]从零开始的STM32标准库环境搭建(小白向)
一、我们为什么要搭建STM32标准库开发环境 如果你对STM32有一定的了解,相信你已经认识了STM32的几种开发方式。基于STM32寄存器开发,基于ST官方的标准库开发,基于ST官方的HAL库开发。我们现在来了解一下这些库的优缺点。首先就是基于寄存器开…...
解决 Android 上的 .NET MAUI/Xamarin.AndroidX 应用调用 ASP.NET Core API 端点时 SSL 连接被拒绝的问题
从虚拟机调用本地API报各种 SSL 连接不上的错误,这给本地调试造成了极大的不便,在被这个问题困扰了多日以后,终于在GitHub上找到答案 基于这个 帖子 ,有一个回复 他写了一个帮助类,专门用来调试本地的API,…...
助贷CRM系统:为金融中介行业打造全新营销管理模式
助贷CRM(客户关系管理)系统是针对金融中介行业,特别是从事贷款助贷业务的机构设计的一套综合管理系统。该系统旨在通过数字化、智能化的手段,优化金融中介机构的营销、销售、客户管理及服务流程,提升运营效率ÿ…...
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 插入语句时,参数包含特殊符号(如引号 、分号 ;、反斜杠 \ 等),可能会导致 SQL 注入或插入失败的问题。为了解决这个问题,推荐使用占位符(如 $1, $2, 等)和参数化…...
Leetcode面试经典150题-221.最大正方形
解法都在代码里,不懂就留言或者私信 class Solution {/**本题一看就是典型的动态规划,要找以每个点为右下角的正方形的面积,然后取最大的这个题要注意找规律,我找到的规律如下:1.以第一行为右下角的,因为正…...
51单片机-DS1302,操作简述
DS1302的命令字(Command Byte)是由控制DS1302芯片的主机(通常是单片机,如51单片机)来生成和发送的。DS1302是一款实时时钟(RTC)芯片,它通过串行通讯接口与单片机进行数据交换。 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理解为占用区域,把bounds理解为边界。View在旋转过程中,其实自己的坐标系统并没有发生改变,bounds中的origin只能通过setBounds方法修改。 frame 定义了视图在其父视图坐标系统中的位置和大小。其坐标系是相对于俯视图的坐标系。 bou…...
Trm理论 3(注意力机制)
注意力机制(attention) 在使用LSTM,CNN等模型的时候,很难决定对于一个信息什么是重要的,什么是不重要的。因此注意力机制就是为了优化这一问题 怎么做注意力机制 注意力机制包含,查询对象(Q&…...
Vue2和Vue3项目创建的区别和 element ui 和element plus的导入方式
文章目录 创建项目Vue2Vue3 Vue2项目机构Vue 2 Element UI VUE3项目结构Vue 3 Element Plus 创建项目 Vue2 Vue CLI 3 及之前版本: 使用 vue-cli 创建项目: npm install -g vue/cli vue create my-project-vue2 cd my-project-vue2Vue3 Vue CLI 4…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...
Java后端检查空条件查询
通过抛出运行异常:throw new RuntimeException("请输入查询条件!");BranchWarehouseServiceImpl.java // 查询试剂交易(入库/出库)记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...
深入解析 ReentrantLock:原理、公平锁与非公平锁的较量
ReentrantLock 是 Java 中 java.util.concurrent.locks 包下的一个重要类,用于实现线程同步,支持可重入性,并且可以选择公平锁或非公平锁的实现方式。下面将详细介绍 ReentrantLock 的实现原理以及公平锁和非公平锁的区别。 ReentrantLock 实现原理 基本架构 ReentrantLo…...
MeanFlow:何凯明新作,单步去噪图像生成新SOTA
1.简介 这篇文章介绍了一种名为MeanFlow的新型生成模型框架,旨在通过单步生成过程高效地将先验分布转换为数据分布。文章的核心创新在于引入了平均速度的概念,这一概念的引入使得模型能够通过单次函数评估完成从先验分布到数据分布的转换,显…...
[KCTF]CORE CrackMe v2.0
这个Reverse比较古老,已经有20多年了,但难度确实不小。 先查壳 upx压缩壳,0.72,废弃版本,工具无法解压。 反正不用IDA进行调试,直接x32dbg中,dump内存,保存后拖入IDA。 这里说一下…...
jieba实现和用RNN实现中文分词的区别
Jieba 分词和基于 RNN 的分词在技术路线、实现机制、性能特点上有显著差异,以下是核心对比: 1. 技术路线对比 维度Jieba 分词RNN 神经网络分词范式传统 NLP(规则 统计)深度学习(端到端学习)核心依赖词典…...
