(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 拉取成功后运行。

⚠️可以参考学习文档:https://docs.docker.com/engine/install/centos/

如果是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命令很多,以上只是基础的命令

Logo

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

更多推荐