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…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...