Docker

一、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.1panel.live",

"https://hub.rat.dev",

"https://docker.m.daocloud.io",

"https://docker.1panel.dev",

"https://dockerpull.org"

]

}

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

挂载成功

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