Docker_01_基础概念

@

Docker基础

镜像(image):类似模板,可通过模板创建容器(一个镜像可创建多个容器)

容器(container):类似简易的Linux内核,能够独立运行一个或者一组应用

仓库(repository):存储镜像,分为公有仓库和私有仓库


如:镜像、容器和仓库运行的流程
在这里插入图片描述

工作原理

在这里插入图片描述


如:使用Docker输出“hello-world”
在这里插入图片描述

镜像

镜像:一种轻量级、可执行的独立软件包

1)可用来打包软件运行环境和基础运行环境开发的软件

2)其包含运行某个软件所需的所有内容(包括代码、运行时的库、环境变量和配置文件等)

3)得到镜像途径:仓库下载、主机拷贝、自制(DockerFile)


images命令:列出主机上的镜像

指令格式:docker images 选项

选项 含义
-a 列出所有镜像
-q 仅显示镜像ID
-f 设置过滤选项显示
镜像名 显示指定镜像的相关信息

如:若不添加选项,默认显示如下
在这里插入图片描述

内容 说明
REPOSITORY 镜像名
TAG 镜像的标签 (通常用来标识镜像的版本)
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小

search命令:在仓库中搜索指定的镜像

指令格式:docker search 镜像名 选项

选项 含义
-f 设置过滤选项搜索

如:搜索STARS大于3000的MySQL镜像
在这里插入图片描述

内容格式:仓库名 镜像描述 用户评价 是否官方 自动构建


pull命令:下载镜像

指令格式:docker pull 镜像名:标签

1)从指定仓库中下载镜像:“docker pull 仓库名/镜像名:标签”

如:若不指定标签,则默认下载last(最新版)
在这里插入图片描述

//“last”标签代表最新版本


rmi命令:删除主机上指定镜像
指令格式:docker rmi 选项 镜像ID

选项 含义
-f 强制删除

//若删除多个镜像,镜像之间使用空格分隔

//为保证删除命令运行,建议每次删除带上-f选项

联合文件系统

联合文件系统(UnionFS):一种分层、轻量级并且高性能的文件系统

1)支持对文件系统的修改作为一次提交来一层层的叠加;

2)可以同时将不同目录挂载到同一个虚拟文件系统下


UnionFS是Docker镜像的基础:

1)镜像通过父镜像的分层继承,制作各种具体应用的镜像;

2)一次可同时加载多个文件系统,但只能看到一个文件系统


如:Docker镜像实际上就是由一层一层的文件系统组成
在这里插入图片描述


(1)bootfs(boot file system):主要包含bootloader和kernel

1)Linux启动时会加载bottfs文件系统,Docker镜像的最底层是bottfs

2)原理:类似Linux/Unix系统包含的boot加载器和内核,当boot加载完成之后整个内核都在内存中,此时内存的使用权由boot转交至内核,系统会卸载boot

3)不同发行版本的系统也可共用一个bootfs


(2)bootloader:引导加载kernel,


(3)rootfs(root file system):存在与bootfs之上

1)所包含文档类似Linux系统中的/dev、/proc、/bin、/etc等标准目录和文件

2)rootfs在不同的发行版本的系统其包含的文档也可能不同


镜像快的原因:镜像共用最底层的bootfs,但拥有自己的rootfs

1)rootfs可以很小,只需包含最基本的命令、工具和程序库就可以了

写时复制

写时复制(Copy on write):若多个程序同时要求相同资源时,程序会取得相同的指标(指向相同的资源),直到某个程序尝试修改资源时,系统才会真正复制该资源的一个副本发给该程序,以避免被修改的资源被直接察觉到

1)若没有程序尝试修改资源,则就不会有副本建立

镜像层

镜像层:所有的Docker镜像都起始于一个基础镜像层,当修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。


如:在Ubuntu镜像的基础上安装Python和Security Patch镜像
在这里插入图片描述

1)在添加额外的镜像层时,镜像始终保持当前所有镜像的组合


如:将两个互不冲突的镜像打包成一个镜像
在这里插入图片描述

2)若上层镜像层中的文件与下层有冲突/重复的,则上层镜像层中的文件会覆盖底层镜像层中的文件


如:第3层的文件7是第2层的文件5的升级版

1)镜像内部的文件情况
在这里插入图片描述

2)实际下载看到的镜像层:
在这里插入图片描述


容器层:当容器启动时,一个新的可写层被加载到镜像的头层

镜像层:容器层以下的层(镜像层都是只读的)


如:当拉取一个Tomcat镜像,并运行时
在这里插入图片描述


如:当下载一个镜像时,可看到镜像是一层一层的在下载

1)拉取redis镜像
在这里插入图片描述

2)通过docker inspect redis查看镜像
在这里插入图片描述

容器

容器:根据镜像格式进行标准操作后的,一个运行环境

1)镜像名和镜像ID是同义的(两者可相互替换);

2)所有容器默认存储在/var/lib/docker/containers目录


run命令:以指定镜像建立容器

指令格式:docker run 选项 镜像ID

//拥有镜像前提下才可创建容器(一个镜像可建立多个容器)

选项 含义
--name container 指定容器的名称为container (镜像名称具有唯一性)
-d 以后台方式运行容器
-i 交互方式运行容器 (通常于-t选项一起使用)
-t 分配一个伪输入终端
-p 指定方式 指定容器端口
-P 随机容器端口 (首先尝试EXPOSE指定端口,再随机)
--restart 指定容器需重启时的退出代码
-v 挂载方式 添加数据卷使容器目录挂载到主机
--volume-from 容器名 将指定容器的数据卷添加到该容器中
-w 目录路径 指定容器的登入/工作目录
-e 环境变量 传递指定的环境变量到容器内
-u 用户名:用户组 指定运行容器的用户/用户组 (可仅指定用户/用户组)
--link 容器名 链接容器
--privileged 以特权模式启动Docker (主要用于实现Docker内部运行Docker)

1)容器命名可使用字符:a~z、A~Z、0~9、下划线、圆点和横线

2)Docker容器若在后台运行,就必须有一个对应前台进程

//若容器没有对应的前台进程,就会自动停止(容器仍存在)


如:在后台运行Centos容器,再列出当前正在运行容器
在这里插入图片描述

3)交互式运行,可进入容器内部


如:建立一个Centos容器并查看内容
在这里插入图片描述

//exit属于将容器结束并退出,Ctrl+P+Q属于将容器放入后台并退出


4)-p选项指定容器端口的4种方式:

(1)-p 容器端口

说明:暴露指定容器端口,并随机映射到主机端口(一般为32768~61000)

(2)-p 主机端口:容器端口

说明:暴露指定容器端口,并映射到指定主机端口

(3)-p IP:IP端口:容器端口

说明:暴露指定容器端口,并映射到指定IP的指定端口

(4)-p IP::容器端口

说明:暴露指定容器端口,并随机映射的指定IP的端口

5)--restart选项:在容器关闭时,根据容器的退出代码,判断容器是否重启


如:指定无论nginx容器的退出代码是说明,在nginx关闭时,重启该容器
在这里插入图片描述


如:指定mysql容器的退出代码为非0的时候,才进行重启,并指定重启次数5
在这里插入图片描述


6)-v选项添加数据卷到容器的3种方式:

//3种方式均可通过在最后添加“:权限”,指定容器内目录的权限


(1)匿名挂载方式:-v 容器目录

说明:在主机创建数据卷“/var/lib/docker/volumes/随机名称”

//数据默认存储在该目录下的“_data”目录下


如:使用匿名挂载方式创建centos1容器

1)创建centos1容器,挂载数据卷xxx,并在/xxx目录下创建123文件
在这里插入图片描述

2)查看/var/lib/docker/volumes/数据卷名/_data目录下文件
在这里插入图片描述


(2)具名挂载方式:-v 指定名称:容器目录

说明:在主机创建数据卷“/var/lib/docker/volumes/指定名称”

//数据默认存储在该目录下的“_data”目录下


如:使用具名挂载方式创建centos2容器

1)创建centos2容器,挂载数据卷yyy,并在/yyy目录下创建456文件
在这里插入图片描述

2)查看/var/lib/docker/volumes/指定卷名/_data目录下文件
在这里插入图片描述


(3)指定宿主机路径挂载方式:-v 主机目录:容器目录

说明:在主机创建数据卷“指定主机目录”

//数据直接存储在指定主机目录下


如:使用指定宿主机路径挂载方式

1)创建centos3容器,挂载数据卷zzz,并在/zzz目录下创建789文件
在这里插入图片描述

2)查看/centos3目录下文件
在这里插入图片描述

7)--volume-from选项:实现多个容器之间的数据共享

如:使两个MySQL容器数据同步
在这里插入图片描述


ps命令:查看主机上的容器信息

指令格式:docker ps 选项

1)无选项,则默认仅列出当前正在运行的容器

选项 含义
-a 列出所有运行过的容器信息(包括正在运行的)
-l 仅列出最后一个运行的容器 (无论当前是否在运行)
-q 只列出容器的ID
-n=N 列出前N个容器信息

如:列出主机运行过的容器和前两个的容器ID
在这里插入图片描述

内容格式:容器ID 创建容器的镜像 容器最后执行的命令 创建时间 容器的退出状态


rm命令:删除指定容器

指令格式:docker rm 选项 容器名

选项 含义
-f 强制删除

//若容器正在运行,则无法删除(-f可强行删除)

//删除多个容器时,容器名之间使用空格分隔


如:删除Centos容器
在这里插入图片描述


commit命令:根据主机上指定容器生成一个镜像副本

指令格式:docker commit 选项 容器名 镜像名:TAG

选项 含义
-a=“string” 指定该镜像作者
-m=“string” 描述镜像信息

//本质:将容器层变为镜像层,从而生成一个新镜像


如:创建一个容器Tomcat的镜像副本
在这里插入图片描述

管理

logs命令:列出容器日志

指令格式:docker logs 选项 容器名

选项 含义
-f 跟踪日志输出 (类似Linux中tail -f)
-t 同时列出日志的时间戳
--tail N 列出前N条日志 默认显示全部的日志信息

inspect命令:查看容器的源数据

指令格式:docker inspect 容器名

//显示配置、名称、命令和网络配置等信息


如:查看上列中的Centos源数据
在这里插入图片描述


top命令:查看运行的容器中进程信息

指令格式:docker top 容器名


如:查看正在运行的Centos容器中的进程
在这里插入图片描述


stats命令:显示指定容器的统计信息

指令格式:docker stats 容器名

//若显示多个容器的信息,容器之间使用空格分隔


如:列出指定容器ID的统计信息
在这里插入图片描述

内容格式:容器ID 容器名 CPU 内存 网络I/O 磁盘I/O PIDS


exec命令:以新终端进入正在运行的容器

指令格式:docker exec 选项 容器名

选项 含义
-i 以Stdin打开
-t 分配一个伪输入端

如:以Bash shell终端进入Centos容器
在这里插入图片描述


attach命令:进入正在运行的容器

指令格式:docker attach 容器名

命令 区别
exec 以新的终端进入容器,并可启动新的进程
attach 直接进入容器终端,且不会启动新的进程

//两者共同点在于:该容器必须是正在运行的,否则无法进入


cp命令:将容器内数据拷贝到主机或其他容器上

指令格式:docker cp 容器名:容器内路径 目的主机路径

//容器存在,则容器的数据就存在(不与其是否运行有关)


如:将CentOS容器内的/home目录拷贝到主机上的/root目录下
在这里插入图片描述


容器其他相关命令:

启动容器:docker start 容器名

停止容器:docker stop 容器名

强制停止容器:docker kill 容器名

重启容器:docker restart 容器名

仓库

login命令:登录到Docker Hub

指令格式:docker login

1)输入命令后,会提示输入用户名和密码进行验证登录;

2)也可通过“-u 用户名 -p 密码”直接登录(安全性低)

3)登录成功后,个人认证信息将保存到“~/.docker/config.json”文件中


如:登录Docker Hub,并在登录成功后查看个人认证信息
image


logout命令:退出登录的Docker Hub

指令格式:docker logout

//退出登录的同时,个人认证信息文件中的信息也会被删除


如:退出Docker Hub
在这里插入图片描述


save命令:将多个镜像打包成一个指定压缩镜像文件

指令格式:docker save -o 打包文件名.tar 镜像1:Tag 镜像2:Tag


load命令:将save打包的镜像文件解压到主机镜像仓库

指令格式:docker load -i 压缩包名

//若本地已存在该镜像,则本地镜像会被覆盖


export命令:将多个容器的基础镜像打包成一个指定压缩镜像文件

指令格式:docker import -o 打包文件名.tar 容器1ID 容器2ID


import命令:将exprot打包的镜像文件解压到主机镜像仓库

指令格式:docker import 压缩包名

//若对镜像重命名,可在压缩包名后加“镜像名:版本号”

导出 导入
save export load import
从镜像中保存镜像,具有历史记录和元数据,支持事务回滚 从容器中保存基础镜像,没有历史记录和元数据,不支持事务回滚 载入save打包的文件,导入镜像,不能对载入的镜像重命名 载入export打包的文件,导入为容器的基础镜像,可对载入的镜像重命名

tag命令:标记主机镜像,并将其归入某一仓库

指令格式:docker tag 源镜像:Tag 用户名/仓库名:新镜像名

1)镜像名本质为Tag,不过为了在仓库中便于管理,使用新镜像替代Tag

//若需表达版本,可在新镜像名后添加特殊字符以示


push命令:将主机镜像上传到当前登录的镜像仓库

指令格式:docker push 用户名/仓库名:新镜像名

1)可在镜像名前加“--disable-content-trust”取消镜像校验(默认开启)

2)若上传的仓库不存在,则默认创建该仓库


如:上传mysql1.0镜像至meaningofself用户的forstudy仓库

1)上传;
在这里插入图片描述

2)验证
在这里插入图片描述

数据卷

数据卷:一个或多个容器中特殊指定的目录

1)实现容器与主机和容器,容器和容器之间的数据同步/共享

2)数据卷可以在容器间共享和重用,且共享数据卷的容器不一定要运行;

3)数据同步属于双向绑定,一方修改数据都会导致另一方会自动修改

4)数据卷的生命周期:除非没有容器引用该数据,否则会一直存在

5)更新镜像时,不会对数据卷修改;


如:将容器MySQL中的/usr/mysql同步到主机中的/root/mysql
在这里插入图片描述

//即使容器被删除,数据也不会丢失


volume命令:对系统/容器中的数据卷操作

指令格式:docker volume 选项

选项 含义
create 创建数据卷
ls 列出所有数据卷
inspect 查看某一数据卷的具体信息
prune 移除所有未使用的数据卷
rm 移除指定数据卷

1)所有Docker容器的数据卷在没有被指定的情况下,都默认存放在:

/var/lib/docker/volumes/数据卷名

2)数据存储在数据卷目录下的“_data”目录


如:列出主机所有数据卷,并查看某一数据卷的具体信息
在这里插入图片描述

posted @ 2022-02-10 13:14  爱和可乐的w  阅读(67)  评论(0编辑  收藏  举报