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

Docker容器化引擎,容器镜像技术

一、Docker 是什么
Docker 是一款容器化引擎,基于 Linux 内核技术(Namespaces 隔离、Cgroups 资源限制),能把应用、依赖、环境打包成统一镜像,一次打包,到处运行。
核心优势
环境统一:解决 “本地能跑,服务器报错”
轻量:容器共享宿主机内核,比虚拟机体积小、启动秒级
隔离:容器之间互不干扰
分发便捷:镜像可上传 Docker Hub(或私有仓库:如阿里云容器镜像服务ACR和自建Harbor仓库) 快速部署。

1、Docker底层原理:宿主机提供 Linux 内核,容器镜像自带独立用户态系统(CentOS / Ubuntu / Alpine)。所有 Linux 发行版(CentOS、Ubuntu)共用一套 Linux 内核,Docker 容器共享宿主机内核,但文件系统、命令、软件包管理器、系统库全是镜像自带的。

2、容器和虚拟机对比:
容器:打包应用、环境、库成容器,每个容器相互隔离,运行在操作系统内核上。([APP+Lib]-[APP+Lib]【kernel】)
虚拟机:运行一个完整操作系统 。([APP]-[APP]【Lib+kernel】)

3、使用docker,开发打包部署上线一套流程:
java ->jar(环境)->打包带上环境(镜像)->docker仓库->下载镜像->直接运行即可
传统方式要要安装应用环境(redis,mysql,jdk等),应用配置(端口等)配置麻烦,不能跨平台(如window开发后发布到linux),端口冲突等,费时费力,而且容易出错。

Docker实操基本过程:
[build] 构建镜像
[pull] 拉取镜像
[run] 运行镜像(指定端口映射,数据卷挂载等参数)
[start] [stop] [restart] 启动容器

二、四大核心概念
镜像 Image
只读模板,包含程序、库、配置,相当于容器模板(类似系统安装包)。
容器 Container
镜像运行后的实例,可创建、启动、停止、删除,一个镜像能跑多个容器。
Dockerfile
文本脚本,自定义构建镜像的步骤。
仓库 Registry
存放镜像的平台,官方公共仓库:Docker Hub。

三、docker engine配置
1、registry-mirrors:镜像加速源,从上到下依次尝试(Docker 遇到403,401权限拒绝不会自动切换下一个镜像源,直接终止拉取流程,只有超时才会切换),Docker 官方公有镜像仓库国内可能访问不了,可使用以下国内镜像加速器。
2、insecure-registries:信任 HTTP 私有仓库(自建 Harbor 内网地址)

{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"registry-mirrors": [
"https://docker.1panel.live",
"https://docker.1ms.run",
"https://dockerproxy.com",
"https://mirror.ccs.tencentyun.com"
],
"insecure-registries": [
"192.168.1.100:80"
],
}

四、Docker Hub / 阿里云 ACR / 自建 Harbor 仓库 对比
1、基础定位区分
Docker Hub:Docker 官方公有镜像仓库,全球公共镜像源头
阿里云 ACR:云厂商托管式镜像仓库(底层封装 Harbor),公有 + 私有一体 SaaS 服务
自建 Harbor:自己 Linux 服务器部署开源私有仓库,完全自主可控
2、使用流程搭配(主流企业方案)
方案 1:个人本地开发(最简单)
Docker Desktop + 国内镜像加速器(中科大 / 阿里 mirror),只用 Docker Hub 拉公共镜像,不存私有业务镜像。
方案 2:阿里云上业务部署
本地 Docker Desktop 打包镜像 → push 到阿里云 ACR 私有仓库 → 阿里云 ECS/ACK 拉取镜像部署。
方案 3:企业内网生产环境(最常用)
本地电脑打包镜像 → 推送内网自建 Harbor → 内网 K8s / 业务服务器从 Harbor 拉取运行。
3、快速选型建议
只是学习、只拉 nginx/mysql 等开源镜像 → Docker Hub + 国内镜像加速器
公司业务跑阿里云、没人维护服务器、预算充足 → 阿里云 ACR
企业内网集群、镜像量大、数据保密、有运维人员 → 自建 Harbor 私有仓库


三、常用基础命令
#查看系统内核
bash
uname -r
#查看系统版本
bash
cat /etc/os-release
#查看docker信息。可以验证加速器是否生效,往下滚动看到 Registry Mirrors 出现你的阿里云地址即成功
bash
docker info
#帮助
docker --help
2、镜像命令
#查看所有本地主机上的镜像
docker images
#下载镜像
docker pull 镜像名
#删除镜像
docker rmi -f 镜像名或镜像ID
3、容器命令
#新建容器并启动 (docker run执行过程:执行run后,docker开始在本机寻找镜像,有则使用这个镜像运行,没有则到镜像仓库下载(默认docker hub,配置云镜像加速服务后就到阿里云镜像库下载),镜像库找到镜像则下载,找不到则报错)
docker run [可选参数] 镜像
[参数说明]
--name="容器名称"
-d 后台方式运行
-it 使用交互方式运行
-p 制定容器的端口 -p 主机端口:容器端口。 如:-p 8080:8080
#启动并进入容器
docker run -it 镜像名或镜像ID /bin/bash
ls
#启动nginx镜像
docker run -d --name 容器名称 -p 3344:80 镜像名或镜像ID (注意:后台直接运行网站不用进 bash,如果加/bin/bash进入容器后 Nginx 不会自动启动,需要手动执行:nginx -g "daemon off;)
#容器停止并从中退出
exit
#容器不停止退出
快捷键:Ctrl+P+Q
#查看当前运行中的容器
docker ps
#查看全部容器,包括历史运行过的容器
docker ps -a
#删除容器
docker rm 容器ID
#强制删除容器
docker rm -f 容器ID
#启动和停止容器
docker start 容器ID
docker restart 容器ID
docker stop 容器ID
docker kill 容器ID
#进入容器终端(进入正在运行中的容器)
docker exec -it 容器ID/容器名 /bin/bash

ls
# 进入容器终端(进入正在运行中的容器),部分系统没有bash,用 sh
docker exec -it 容器ID/容器名 sh
4、其它常用命令
#docker run -d 容器名
问题docker ps,发现容器停止了。如果docker使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止。即容器启动后发现没有提供服务,就会立即停止
#查看日志
docker logs -tf tail 10 容器ID
#查看容器中的进程
dokcer top 容器ID
#查看镜像的元数据
docker inspect
#进入容器终端(进入正在运行中的容器)
docker exec -it 容器ID #进入容器后开启一个新的终端
docker attach 容器ID #进入正在执行的终端,不会启动新的进程
#从容器内拷贝文件到主机上。
docker cp 容器ID:容器内路径 目的主机路径 #在主机上执行
#查看CPU、内存状态
docker stats
#提交镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 目标镜像名:[tag]

四、部署nginx
docker pull nginx
docker run -d --name nginx01 -p 3344:80 镜像名或镜像ID
docker run -d --name nginx02 -p 3345:80 镜像名或镜像ID
docker run -d --name nginx03 -p 3346:80 镜像名或镜像ID
运行测试
curl localhost:3344
docker exec -it nginx01 /bin/bash
whereis nginx

五、部署Elasticsearch + Kibana
#启动Elasticsearch(因启动后比较耗内存,用ES_JAVA_OPTS参数限制内存占用)。本地没有镜像会自动下载再启动
docker run -d --name elastics="="earch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -e "xpack.security.enabled=false" -e "xpack.security.enrollment.enabled=false" -e "xpack.security.http.ssl.enabled=false" -e "xpack.security.transport.ssl.enabled=false" elasticsearch:8.17.0
ES8 默认开启 SSL HTTPS + 身份验证,直接用 http://localhost:9200 访问会被强制断开连接。用-e "xpack.security.enabled=false" -e "xpack.security.enrollment.enabled=false" -e "xpack.security.http.ssl.enabled=false" -e "xpack.security.transport.ssl.enabled=false"参数 关闭 xpack 安全、SSL、认证后,可正常访问 http://localhost:9200。
#安装Kibana

六、docker build + Dockerfile 与 docker commit 对比
1、核心本质区别
Dockerfile
脚本化构建,每一步操作可记录、可复用、可版本管理。
构建过程透明、可复现,企业标准生产打包方案。
docker commit
对运行 / 停止后的容器做快照,把容器读写层改动打包成新镜像;
纯手动操作,无操作记录,仅适合临时调试。

2、实际使用场景
commit
临时保存当前容器的状态(调试好的环境),进容器手动装依赖、改配置、修复 bug,不想下次重新操作,commit 保存快照。commit 生成镜像后 docker save 打成 tar 包,拷贝到无外网服务器导入使用。例:ubuntu 容器手动装了 nginx、插件,提交成镜像,下次 run 直接带环境。快速制作临时镜像,测试验证。
Dockerfile
项目业务镜像打包(Java、前端、Nginx 网站等),线上生产环境交付镜像,团队多人协作开发,CI/CD自动打包推送镜像仓库

3、使用边界区分
本地调试、临时快照、应急备份 → 用 docker commit
项目正式打包、线上部署、团队协作 → 必须用 Dockerfile + docker build

七、容器数据卷
如果数据在容器中,容器删除,数据就会丢失。容器数据卷作用:实现数据在本地持久化存储和容器间的数据共享。
挂载持久化目录方式:
1、指定路径挂载(绑定主机目录)
直接使用命令挂载(目录映射挂载,实现主机目录和容器目录内的双向数据同步。平常在本地修改,容器会自动同步)
docker run -it p 主机端口:容器端口 -v 主机目录:容器目录 容器ID /bin/bash
docker run -d p 8080:80 -v 主机目录:/home/test 容器ID
docker volume ls
实例代码:
安装nginx
docker run -d -p 8080:80 -v ${PWD}/html:/usr/share/nginx/html nginx
docker run -d -p 8080:80 -v /home/html:/usr/share/nginx/html nginx
安装mysql
docker pull mysql:5.6
docker run -d --name mysql01 -p 3310:3306 -v ${PWD}/dockerdata/mysql/conf:/etc/mysql/conf.d -v ${PWD}/dockerdata/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6

2、匿名挂载和匿名挂载
(1)、具名挂载 (建议使用)
docker run -d --name nginx_juming -P -v 数据卷名:/etc/nginx nginx
docker run -d --name nginx_juming -P -v juming_nginx:/etc/nginx nginx
(2)、匿名挂载
docker run -d --name nginx_niming -P -v /etc/nginx -v /usr/share/nginx/html nginx
(3)、linux主机查看数据卷挂载信息
docker volume ls
docker volume inspect 数据卷名
(执行后显示信息中的"Mountpoint": "/var/lib/docker/volumes/数据卷名/_data"就是持久化文件目录)
(4)、windos主机查看匿名挂载和匿名挂载持久化文件:
Win+E 打开文件资源管理器,顶部地址栏粘贴这条路径回车
\\wsl$\docker-desktop\mnt\docker-desktop-disk\data\docker\volumes
文件夹名是一长串随机字符 = 匿名挂载卷,点开任意卷里的 _data,就是容器持久化文件)

3、参数 --volumes-from的常用应用场景
1、多服务容器共用数据目录(Nginx + PHP-FPM 共享网站代码)
2、数据备份容器(临时容器挂载数据卷打包备份)
3、统一日志收集、静态资源共享

业务容器(MySQL、Redis、应用)里面有持久化数据卷,不能直接进宿主机目录打包(权限、文件锁、路径麻烦)。这时--volumes-from 可以用来启动一个一次性临时容器,直接复用业务容器全部数据卷,在临时容器内部执行打包、导出备份操作,操作完容器直接销毁,不影响正在运行的业务。
1、 启动mysql,数据存在命名卷 mysql-data
docker run -d --name mysql-db -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6
2、启动临时备份容器(关键 --volumes-from)
docker run --rm --volumes-from mysql-db:ro -v /宿主机备份目录:/backup alpine tar -czf /backup/mysql_back_$(date +%Y%m%d).tar.gz /var/lib/mysql
(alpine 是一个超轻量级 Linux 系统镜像,基于 Alpine Linux,Docker 官方常用极简镜像:体积只有 5MB 左右,对比 centos、ubuntu 几百 MB,启动极快;自带基础命令:tar、cp、ls、rm 等,刚好满足备份打包需求;没有 MySQL、Java 等多余服务,专门用来做临时工具容器。)


八、DockerFile
构建docker镜像的构建文件,通过这个脚本可以生成镜像。

1、指令核心区分
(1)构建时执行(build 阶段):FROM / LABEL / RUN / COPY / ADD / ARG / WORKDIR / USER / ONBUILD / SHELL
(2)仅定义元数据(运行时生效,不生成层):EXPOSE / ENV / VOLUME / CMD / ENTRYPOINT / HEALTHCHECK / STOPSIGNAL
(3)RUN vs CMD vs ENTRYPOINT
RUN:在执行 docker build 打包镜像时执行,执行结果永久保存到镜像内。(安装软件。RUN 完整执行流程:Docker 基于当前已有镜像层创建临时读写容器;在临时容器内执行 RUN 后面的 shell/exec 命令(安装软件、编译);命令执行完毕,把容器内变更保存为新镜像层;删除临时构建容器)
继续执行下一条 Dockerfile 指令)
CMD/ENTRYPOINT:启动容器时才执行,不改变镜像本身。

-------------DockerFile---------------------
#指令用大写
# 基础镜像
FROM centos:7
#镜像维护者信息
MAINTAINER run21com
#
RUN yun -y intall vim
RUN yun -y intall net-tools
#
ENV MYPATH /usr/local
#工作目录(默认是根目录),可以指定进入系统后的默认目录
WORKDIR MYPATH
#
COPY readme.txt /usr/local/readme.txt
#添加文件,压缩文件自动解压
ADD jdk-8ull-linux-64.tar.gz /usr/local/
ADD apache-tomcat-9.0.22.tar.gz /usr/local/
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22
ENV PATH SPATH: $JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#指定暴露端口
EXPOSE 8080
# 挂载持久化目录,以下是匿名挂载方式
VOLUME ["/data/v_logs", "/data/v_upload"]
#指定容器启动后,要运行的命令
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail-F /url/local/apache-tomcat-9.0.22/bin/logs/catalina.out
-------------DockerFile---------------------
以上脚本保存为DockerFile文件,官方命名,构建时会自动寻找这个文件,就不需要-f文件了。

bash
#构建镜像
docker build -f dockerfile文件路径 -t 镜像名:版本 .
docker build -t mytomcat:1 . #DockerFile文件,官方命名DockerFile,可以省略-f dockerfile文件路径
docker build -f dockerfile -t mytomcat:1.0 .
#发布镜像
# 先进入阿里云镜像容器服务》创建命名空间》创建镜像仓库
docker login -u 用户名
docker tag mytomcat:1.0 mynane/mytomcat:1.0
docker tag [源镜像名:标签] [新镜像仓库/用户名/镜像名:新标签]
docker push mynane/mytomcat:1.0
#运行镜像,生成容器01
dcoker run -d -p 9090:8080 --name mytomcat01 -v /home/jason/build/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test mytomcat:1.0
#发布项目
web项目发布到/home/jason/build/tomcat/test
#查看镜像的构建历史,具体怎么一步一步构建的
docker history docker01
#创建容器02 ,参数--volumes-from 多容器复用一整套挂载
dcoker run -it --name docker02 --volumes-from docker01 i/centos #
#导出导入镜像
作用场景:本地镜像离线迁移。无镜像仓库、内网隔离、断网环境,把本地镜像打包成压缩文件,拷贝到另一台机器导入。
docker save:导出本地镜像 → tar 离线包
docker load:tar 文件导入本机 Docker 镜像列表
#导出 tar 包
docker save -o myapp_v1.tar tom123/myapp:v1
#压缩打包(节省磁盘)
docker save tom123/myapp:v1 | gzip > myapp_v1.tar.gz
#导入 tar 包
docker load -i myapp_v1.tar
#导入压缩包
gzip -d -c myapp_v1.tar.gz | docker load


九、Docker网络
安装docker,就会有一个docker0网卡。启动容器后docker给每个容器分配IP(同网段)
主机(docker0)和容器之间网络互通,容器和容器之间网络互通
1、自定义网络(容器互联)
#查看网络
docker network ls
#创建网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.1.1 mynet
#指定同个网络实现ping容器名互通 ping tomcat01,ping tomcat02
docker run -d -P --name tomcat01 --net mynet tomcat
docker run -d -P --name tomcat02 --net mynet tomcat
docker exec -it tomcat01 ping tomcat02(或IP)
docker exec -it tomcat02 ping tomcat01(或IP)
2、网路连通(不同网络的容器)
docker run -d -P --name tomcat03 tomcat
docker run -d -P --name tomcat04 tomcat
#将容器tomcat03放到mynet网络下后,tomcat03容器有2个IP
docker connect mynet tomcat03
#将容器tomcat04放到mynet网络下后,tomcat04容器有2个IP
docker connect mynet tomcat04


十、Docker Compose
Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具
Dockerfile:在编译/构建阶段,用于构建镜像。定义如何从零到一创建一个容器镜像。针对单个容器,描述其内部环境和配置。管 “内部” —— 我的应用环境怎么装。
Docker Compose :在部署/运行阶段。用于运行容器。定义如何部署、配置和启动一个或多个已经存在的镜像。针对多个容器组成的应用,描述它们之间的协作关系。管 “外部” —— 我的应用和数据库、缓存怎么连,怎么一起跑。

http://www.jsqmd.com/news/1252463/

相关文章:

  • GPU并行计算实战:C++ CUDA/OpenCL加速粒子与流体模拟
  • AMD显卡运行大语言模型:Ollama配置与优化指南
  • 天津哪个万国回收商家收的价格更高?2026年7月最新客服服务质量排行来了 - 诚收名表回收平台
  • 2026洛阳漏水检测维修本地口碑榜TOP5权威推荐-专业仪器精准测漏-正规防水补漏公司推荐:卫生间/厨房/屋顶/阳台/外墙渗漏水检测师傅上门 - 安佳防水
  • C++高性能并发队列实战:moodycamel::ConcurrentQueue原理与10倍性能提升
  • 技术空转破解:从实验室到产业落地的实践指南
  • C++日期处理:从底层算法到C++20 chrono的完整实现指南
  • MSFT-Transformer在宏基因组疾病预测中的应用与优化
  • 帝舵2026年7月中国网点地址电话及售后客户服务通知 - 帝舵中国官方服务中心
  • AI图片配文工具:多模态技术实现与优化实践
  • C++ STL std::set 容器详解:红黑树实现、核心接口与性能实战
  • GLIP:C++图同构算法库,解决分子、电路等结构匹配难题
  • Unity编辑器扩展实战:5步用UI Toolkit打造批量重命名工具
  • Java调用Windows TTS实战:Jacob库原理、配置与工程化指南
  • 2026年7月最新万国成都来福士广场维修保养服务电话 - 万国中国官方服务中心
  • Google Chrome 150.0.7871.182(绿色便携版)
  • LSTM神经网络在风电功率预测中的优化与应用
  • 重磅!积家东莞2026年7月最新售后网点地址及全国统一客服热线 - 积家官方售后服务中心
  • LLaMA-2微调实战:提升文本分类准确率的工程指南
  • Python集成Qt C++扩展模块:Shiboken与PyBind11方案对比与实践
  • 2026 年新消息:崂山有实力的倒吸虹管道水下安装施工队哪家好,水下安装的秘密:这套系统如何颠覆传统难题?-佩润水下工程施工 - 品质体验官
  • RAG技术实战:从本地知识库搭建到生产部署
  • HarmonyOS 应用开发《掌上英语》第40篇:Logger 日志系统——从 console.log 到分级日志
  • C++实现订单簿系统:数据结构、并发与性能优化实战
  • 大模型Agent记忆系统:设计原理与工程实践
  • Unity开发HarmonyOS多端应用:从手机触控到车机按键的完整适配方案
  • 2026年大厂AI岗位需求与技能矩阵全解析
  • 济宁本地防水补漏精选TOP5推荐:正规漏水检测维修公司上门师傅推荐:厕所/棚顶/屋面/飘窗/阳台/地下室/厨房渗漏水精准测漏维修(2026最新) - 即刻修防水
  • C++字符串大小写转换:从基础原理到高性能实现与避坑指南
  • C++智能指针深度解析:RAII机制与三大指针实战指南