Docker学习笔记


官网地址 https://docs.docker.com/
https://hub.docker.com/
学习视频: 尚硅谷2022版Docker实战教程(docker教程天花板)

一、Docker综述

  1. 个人理解:Docker是一种虚拟技术,不同于传统虚拟机:传统虚拟机是模拟整个操作系统,而Docker模拟的是一个软件/进程,它只加载环境需要的最小最核心赖以生存的Linux内核文件,而不加载其他用不上的东西,更加轻量廉价和快速。它的出现使软件开发师承担了一部分运维工程师的角色。
  2. Docker可以安装在Windows、Linux、Mac各个平台上,但它并非是一个通用的容器工具,它依赖已存在并运行的Linux捏和环境,执行效率几乎等同于所部属的Linux主机。因此Docker必须部署在Linux内核系统上。其他系统想部署就必须安装一个虚拟Linux环境。(Windows部署桌面版Docker是通过微软开发的虚拟机Hyper-V)
  3. Docker三要素:镜像image(类模板)、容器container(实例对象)、仓库repository(存放镜像的地方)
  4. 仓库分为公开仓库(eg:阿里云、腾讯云…)和私有仓库
  5. Docker入门架构&高级架构:(pull的时候如果本地没有找到对应镜像,就会取共有仓库中拉取。)
    在这里插入图片描述
    在这里插入图片描述
  6. 为什么docker比虚拟机快?
    ① 抽象层更少,docker容器中的程序直接使用实际物理机上的硬件资源。
    ②利用的是宿主机的内核,当新建一个容器时,不需要加载操作系统OS内核。在这里插入图片描述

二、安装及加速工具

  1. 安装手册安装成功

  2. 镜像加速:阿里云镜像加速
    控制台->弹性计算->容器镜像服务->镜像工具->镜像加速器 ,之后按照步骤配置镜像加速文件,之后激活并重启docker。配置成功并重启docker在这里插入图片描述

  3. docker run干了什么?在这里插入图片描述

三、Docker常用命令

  1. 启动:systemctl start docker
    停止:systemctl stop docker
    重启:systemctl restart docker
    查看状态:systemctl status docker
    开机启动:systemctl enable docker
    查看概要信息:docker info
    查看总体帮助文档:docker --help
    查看命令帮助文档:docker 具体命令 --help
    
  2. 镜像命令:
    docker images //TAG表示版本号,同一仓库源可以有多个TAG版本,代表这个仓库源的不同版本,使用REPOSITORY:AG来定义不同的镜像,不指定就是默认最新
    docker images -a //列出所有镜像,包括历史版本
    docker images -q //只显示镜像ID
    docker images -aq
    
    docker search 镜像名 
    docker search --limit N 镜像名 //默认列出25个镜像
    
    docker pull 镜像名[:TAG] //TAG没写默认为最新
    
    docker system df //查看镜像、容器、数据卷所占空间
    
    //删除单个  rm + i(image)
    docker rmi 某个镜像名字(ID) //删除镜像
    docker rmi -f 某个镜像名字(ID) //强制删除镜像
    //删除多个
    docker rmi -f 镜像名1:TAG 镜像名2:TAG 
    //删除全部
    docker rmi -f $(docker images -qa)
    
  3. 虚悬镜像:仓库名、标签都是none的镜像,俗称dangling image
  4. 容器命令
    //run
    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    //OPTIONS说明
    --name=容器名字  
    -d //后台运行容器并返回容器ID,也即启动守护式容器(后台运行)
    -it //启动交互式容器 
    -i //interactive以交互式模式运行容器,通常与-t同时使用
    -t //tty为容器重新分配一个伪输入终端,通常与-i同时使用
    -P //随机端口映射
    -p //指定端口映射 (docker端口与容器端口的映射。eg:6379:6379)
    
    eg:
    docker run -it ubuntu bash //bash表示使用shell命令
    docker run -it --name=mUbuntu ubuntu bash
    
    docker ps //查看正在运行的容器
    //OPTIONS说明
    -a //显示所有正在运行的容器+历史上运行过的
    -l //显示最新创建的容器
    -n //显示最近n个创建的容器 eg:docker ps -n 1
    -q //静默模式,只显示容器编号	
    
    docker logs 容器ID  //查看日志
    docker top 容器ID  //查看容器内正在运行的进程
    docker inspect  //查看容器内部细节,包含网络、网桥
    docker cp 容器ID:容器内路径 目的主机路径 //从容器内拷贝文件到主机上,在主机的命令行下进行操作
    docker export 容器ID > 文件名.tar  //导出容器
    cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号 //导入容器,后面三个镜像信息都可以自己设置
    
    //退出容器命令
    exit //run进去容器,退出后容器停止
    ctrl+p+q //run进去容器,退出后容器不停止,即:docker ps还可以显示该容器
    
    docker start 容器名字/ID  //启动已停止运行的容器
    docker restart 容器名字/ID
    docker stop 容器名字/ID //停止容器,会进行一些回收退出操作,比较优雅
    docker kill  容器名字/ID  //强制停止容器,直接停止,较粗鲁
    docker rm 容器名字/ID  //删除已停止的容器  -f 强制删除
    //stop、kill的容器可以通过start重新启动,rm不可以
    
    //一次性删除多个容器实例
    docker rm -f $(docker ps -a -q)
    docker ps -a -q | xargs docker rm //表示前面的命令作为后面命令的输入参数args
    
  5. 守护式容器(后台服务器):在大部分场景下,我们希望docker的服务是在后台运行的,我们可以通过-d指定容器的后台运行模式。
    • 重要的一点:Docker容器后台运行就必须有一个前台进程,容器命令如果不是一直挂起的命令(eg:top,tail),就会自动退出。因为他会觉得自己无事可做。
      解决方法:将要运行的程序以前台进程的形式运行,一般是用命令行模式,表示还有交互式操作。
    • top:用来动态显示系统当前进程状况,默认以CPU 占用量排序。而ps是静态的,即只显示命令执行时的进程状况。
    • tail:按照要求将指定的文件的最后部分输出到标准设备,一般是终端。
    docker run -d 容器名 //创建之后立即自杀退出
    //解决方案
    docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1;done"
    docker run -d ubuntu /bin/sh -c "tail -f /dev/null"
    
    //进入正在运行的容器并以命令行交互(通过-d运行起来的容器、ctrl+p+q操作退出的容器)
    docker exec -it 容器ID bashShell(/bin/bash)
    docker attach 容器ID
    区别:attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止。
    exec是在容器中打开新的终端,可以启动新的进程,用exit退出,不会导致容器的停止
    

四、镜像的分层概念

  1. UnionFS(联合文件系统):Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
    特性:以此同时加载多个文件系统,但从外面看来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
  2. Docker镜像加载原理:
    • docker镜像实际是由一层一层的文件系统组成,这种层级的文件系统UnionFS。
    • bootfs主要包含根加载bootloader和linux内核kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。
    • 当boot加载完成之后整个内核就在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。bootfs之上就是rootfs,就是各种不同的操作系统发行版,eg:Ubuntu、CentOS。
      在这里插入图片描述
    • 对于一个精简OS ,rootfs很小,只需要包含最基本的命令、工具、程序就可以了,因为底层直接用主机的kernel,自己只需要提供rootfs即可。
    • 好处:共享资源、方便复制迁移,即复用。比如:多个镜像都是从相同的base镜像构建而来,那么Docker Host只需在磁盘上保存一份base镜像,同时内存只需加载一份base镜像,就可以为所有容器服务了,而且镜像的每一层都可以被共享。
    • 镜像是只读的,只有容器才是可写的。容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称为“容器层”,之下的都成为“镜像层”。
      在这里插入图片描述
  3. 提交容器副本使之成为一个新的镜像:
    docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
    

五、Docker本地镜像发布到阿里云

在这里插入图片描述
登录阿里云账户,进入容器镜像服务->创建个人实例->创建命名空间->创建镜像仓库->之后即有相关命令行操作。

六、私有Docker Registry(Docker hub)

  1. 参考链接

  2. 下载Docker仓库
    docker pull registry
    运行私有仓库,相当于本地有一个私有仓库Docker hub
    docker run -d -p 5000:5000 -v /zzy/myregistry/:/tmp/registry --privileged=true registry
    默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便与宿主机联调

  3. curl验证私服库上有什么镜像
    curl -XGET http://192.168.111.129:5000/v2/_catalog
    将新镜像修改符合私服规范的Tag,相当于创建一个副本。
    docker tag 镜像文件:版本号 IP地址:端口号/镜像名称:版本号
    这个副本和原来的镜像一模一样,也就是说,当通过镜像ID删除镜像时,创建的tag会和原来的镜像一起被删除。
    在这里插入图片描述

  4. docker默认不允许http方式推送镜像,修改配置文件使之支持http
    vim /etc/docker/daemon.json
    "insecure-registries":["192.168.111.129:5000"]
    加到上述文件中
    在这里插入图片描述

  5. push刚刚tag出来的镜像到本地仓库
    docker push 192.168.111.129:5000/镜像名:版本号
    再次curl验证私服库上有什么镜像
    curl -XGET http://192.168.111.129:5000/v2/_catalog
    pull拉过来仓库中的镜像
    docker pull 192.168.111.129:5000/镜像名:版本号

七、Docker容器数据卷

  1. 容器卷后面都加上--privileged=true扩大容器的权限解决挂载目录没有权限的问题,也即使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。

  2. -v /zzy/myregistry/:/tmp/registry --privileged=true
    结构:-v 宿主机路径:容器内路径 --privileged=true
    实现宿主机和容器的互联,默认仓库被创建在容器的/var/lib/registry目录下。

  3. 卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System,提供一些用于持续存储或共享数据的特性。
    卷设计的目的就是数据持久化,完全独立于容器的生存周期,因此Docker不会再容器删除时删除其挂载的数据卷。

  4. 特点:①数据卷可在容器之间共享或重用数据
    ②卷中的更改可以直接实时生效
    ③数据卷中的更该不会包含在镜像的更新中
    ④数据卷的生命期一直持续到没有容器

  5. docker inspect 容器ID  //查看数据卷是否挂载成功,看里面Mount的参数。
    
    //读写权限:针对的是整个文件夹(默认为可读可写)
    docker run -it --privileged=true -v /zzy/myregistry/:/tmp/registry:rw --name 容器名 镜像名		//可读可写
    docker run -it --privileged=true -v /zzy/myregistry/:/tmp/registry:ro --name 容器名 镜像名	
    	//容器只读read only,即宿主机可以写东西到共享文件夹,容器可以查看里面的文件,但容器不可以添加东西到共享文件夹中
    
    //数据卷的继承和共享
    docker -run -it --privileged=true -v --volumes-from 被继承容器名 --name 容器名  镜像名
    	//被继承容器被关闭之后不会影响当前容器对共享文件夹的使用
    

八、容器下安装常用软件

步骤:搜索镜像->拉取镜像->查看镜像->启动镜像->停止容器->移除容器

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值