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

挂载成功

相关推荐
AOwhisky11 小时前
Ceph系列第一期:Ceph分布式存储核心概念与架构初识
linux·运维·笔记·分布式·ceph·学习·架构
谷雨不太卷11 小时前
进程如何加载文件
linux·运维·服务器
shandianchengzi11 小时前
【记录】LosslessCut|Linux下配置开源无损剪辑软件 LosslessCut AppImage 命令行启动和设置图标
linux·运维·服务器·音视频·视频·剪辑
小猫咪0111 小时前
Linux 查看端口占用:netstat、ss、lsof 谁更好用?
linux·运维·网络
都在酒里11 小时前
Linux字符设备驱动开发(八):中断底半部——tasklet与工作队列实现按键消抖
linux·运维·驱动开发·交互
sszdzq11 小时前
docker 安装 rocketmq + dashboard
docker·容器·rocketmq
Tingjct12 小时前
【linux】part1-进程详解
linux·运维·服务器
小糖学代码12 小时前
LLM系列:环境搭建:4.Nginx使用教程
运维·python·神经网络·nginx
汪汪大队u12 小时前
XX校园网规划与搭建实验
运维·网络