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…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...

《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...

【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权
摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题:安全。文章将详细阐述认证(Authentication) 与授权(Authorization的核心概念,对比传统 Session-Cookie 与现代 JWT(JS…...