docker制作镜像的两种方式(保姆级教学)

现在的docker使用因为高效方便,基本已经普遍通用,为了帮助一些小白更好上手掌握制作镜像,作者写了这篇文章,以期能够更好的帮助你快捷使用docker

文章目录


docker的简介

Docker 是一个开源的容器化平台,它允许开发者将应用程序及其依赖(如代码、运行时、系统工具、库、配置文件等)打包到一个轻量级、可移植的容器中,并在任何支持 Docker 的环境中一致地运行。

📌 核心思想:"一次构建,到处运行"(Build Once, Run Anywhere)

虚拟机(VM)vs 容器

特性 容器 虚拟机
隔离级别 进程级隔离 硬件级隔离(Hypervisor)
启动速度 毫秒级(快) 秒级~分钟级(慢)
资源占用 低(共享宿主机内核) 高(每个 VM 有完整 OS)
镜像大小 几十 MB ~ 几百 MB 几 GB 起
可移植性 极高 较低
典型代表 Docker, containerd VMware, VirtualBox, Hyper-V

✅ 简单说:容器 = 轻量级、秒启、高效的应用沙箱


镜像制作的两种方式

1.使用 docker commit 命令基于容器创建镜像(适合快速测试,不推荐用于生产)

2.使用 Dockerfile 编写构建指令,通过 docker build 创建镜像(推荐方式,可复用、可版本控制)

方式一:使用 docker commit(从运行中的容器创建镜像)

⚠️ 注意:这种方式适合临时调试,但不符合"基础设施即代码"原则,不建议用于正式项目。说粗俗点就是救救火可以,但是正规开发不建议,而且有诸多限制且听我细细分解。

步骤 1:拉取基础镜像并启动容器

拉取一个 Ubuntu 镜像

bash 复制代码
docker pull ubuntu:22.04

这里拉的是基础镜像,就是一个能跑ubuntu的极简环境,也是因为极简环境所以有些驱动没有跑一些复杂的软件可能会出现驱动丢失等错误。

启动一个交互式容器(-it 表示交互终端)

bash 复制代码
docker run -it --name my_container ubuntu:22.04 /bin/bash

目的:配置模型运行环境

步骤 2:在容器内做修改(比如安装软件)

在容器内安装模型运行所需各种库

我拿nginx举例

更新包列表

bash 复制代码
apt update

安装 nginx(举例)

bash 复制代码
apt install -y nginx

验证是否安装成功

bash 复制代码
nginx -v

如果是模型等原理是相同的,但是你需要做的是下载各种依赖库,然后通过docker cp的指令把需要的模型复制过去。然后使用指令让模型跑起来,并能看到自己想要的结果即可。

步骤3:在主机上封装整个容器为新镜像

退出容器,退出容器指令exit

查看已停止的容器

bash 复制代码
docker ps -a

将容器提交为新镜像

bash 复制代码
docker commit my_container my_nginx_image:v1

my_container是容器名 my_nginx_image:v1是镜像名加版本号。

步骤 4:验证新镜像

以nginx的镜像举例

查看本地镜像

bash 复制代码
docker images

启动新镜像测试

bash 复制代码
docker run -it my_nginx_image:v1 /bin/bash

进入后可执行 nginx -v 验证是否保留了安装

如果是模型或其他

bash 复制代码
docker run -it --rm my_nginx_image:v1 /bin/bash

可以是这个指令用完就停止容器

从上面可见这种方式无法追溯变更过程,也不便于团队协作。

方式二:使用 Dockerfile(推荐方式强烈安利!!!)

你选取一台与上线环境架构相同的线下机子,最好还能通网(方便下载各种需要的环境)

步骤1:下载需要的各种依赖

如果是通网的,直接用包管理器下就好了,apt install或yum install有啥用啥,能下好就好,自己大多数情况下不用改全局了,都帮你自动配置

步骤2:跑起你需要跑的

确保该环境下你的东西能跑起来,拿我用包管理器下载的nginx举例就是

bash 复制代码
nginx start

只要能跑起来并能查到他的线程,你就事半功倍了。

步骤3:写填写Dockerfile

创建个文件夹在文件夹下

bash 复制代码
nano Dockerfile

以包管理器的nginx举例,它的Dockerfile如下

bash 复制代码
# 使用官方 Ubuntu 22.04 作为基础镜像
FROM ubuntu:22.04

# 设置环境变量,避免 apt 弹出交互提示
ENV DEBIAN_FRONTEND=noninteractive

# 更新系统并安装 nginx
RUN apt update && \
    apt install -y nginx && \
    rm -rf /var/lib/apt/lists/*

# 暴露 80 端口(文档说明用途,实际运行需配合 -p)
EXPOSE 80

# 启动 nginx(前台运行,否则容器会退出)
CMD ["nginx", "-g", "daemon off;"]

步骤4:构建镜像

在 Dockerfile 所在目录执行:

bash 复制代码
docker build -t my_nginx_image_from_dockerfile:v1 .

该指定为打包镜像my_nginx_image_from_dockerfile:v1这个为镜像名称加版本号。注意后面还有一点哦别漏下,

-t:指定镜像名和标签

.:表示当前目录为构建上下文(context)

步骤 5:运行镜像

以nginx举例哦

bash 复制代码
# 后台运行,并映射 8080 主机端口到容器 80 端口
docker run -d -p 8080:80 --name my_web my_nginx_image_from_dockerfile:v1

然后在宿主机浏览器访问:http://localhost:8080,应该能看到 Welcome to nginx! 页面。

到此dockerfile优势一目了然,可版本控制、可重复构建、清晰透明、适合 CI/CD。

步骤 6:内卷!!!

优化 Dockerfile(多阶段构建、减小体积等)

使用 .dockerignore 忽略无关文件

合并 RUN 命令减少层数

使用更小的基础镜像(如 alpine)

多阶段构建(适用于编译型语言如 Go、Java)

作者懒得码字了,有兴趣留言,作者看到了就继续写了。

总结

最后希望能帮助到你,不喜勿喷,欢迎交流指正!

相关推荐
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工3 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn863 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智3 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_3 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉3 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦3 天前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
2601_961875243 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant