Docker学习: Docker介绍和安装以及常用命令
1、Docker学习
文章目录
- 1、Docker学习
- 1. Docker介绍和安装
- 2. Docker常用命令
1. Docker介绍和安装
- Docker解决什么问题
- 传统的开发模式中,由开发者编写源码后直接把源码打包,这时候如果想要运行则必须配置相应的环境和依赖,使得运行的成本很高,且很容易出错,仅仅将源码打包,此时运行时要重新配置相应的环境和依赖,故使用Docker,将项目的环境和配置全部打包为镜像文件,此时直接对镜像文件创建容器运行即可,且容器相对于VM,不需要虚拟整个硬件和OS,其运行在宿主机的内核上
- 在传统的虚拟机技术中,可以实现在一个OS中运行另一个OS,但要虚拟化所有硬件并安装完整的OS镜像才可以运行,此时会耗费大量的资源,且冗余步骤过多,且启动慢
- 为了解决这一问题,引入了容器虚拟化技术,将应用运行所需的所有环境和依赖配置全部打包为一个镜像文件,然后当使用时直接根据镜像文件创建一个容器实例来运行该镜像
- 镜像就相当于一个类模板,根据镜像来创建具体的容器实例,容器就是一个实际运行的应用,仓库中存放各种镜像
- 镜像类似于一个类模板,当需要使用时创建一个容器实例来运行该镜像,仓库中存放了各种镜像文件
- Docker基本组成
- Docker由镜像、容器和仓库构成
- 镜像就是将应用源码以及环境配置依赖全部打包后的文件,容器就是根据镜像所运行的实例,仓库中存放各种镜像
- 镜像中只包含了应用运行所需的最小资源,仅仅是runtime资源
- Docker依赖于运行的Linux内核,故必须部署在Linux系统中
- Docker必须部署在Linux系统上
- Docker架构
- Docker是Clint-Server结构的系统,后台守护进程运行在主机上,客户端通过socket连接访问,由守护进程接受客户端命令并管理运行在主机上的容器
- 容器是一个运行时环境![[Pasted image 20241106185502.png]]
- Docker安装:必须部署在Linux系统上
- Docker必须部署在Linux系统上,依赖于允许的Linux内核,只可以在Linux系统下部署Docker,对于Windows系统要先下载一个Linux的虚拟机,然后在虚拟机上部署Docker![[Pasted image 20241106191104.png]]
- 设置stable镜像仓库![[Pasted image 20241106191511.png]]![[Pasted image 20241106191556.png]]
- 更新yum软件包索引![[Pasted image 20241106191630.png]]
- 安装DockerCE引擎![[Pasted image 20241106191715.png]]
- 启动Docker:systemctl start docker
- 测试:docker version![[Pasted image 20241106192141.png]]
- 运行容器:docker run hello-world;当docker执行一个镜像时,如果本地有则直接创建一个容器实例运行,否则去仓库中拉取镜像后再创建docker容器
- Docker卸载
- ![[Pasted image 20241106192128.png]]
- 阿里云镜像加速器
- 为了使Docker拉取镜像以及发布镜像更快速,可以使用阿里云提供的镜像加速器,镜像要从阿里云拉取并发布到阿里云,故使用加速器可以更加快速
- 容器镜像服务 - 镜像加速器![[Pasted image 20241106192946.png]]
- 在linux上配置镜像加速器![[Pasted image 20241106193013.png]]
- Docker run hello-world
- 当安装好docker后就可以根据指定的镜像来运行容器,如果本地没有指定的镜像,则会从配置的stable仓库中拉取镜像到本地然后再创建容器实例运行该镜像,当dockerHub也没有指定的镜像时会报错
- docker run 的执行流程:1、先在本地找指定的镜像,如果找到则直接创建容器实例运行,2、当本地没有时会从仓库中找指定的镜像,找到了先拉取到本地,然后创建容器实例运行镜像,找不到则返回错误 ![[Pasted image 20241106193414.png]]
- 为什么Docker比VM快
- 为什么在Docker上运行应用比创建一个虚拟机再运行应用更快?VM要虚拟一整套硬件和OS,然后启动后才可运行应用,占用资源多,冗余步骤多,启动慢;而Docker容器部署在Linux系统上,使用Linux内核运行容器,只需要把镜像拉取到本地然后创建容器实例来运行即可
- 区别:Docker利用宿主机的内核,不需要一套完整的硬件和OS,不需要硬件资源虚拟化 ![[Pasted image 20241106193854.png]]
- VM必须包含操作系统的所有硬件以及软件资源,然后启动才可以运行应用,而Docker只需要runtime资源,且利用宿主机的内核,故速度比VM快![[Pasted image 20241106195419.png]]![[Pasted image 20241106195250.png]]
- Docker就是一个软件,在软件中运行应用,因为要使用Linux内核,故只可部署在Linux系统上
2. Docker常用命令
Docker命令是 docker command [options]
格式,命令之后直接输入可选参数
- 帮助启动命令
- docker info:查看docker概要信息
- docker --help:总体帮助文档
- docker 命令 --help:具体命令文档,给出某个命令的使用方法以及可选的各个参数,参数类型有 -x 和 --xxx ,-x 一般都是 --xxx 的简化,且 -x 后面加值,–xxx=xx 来赋值
- ![[Pasted image 20241106195612.png]]
- 镜像命令
- Docker运行流程
- 当在Docker运行一个容器时,会先从本地找镜像,如果本地没有则去仓库中拉取镜像到本地,然后再创建容器实例运行,一个镜像可以创建多个容器实例,一个镜像可以创建多个容器,通过 REPOSITORY:TAG 表示一个镜像,TAG是版本号,默认为LATEST
- docker images:列出本地仓库中的镜像
- 列出本地主机上的镜像;OPTIONS:-a(列出本地所有的镜像)、-q(只显示镜像ID)
- 并给出各个镜像的仓库源(镜像名称)、版本TAG、镜像的ID、创建时间、虚拟大小
- 用 REPOSITORY:TAG 来定义镜像
- 同一个仓库源(镜像名称)可以有多个不同版本TAG的镜像,用REPOSITORY:TAG来定义不同的镜像,如果不指定仓库源的TAG则默认LATEST镜像
- ![[Pasted image 20241106201124.png]]
- docker search 镜像名称
- 在远程仓库中查找指定的镜像![[Pasted image 20241106202708.png]]
- OPTIONS:–limit N:只列出前N个镜像,默认25;命令之后先输入可选参数
- docker pull(push)
镜像名称[:TAG]
- 从远程仓库中拉取指定的镜像保存到本地仓库中,可以指定镜像的TAG版本,不指定时默认拉取LATEST最新版![[Pasted image 20241106203357.png]]
- docker system df
- 查看镜像/容器/数据卷所占的空间
- docker rmi 镜像名字/ID
- 从本地仓库中删除指定的镜像![[Pasted image 20241106204252.png]]
- docker可以实现命令的虚传,通过 $(docker images -qa) 可以将该命令的结果作为参数传入另一个命令中
- docker的虚悬镜像是什么?
- 虚悬镜像:仓库名和TAG版本标签均为none的对象![[Pasted image 20241106205734.png]]
- ![[Pasted image 20241106200947.png]]
- Docker运行流程
- 容器命令
有镜像才可以创建容器,根据镜像创建容器实例,Docker必须部署到Linux系统上,依赖于Linux内核运行,必须有镜像才可以启动容器- 新建+启动容器
- 当使用VM创建Ubuntu时,必须先安装Linux系统,虚拟相应的硬件资源,然后启动Linux后才可以启动Ubuntu,但当使用Docker时,此时直接从远程仓库中 PULL Ubuntu 镜像,然后根据镜像启动容器运行即可
docker run [OPTIONS] IMAEG [COMMAND][ARG]
![[Pasted image 20241106213927.png]]- 通过 -it 启动交互式容器(-i以交互模式启动容器,-t分配一个伪终端),还可以在后面添加命令![[Pasted image 20241106215104.png]]
- 通过 -d 后台运行容器并返回容器ID,启动守护式容器
- -P是随机端口,-p是指定端口,通过宿主机端口去找容器的端口
- 列出所有正在运行的容器实例
- docker ps OPTIONS ![[Pasted image 20241106220212.png]]
- 同一个镜像IMAGE可以创建多个容器实例,且每个容器实例相互独立,有唯一的容器ID,且可以通过 --name=xxx 为容器实例指定名字,当不使用 --name=xxx 指定名字时,会自动分配一个名字
- 新建+启动容器