何为docker?
docker:开源的容器引擎,基于go语言开发,是一种轻量级的虚拟化技术。
docker与传统虚拟机的区别:
-
虚拟机:
- 虚拟机在硬件上运行,每个 VM 都包括一个完整的操作系统(OS)、虚拟硬件和应用程序。虚拟机通过 hypervisor(如 VMware、Hyper-V 或 KVM)进行管理和资源隔离。
- 每个虚拟机都相对独立,拥有自己的内核和系统资源。
-
Docker:
- Docker 是基于容器的技术,容器共享宿主机的操作系统内核,但每个容器运行在独立的用户空间中。通过Linux内核的命名空间(Namespaces)和控制组(cgroups)技术实现资源隔离。
- 容器更加轻量,因为它们只包含应用程序和库,而不需要整个操作系统。
Docker与传统虚拟机区别
特性 | Docker容器 | 虚拟机 |
启动时间 | 秒级 | 分钟级 |
大小 | MB | GB |
性能 | 接近原生 | 弱于 |
支持量 | 单机上千个容器 | 几十个 |
由上图也可以发现,每一个虚拟机都包含完整的操作系统,属于完全虚拟化。而docker包含应用程序和其依赖项,与其他docker容器共享操作系统内核。 在主机操作系统上的用户空间中作为独立的进程运行。
Docker架构
Docker daemon
Docker的守护进程,负责管理镜像,容器,数据卷等。
Client
负责发送docker的操作指令,例如pull,run,push等,与docker daemon进行交互,日常主要通过client来完成镜像和容器的管理。
Images(镜像)
容器的模板,镜像可以继承,主要通过dockerfile来定义。
Container(容器)
镜像运行后的实例,通过镜像来创建,和镜像的关系类似:镜像是类,容器是对象。
Registry(仓库)
镜像仓库,用来存放各种镜像。
镜像的分层存储
操作系统通常被分为用户空间和内核空间,对于Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。
Docker镜像是一个特殊的文件系统,采用的是联合文件系统,分层存储架构,结构如下:
镜像是分层的,是只读的,同时镜像在构建时也会一层层构建,前一层是后一层的基础,每一层构建完后不会再发生变化,当前层的改变不会影响到前一层。只对当前层和后续层可知。
分层存储的一大好处就是:共享资源,一些公有层可以复用。比如有两个软件A和B,他们都是基于Base这个基础镜像的,那么基础镜像Base只需要保存一份即可,而无需重复下载。
当我们通过镜像启动一个容器时,会在改镜像的镜像层上面添加一个容器层,容器层是可写的,采用的是Copy-ON-Write策略,即写时复制,
写时复制
那什么是写诗复制呢,对一个镜像来说,它可以构建出多个容器,每个容器要想更改某个文件的话,会先从镜像层中复制一份到自己的容器层,对容器层中的该文件进行修改,而不影响镜像层中的文件,当我们退出了这个容器,那我们的修改也就失效了,再用镜像构建其他容器时,该文件还是未被修改的样子,这也是符合镜像层只读的特点的。
容器层的修改只对当前容器可见,不会影响到镜像层。
Docker的安装
安装不在赘述,参考华为源镜像站:https://mirrors.huaweicloud.com/mirrorDetail/5ea14d84b58d16ef329c5c13?mirrorName=docker-ce&catalog=docker
Docker基础命令
Docker的命令大致分为两类,一类是镜像方面的命令,一类是容器方面的命令。
镜像方面的命令
功能 | 命令 |
搜索镜像 | docker search 镜像名 |
拉取镜像 | dockers pull 镜像名:标签 |
查看镜像 | docker image ls |
查看镜像详细信息 | docker inspect 镜像名:标签 |
导出镜像 | docker save -o 保存名 镜像名:标签 |
导入镜像 | docker load -i 名字 |
删除镜像 | docker rmi 镜像名:标签 |
容器方面的命令
功能 | 命令 | 注意 |
启动容器 | 通过镜像启动新的容器:docker run 镜像名/id | 新启动容器 |
启动暂停的容器:docker start 容器id | 启动暂停的容器 | |
停止容器 | docker stop 容器id | -f 强制关闭 |
进入容器 | docker exec -it 容器id /bin/bash | 开启新终端,退出后不会导致容器停止 |
docker attach 容器id | 进入容器正在执行的终端,退出后会导致容器停止 | |
导出容器 | docker export -o 导出名 容器id | |
导入容器 | cat 导出的名字 | docker import - 镜像名 | 一定要注意import的-,以镜像的形式存在 |
查看容器日志 | docker logs 容器id | |
删除容器 | docker rm 容器id |
其他常用命令
命令 | 功能 |
docker ps | 显示正在运行的容器 |
docker ps -a | 显示所有容器(包括已经停止的) |
docker ps -qa | 只显示所有容器id |
docker cp 容器id:文件绝对路径 宿主机绝对路径 | 将文件从容器中复制出来(复制进去路径翻反过来即可) |
docker history 镜像名或id | 查看镜像的构建历史 |
docker container prune | 删除所有停止的容器==慎用! |
docker system prune -a | 更要慎用!!! |