一、Docker为什么会出现?
一款产品:开发---上线是两套环境:应用环境,应用配置。
开发---运维。因为环境不一样,所以会导致无法启动。
Java--jar(环境)--打包项目带上环境(镜像)--(Docker仓库:商店)--运维下载发布的镜像--直接运行
docker给以上的问题,提出了解决方案
docker的思想就是来自于集装箱
隔离:docker核心思想!打包装箱!每个箱子是相互隔离的。
二、docker的历史
2010年几个年轻人,在美国成立了一家dotcloud做pass的云计算服务,他们将自己的技术(容器化技术)命名为Docker,刚开始没有任何的行业注意,为了生存2013年开源了,开源后突然爆火,2014年发布Docker1.0.
爆火的原因就是十分轻巧,解决了vm的笨重。
vm:安装一个linux centos,需要大量的内容。
docker:隔离,镜像(最核心的环境4m大小+jdk+mysql)十分的轻巧,运行镜像即可。
三、docker能做什么
之前的虚拟机技术
缺点:资源占比十分多
冗余步骤多
启动man
容器化技术
容器技术:不是一个完整的操作系统

比较docker和虚拟机技术的不同
1.传统虚拟机,虚拟出一个硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件。
2.容器内的应用直接运行在宿主机,容器是没有自己的内核的,也没有虚拟我们的硬件,所以轻巧。
3.每个容器是相互隔离的,每个容器内都有一个属于自己的文件系统,互不影响。
一、 docker 的基本组成

镜像(image):
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像--run--tomcat01容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行)
容器(container):
docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建
启动,停止,删除,基本命令
仓库(repository):
仓库就是存放镜像的地方,仓库分为公有仓库和私有仓库
Docker Hub(国外) 阿里云也有容器的服务器(配置镜像加速!)
二、安装
(一)环境准备
1.需要会一点点的linux
2.linux系统
(二)安装步骤 ##我的系统为RHEL9 ,默认为root用户。
##提前配置好yum仓库,才可以使用yum命令
(1)安装 yum-utils 工具包,它是 CentOS/RHEL 系统中的一个实用工具集合,主要用于管理 yum 仓库和软件包。
root@localhost \~# yum install -y yum-utils
(2)添加官方仓库
root@localhost \~# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
(3)安装docker服务
root@localhost \~#yum install -y docker-ce docker-ce-cli containerd.io
(4)重启和查看状态
root@localhost \~#systemctl start docker.service
root@localhost \~#systemctl status docker.service
(5)加速源不能使用所以推荐几个可以使用的
root@localhost \~# cat > /etc/docker/daemon.json << 'EOF'
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
]
}
EOF ##启动重新再次启动docker服务
(6)验证
root@localhost \~#docker run hello-world
root@localhost \~# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
4f55086f7dd0: Pull complete
d5e71e642bf5: Download complete
Digest: sha256:452a468a4bf985040037cb6d5392410206e47db9bf5b7278d281f94d1c2d0931
Status: Downloaded newer image for hello-world:latest
Hello from Docker! ##看见这个就说明安装成功了
This message shows that your installation appears to be working correctly.
(三)查看安装的镜像
root@localhost \~# docker images
i Info → U In Use
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
hello-world:latest 452a468a4bf9 21.8kB 9.49kB U
nginx:latest 7150b3a39203 237MB 65.8MB
(四)卸载docker
##卸载依赖
root@localhost \~#yum remove docker-ce docker-ce-cli containerd.io
##删除资源
root@localhost \~#rm -rf /var/lib/docker ##/var/lib/docker是docker的默认工作路径
一、 run 的原理

二、 Docker 底层原理
(一)Docker是这么工作的
Docker是一个Client-server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!
DockerServer接受到DockerClient的指令,就会执行这个命令!

(二)Docker为什么会比vm快
1.docker有着比虚拟机更少的抽象层
2.docker利用的是宿主机的内核,vm需要是guest os

所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统的内核,避免引导guestos(分钟),而docker是利用宿主机的操作系统,省略了复杂的工程(秒级)
一、帮助命令
docker version ##显示docker的版本信息
docker info ##显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help ##帮助命令
二、镜像命令
(一)管理查看本地镜像 images
root@localhost \~# docker images
IMAGE ID DISK USAGE CONTENT SIZE
hello-world:latest 452a468a4bf9 21.8kB 9.49kB
nginx:latest 7150b3a39203 237MB 65.8MB
##解释
IMAGE:名字
ID:镜像id号
DISK USAGE:镜像在宿主机磁盘上实际占用的空间
CONTENT SIZE:指镜像中所有文件和目录的逻辑总和
常用选项
-a ##列出所有镜像
-q ##只显示镜像id
(二)搜索docker hub中的镜像命令docker search
root@localhost \~# docker search mysql
(三)下载docker hub中的镜像
root@localhost \~# docker pull mysql ##下载
Using default tag: latest
latest: Pulling from library/mysql
660dee12630a: Pull complete ##分层下载,docker images的核心,联合文件系统
f7eb4be426a1: Pull complete
d4c7048d1cf1: Pull complete
7ef200aee2ac: Pull complete
fc3bc5fe2030: Pull complete
3a83832a6208: Pull complete
Digest: sha256:24e450bbd24f621c71b10404c946cc9ea1cbb0e6e7464b2be2de5193dcf1d05b ##签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest ##真实地址 等价于docker pull mysql
指定版本下载
root@localhost \~# docker pull mysql**:**5.7
##已经下载的部分是不会下载的。大大的节约了空间
(四)删除本地镜像
root@localhost \~# docker rmi -f 24e450bbd24f ##删除指定镜像
Untagged: mysql:latest
Deleted: sha256:24e450bbd24f621c71b10404c946cc9ea1cbb0e6e7464b2be2de5193dcf1d05b
root@localhost \~#docker rmi -f 镜像号 镜像号 ##删除多个镜像
root@localhost \~#docker rmi -f $(docker images -qa) ##删除全部的镜像
三、容器命令
说明:我们有镜像才可以使用容器,下载一个centos镜像来测试学习
root@localhost \~# docker pull centos
(一)新建容器并启动
docker run 可选参数 image
参数说明
--name="容器名" ##容器名字,用来区分容器
-d ##后台方式运行
-it ##使用交互式方式,进入容器查看内容
-p ##指定容器的端口
-p 主机端口:容器端口(常用)
-p ip:主机端口:容器端口
-p 容器端口
容器端口
-P ##随机指定端口
测试,启动并进入到容器
root@localhost \~# docker run -it centos:latest
root@402331da155d /# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
退出容器回到主机
root@402331da155d /# exit
exit
(二)docker ps列出所有运行的容器
root@localhost \~# docker ps ##列出当前正在运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@localhost \~# docker ps -a ##列出正在运行的容器以及历史运行给的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
402331da155d centos:latest "/bin/bash" 3 minutes ago Exited (0) 3 minutes ago cool_black
351f9b7a978f 452a468a4bf9 "/hello" 3 hours ago Exited (0) 3 hours ago inspiring_swartz
root@localhost \~# docker ps -a -n=1 ##显示最近创建的容器
root@localhost \~# docker ps -aq ##显示容器编号
(三)退出容器
exit ##直接容器停止并退出
ctrl +p +q ##容器不停止退出
(四)删除容器
docker rm 容器id ##删除指定的容器,不能删除正在运行的
docker rm -f 容器id ##强制删除容器
docker rm -f $(docker ps -aq)##删除所有的容器
(五)启动和停止容器
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id
四、常用其它命令
(一)后台启动容器
root@localhost \~# docker run -d centos:latest ##docker run -d 镜像名
14af106bb1bd058ed65a7194faceb19b830f2a858a54b673821f21b8807ab3fe
##问题使用docker ps,发现centos停止了。
##常见的一个坑,docker容器使用后台运行,就必须要一个前台进程,docker发现没有应用。
就会自动停止
##nginx容器启动后,发现自己没有提供服务,就会立刻停止,就没有了程序
(二)查看日志
##先运行一个容器,需要容器id
root@localhost \~# docker run -d centos:latest /bin/bash -c "while true do;echo xzh;sleep 2;done"
root@localhost \~# docker ps ##列出所有运行的容器,为了查看容器id
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
009806c7f27f centos:latest "/bin/bash -c 'while..." 4 seconds ago Up 3 seconds trusting_jones
root@localhost \~# docker logs -tf --tail 10 009806c7f27f ##查询容器的日志
##docker logs -tf --tail num 容器id
##-tf 显示日志的时间戳和日志
##--tail num 显示多少条日志
(三)容器中的进程信息
##docker top 容器id
root@localhost \~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e0e594a7b61c centos:latest "/bin/bash -c 'while..." 4 seconds ago Up 4 seconds festive_lalande
root@localhost \~# docker top e0e594a7b61c
UID PID PPID C STIME TTY TIME CMD
root 18035 18007 0 11:16 ? 00:00:00 /bin/bash -c while root 18234 18035 0 11:17 ? 00:00:00
(四)查看容器的元数据
root@localhost \~# docker inspect e0e594a7b61c
{ "Id": "e0e594a7b61c22950e807bd2fdf39b1a9eede39c6c81fce9165aa41716320ffa", "Created": "2026-04-01T03:16:51.261143684Z", "Path": "/bin/bash", "Args": \[ "-c", "while true; do echo xzh;sleep 2;done" \], **五、进去容器及拷贝命令** (一)我们容器通常都是使用后台方式运行的,需要进入到容器,修改一些配置 ##docker exec -it 容器id /bin/bash ##docker exec 进入到容器后开启一个新的终端,可以在里面操作 \[root@localhost \~\]#**docker exec -it** f5bd3cc737b2 /bin/bash \[root@f5bd3cc737b2 /\]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 03:23 ? 00:00:00 /bin/bash -c while true; do echo xzh;sleep 20;done root 9 0 0 03:24 pts/0 00:00:00 /bin/bash root 23 1 0 03:24 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 20 root 24 9 0 03:24 pts/0 00:00:00 ps -ef (二)从容器内拷贝文件到主机上 ##docker cp 容器id:容器内文件路径 目的主机路径 \[root@localhost \~\]# docker cp f5bd3cc737b2:/docker.text / Successfully copied 1.54kB to / \[root@localhost \~\]# ls / boot docker.text home **一、** **commit** docker commit 将运行中的容器保存为一个新的镜像 **二、格式** docker commit -m="提交的描述信息" -a="作者" 容器id 新镜像名:\[tag
三、实战测试
(一)拉取并启动一个默认的tomcat
root@RHEl9 \~#docker pull uhub.service.ucloud.cn/library/tomcat:9.0.0.M4
root@RHEl9 \~#docker run -d -p 5656:8080 --name=tomcat uhub.service.ucloud.cn/library/tomcat:9.0.0.M4
(二)通过访问发现默认的tomcat是没有webapps应用文件,镜像的原因,默认就是没有这个文件
root@RHEl9 \~#curl localhost:5656
##或者网页访问:192.168.0.100:5656
(三)进到容器中拷贝基本的文件
root@RHEl9 \~# docker exec -it tomcat01 /bin/bash
##发现linux命令缺少、webapps目录下无内容、镜像应用默认最小化的
root@08939fb3891b:/usr/local/tomcat#cp -a webapps.dist/* webapps
(四)将操作过的容器通过commit提交为一个新镜像,这就是我们自己修改过的镜像。
root@RHEl9 \~#docker commit -a "xiazh" -m "this is my first commit " tomcat uhub.service.ucloud.cn/rhel9-xzh/tomcat:v1
uhub.service.ucloud.cn/rhel9-xzh/tomcat:v1 5c3d64c6465a 487MB 137MB
一、容器数据卷
数据,如果数据都在容器中,那么删除容器,数据会丢失。因此我们需要:"数据可以持久化"。
同理MySQL容器被删除,数据丢失,MySQL数据也可以储存到本地。
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,都可以同步到本地。
这就是卷技术!目录的挂载,将我们容器内的目录挂载到Liunx主机某一个目录上。

总结一句话:容器的持久化和同步操作!容器之间也是可以数据共享的。
二、使用数据卷
(一)方式一:使用命令挂载
docker run -d -v 主机目录地址 : 容器内目录 镜像
(1)案例1:启动centos镜像并将镜像中的/opt目录挂载到主机上的/tmp目录,挂载后创建一个文件,查看是否挂载成功
root@Client \~# docker run -it --name centos01**-v /opt/:/tmp/:Z** centos:latest /bin/bash
##查看一下挂载
root@Client opt# docker volume ls ##列出容器卷名
root@Client opt# docker volume inspect 容器卷名
{ "CreatedAt": "2026-04-07T13:22:05+08:00", "Driver": "local", "Labels": { "com.docker.volume.anonymous": "" }, "Mountpoint": "/var/lib/docker/volumes/73a11855f03525e6a010633dd9a/_data", "Name": "73a11855f03525e6a010633dd9a", "Options": null, "Scope": "local" }
(2)案例2:安装mysql并实现数据持久化
root@Client \~# docker run -d -p 3301:3306 -v /root/mysql/conf:/etc/mysql/conf.d -v /root/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=12345--name mysql01 uhub.service.ucloud.cn/rhel9-xzh/mysql:5.5.46
(二)具名和匿名挂载
(1)匿名挂载
##-v 容器内路径!
##-P 随机端口映射
root@Client \~#docker run -d -P --name nginx01 -v /etc/nginx nginx
(2)查看所有volume的情况
root@Client \~#docker volume ls
##上面这种就是匿名挂载,没有volume的名字,只有随机的数字
(2)具名挂载
root@Client \~#docker volume create volume01
root@Client \~#docker run -d -P --name nginx01 -v volume01 : /etc/nginx nginx
##查看详细的volume01信息,可以查看到volume01具体在主机的哪一个目录上
root@Client \~#docker volume inspect volume01
(三)使用Dockerfile制作镜像是挂载
(1)制作一个镜像
root@Client /# cat Dockerfile
FROM centos
VOLUME "volume01","volume02"
CMD /bin/bash
(2)构建为镜像
root@Client /# docker run -it --name centos03 centos:v1 /bin/bash
(3)运行容器
root@Client /# docker run -it --name centos03 cntos:v1 /bin/bash
root@d2ba81ec2d1c /# ls
bin etc lib lost+found mnt proc run srv tmp var volume02
dev home lib64 media opt root sbin sys usr volume01
挂载成功