Docker 学习笔记:保姆级讲解+命令速查,手把手带学(代码+图片展示)
虚拟机(vm):相当于在你电脑里,完整装了一台新电脑。它有自己的硬件(虚拟CPU/内存/硬盘)、自己的操作系统、自己的内核,完全独立的;·容器(docker):相当于在电脑里,给每个程序都开了一个独立的房间。他和宿主机都共享同一个操作系统内核,只是用隔离技术限制了资源和权限,不需要装新系统。【两者区别表】·传统虚拟机:虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件;·容器内
(1)容器和虚拟机有什么区别?
·虚拟机(vm):相当于在你电脑里,完整装了一台新电脑。它有自己的硬件(虚拟CPU/内存/硬盘)、自己的操作系统、自己的内核,完全独立的;
·容器(docker):相当于在电脑里,给每个程序都开了一个独立的房间。他和宿主机都共享同一个操作系统内核,只是用隔离技术限制了资源和权限,不需要装新系统。
【两者区别表】
| 对比项 | 虚拟机(VM) | 容器(docker) |
| 架构本质 | 硬件级虚拟化,模拟完整硬件 | 操作系统级虚拟化,共享宿主机内核 |
| 是否有独立内核 | 有,每个vm都有自己的内核 | 没有,共享宿主机的linux内核 |
| 启动速度 | 慢,分钟级(和正常开机一样) | 快,秒级(直接启动进程) |
| 资源占用 | 高,每个vm要占用完整的CPU/内存/磁盘 | 低,仅占用进程本身需要的资源 |
| 镜像大小 | 几GB到几十GB | 几MB到几百MB |
| 隔离程度 | 完全隔离,互相独立,安全性高 | 进程级隔离,和宿主机共享内核,安全性略低 |
| 部署方式 | 安装完整操作系统 | 基于镜像启动进程 |
| 迁移难度 | 复杂,需要迁移整个VM镜像 | 简单,镜像可跨平台直接运行 |
·传统虚拟机:虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件;
·容器内的应用直接运行在宿主机,容器是没有自己的内核,也没有虚拟机硬件,所以轻便;
每个容器是相互隔离,每个容器内都有一个属于自己的文件系统,互不影响。
⚠️docker 的核心概念:
· 镜像:相当于一个“安装包”或者“模版”,比如ubuntu系统镜像、mysql镜像
· 容器:镜像运行起来后的实例,相当于一个轻量级的虚拟机;
· 仓库:存放镜像的地方,比如:docker hub
(2)简述docker组成
docker采用客户端-服务器(c/s)架构:
客户端(Client) ←→ 守护进程(Docker Daemon) ←→ 镜像(Image) ←→ 容器(Container)
·docker客户端(Client):就是日常敲命令的地方,比如:
执行docker run/docker build/docker images这些命令,都是通过客户端发送给docker守护进程执行的。
只是一个命令行工具,不直接干活。
· docker守护进程(docker daemon):
是docker的后台服务,运行在宿主机上,叫dockerd;
所有的核心工作(构建镜像、管理容器、拉取镜像)都在做;
客户端发送命令,也是dockerd来做;
· docker镜像(image):
只是一个只读模版,相当于“系统安装包”
包含了运行应用需要的所有东西:代码、运行环境、依赖库、配置文件等
镜像不能直接运行,他是用来创建容器的“模版”
镜像的格式是分层的,比如你从centos镜像构建,再安装jdk,就会形成新的一层,方便复用和节省空间。
· docker容器(Container):
镜像运行的实例,相当于用镜像“装”出来的正在运行的系统。
容器是可读写的,启动时会在镜像的只读层上,加一层可读写层。
容器和容器之间、容器和宿主机之间,通过Namespace和Cgroups实现资源隔离。
容器里的进程,本质上就是宿主机上的进程,只是被隔离了。
(3)安装docker
【1】环境查看,首先系统的内核是3.1以上
uname -r #查看系统版本
cat /etc/os-release #也可以查看系统版本信息


【安装】
如果是centos7以下的,可以使用以下步
1. 卸载旧版本:
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-lastest-logorate \
docker-logrotate \
docker-engine
2. 需要的安装包:
yum install -y yum-utils
3. 设置镜像仓库
yum -config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo #此默认是国外的,比较慢;可以使用下面的阿里云
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #推荐
4. 更新软件包索引
yum makecache fast
5. 安装docker相关的;
yum install docker-ce docker-ce-cli containerd.io
6. 启动docker
systemctl start docker
7. 验证是否启动成功
docker version
8. 可以用helloworld来验证一下
docker run hello-world
# ⚠️可能有点慢;第一行会显示unable to find image 'hello-world:'lastest'locally'表示没有寻找这个镜像,这很正常,第一次去跑是这样的,下面会远程拉取镜像,随后会出现pull conplete 拉取成功后运行。
如果是centos8、9等
1. 先卸载旧文件
sudo dnf remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2. 使用rpm存储库进行安装(也可以选用其他方式安装,具体请看文档)
sudo dnf -y install dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
⚠️:可能会出现各种错误,一般都是镜像加速器的问题,可以多修改几个,也可以尝试使用其他测试来验证镜像,例如
docker run alpine echo "Docker is working"
修改镜像地址步骤:
(1)修改docker镜像加速器
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
EOF
##⚠️:上面的地址是可以修改的,如果遇到加速地址没有权限/失效,那就修改一个
(2)重启docker让配置生效
sudo systemctl daemon-reload
sudo systemctl restart docker
(3)再次测试拉取镜像
docker run alpine echo "Docker is working"
(4)底层原理
【1】run的运行流程图:

【2】docker 是如何工作的
docker 是一个client-server结构的系统,docker的守护进程运行在主机上。
通过socket从客户端访问—>dockerserver接收到docker-client的指令,就会执行这个命令

【3】docker为什么比vm块
docker有着比虚拟机更少的抽象层;
docker利用的是宿主机的内核,vm需要guest os;
总结:新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导性操作。虚拟机上加载guest os,分钟级别;docker是利用宿主机的操作系统,省略了这个复杂的过程,秒级。
虚拟机架构 docker架构
每个虚拟机都有: 每个容器:共享主机内核;没有独立的操作系
完整的操作系统;完整的内核;完整的驱动;分钟 统;只有应用+依赖;毫秒级启动


关于轻量级隔离技术:

(5)docker 常用命令
【帮助命令】
docker version #显示docker 的版本信息
docker info #显示docker的系统信息,包括镜像和容器数量
docker --help #帮助命令
参考地址:https://docs.docker.com/reference/

【镜像命令】
【启动docker】
首先可以判断一下docker服务有没有运行;
systemctl status docker #检查docker服务状态
#⚠️:如果显示inactive(dead)或者failed表示没有运行

systemctl start docker #启动docker服务

systemctl enable docker #设置开机自启
systemctl is-enbaled docker #验证开机自启是否成功
【查看所有本地的主机上的镜像】
docker images #验证docker 是否正常运行
docker images --help
· -a,--all #列出所有镜像
· -q,--quiet #只显示镜像的id
docker search #搜索镜像
docker search mysql #docker hub 仓库里搜索镜像;(也就是说去docker官方镜像仓库找所有名字带mysql的镜像)
⚠️:其中stars表示收藏数/点赞数
【下载镜像】
docker pull 镜像名字[:tag] #下载镜像
docker pull mysql #下载
等价于
docker pull mysql
docker pull docker.io/library/mysql:latest
⚠️:指定版本下载
docker pull mysql5.7
⚠️:由于前面已经下载了mysql,所以在这个版本中,省略掉了前期已经下载的东西,只需要下载版本5.7中的内容即可
【删除镜像】
docker rmi [名称/image id] #删除镜像(i表示images)
docker rmi -f 容器id 容器id 容器id #可以删除多个容器
docker rmi -f c11782aa2a96 #删除容器

docker rmi -f $(docker images -aq) #删除全部的镜像 ;aq是查处所有镜像的id

【容器命令】
有了镜像才能创建容器,我们可以尝试下载一个centos镜像来测试学习
docker pull centos
【启动命令】
docker run [可选参数] image
· --name=“Name” 容器名字 tomcat01 tomcat02,用来区分容器
· -d 后台方式运行
· -it 使用交互方式运行,进入容器查看内容
· -P 大写p,随机指定端口
· -p 小写p,随机指定端口
⚠️:-P(大写p)的四种使用方式:
· -P 主机端口:容器端口 ;主机端口映射到容器端口了(常用📍)
· -P ip:主机端口:容器端口
· -P 容器端口
· 容器端口;(直接跟容器端口)
docker images #查看
docker run -it centos /bin/bash #启动并进入容器
⚠️;用
centos镜像创建一个新容器,并为它分配一个交互式终端,然后在容器里启动 Bash Shell,让你可以直接操作这个 CentOS 系统。⚠️;效果就是,“进入”了一个最小化的 CentOS 系统,可以在里面执行各种 Linux 命令。
【列出容器】
docker ps #l列出所有的运行容器
-a #列出当前正在运行的容器+带出历史运行过的容器
-n=? #显示最近创建的容器(例如n=1;指显示一个容器)
-q #只显示容器的编号‘


【进入退出容器】
docker run -it centos:7 /bin/bash #进入容器
⚠️:docker run是一个复合命令,等价于:创建启动-进入容器

退出容器:
方法1:
control+P+Q #容器不停止退出;⚠️此时的control是mac版本中;win是ctrl+P+Q
方法2:
exit #直接退出
返回容器/进入容器:
方法1:
docker attach 60b7f54c34ea #重新连接到原来的bash;
⚠️;直白的说就是如果你想继续之前未完成的工作,那就用这个
方法2:
docker exec -it 60b7f54c34ea /bin/bash #重新开一个终端进入

【删除容器】
docker rm 容器id #删除指定的容器
docker rm 18b7d0c39c1a #删除18b7d0c39c1a(容器id)容器
⚠️正在运行的运行的容器是不能删除的


docker rm -f$(docker ps -aq) #删除所有的容器

⚠️:【扩展】
docker ps -a -q|xargs docker rm #删除所有的容器
【启动和停止容器】
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前使用的容器
docker kill 容器id #强制停止当前的容器

⚠️注意docker start 是启动一个已存在的(已停止的)容器;
【后台启动容器命令】
docker run -d 镜像名;
docker run -d centos #这时会出现一个问题,在docker ps时发现centos停止了
⚠️:常见的坑:docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止;
⚠️:nginx,启动后,发现自己没有提供服务就会立刻停止,那么就会没有程序了;
【查看日志】
docker logs [-f/-t/-ft] 容器名称或ID #
· -f 实时跟踪:持续输出新增的日志,就像tail -f一样,不回退出,知道你按control+c终止
· -t 显示时间戳:给每一条日志前面加上时间戳
· -ft 实时跟踪日志,并且每条日志前面带上时间戳
docer logs -ft --tail 10 02a5971d22fb #显示最后十行

docker run -d centos /bin/sh -c "while true;do echo xiaoqian;sleep 1;done"
#自己编写一段shell脚本运行;
docker logs -ft --tail 10 2d3e842367e0 #查看日志;显示最后十行,并为每行日志加上时间戳,持续实时跟踪新输出的日志
⚠️:--tail 10 表示输出最后十行,不满十行全部输出


【查看容器中进程信息】
docker top 容器id #查看容器中进程信息
docker top 2d3e842367e0 #查看容器信息

【查看容器的原数据】
docker inspect 容器id #一个用来查看容器或镜像的详细信息的命令。它会返回一个 JSON 格式的数据,包含配置、网络、状态、挂载卷、环境变量等所有底层元数据。
docker inspect 2d3e842367e0 #查看当前容器的信息

【拷贝】
docker cp 容器id #从容器内拷贝;从容器内拷贝文件到主机上

# docker命令很多,以上只是基础的命令
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐














所有评论(0)