Docker学习过程中的总结

本文介绍了Docker的基础知识,包括容器技术的概念、Docker的实现方式、特点以及与虚拟机的区别。Docker提供了高效的容器管理,简化了部署和更新流程。文章还探讨了Docker与虚拟机的隔离性和资源利用率,并分享了Docker的安装和部署步骤。

 

一、基础知识

1、容器技术是什么?

  • 1.1 是什么?

    容器技术,指的是一种轻量级的虚拟化技术,而docker容器技术是现在比较主流的容器技术,容器的目的和虚拟机一样,都是为了创造“隔离环境”。但是它不像虚拟机那样采用操作系统级的资源隔离,容器采用的是进程级的系统隔离,当然也不像虚拟机那样受中间层的管理,它是直接运行在操作系统内核之上,并开辟出一个个的用户空间供给不同的用户使用的,所以说操作系统级别的虚拟化,它其实利用的是内核的 Cgroup 和 Namespace 特性,此功能完全通过软件实现

  • 1.2 如何理解?

    这里我们可以将一个个的容器,简单的理解为港口上的一个个的“集装箱”,我们将不同的货物都封装到不同的集装箱里,由于是密封的,所以货物间不会受影响。而“容器封装”的过程我们也就可以想想成“集装箱打包”的过程了,是不是这样就不难理解了呢?

  • 1.3 早期的容器技术

    • UNIX Chroot是一套“UNIX操作系统” 旨在将其root目录及其他子目录变更至文件系统内的新位置,且只接受特定进程的访问。

    • FreeBSD Jails是最早的容器技术之一,它由R&D Associates公司的Derrick T. Woolworth在2000年为FreeBSD引入。

    • Linux VServer是另外一种jail机制,它用于对计算机系统上的资源(如文件系统、CPU处理时间、网络地址和内存等)进行安全的划分。

    • Solaris容器相当于将系统资源控制与由分区提供的边界加以结合。

    • LXC是指LinuX Containers,它是第一个最完善的Linux容器管理器的实现方案,是通过cgroups和Linux命名空间实现的。

2、Docker技术实现?

  • Docker提供了一种可移植的标准化部署过程,使得规模化、自动化、异构化的部署成为可能,甚至是轻松简单的事情;而对于开发者来说,Docker提供了一种开发环境的管理方法,包括映像、构建、共享等功能。

  • Docker引入了整个管理容器的生态系统,这包括高效、分层的容器镜像模型、全局和本地的容器注册库、清晰的 REST API、命令行等。稍后的阶段,Docker推动实现了一个叫作Docker Swarm的容器集群管理方案。

  • Docker基于Linux的多项开源技术提供了高效、敏捷和轻量级的容器方案,并且支持在多种主流平台(PaaS)和本地系统上部署。

3、Docker的特点?

  • 简单快捷
  • 逻辑分类
  • 快速高效
  • 面向服务

  

 

4、Docker容器与虚拟机?

  • (1)与虚拟机相比,docker容器有什么优势?

    • 更快速的交付和部署

    • 更高的资源利用

    • 更轻松的迁移和扩展

    • 更简单的更新管理

  • (2)与虚拟机的区别与联系?

    与虚拟机相比:

    1. docker容器更快 --->不跟虚拟机那样启动至少需要1、2分钟,docker容器的启动和停止几乎是秒级实现的

    2. docker容器对系统资源(systematic resources)的需求很少

      比如说:“虚拟机安装,怎么说也得20个GB,而我们的docker容器是微量级的只需要几MB就行”并且“docker是没有中间层的资源占用”相对来说docker对资源的需求相对较少

      同样的在PC上若是安装虚拟机只能安装10来个就不错了,但是如果是安装docker容器的话,上百个是完全没有问题的,要是PC的性能比较强的话,上千个也是可以实现的~

    3. 学习成本非常低 --->安装docker时不跟虚拟机的安装过程那么繁琐,不管用得着用不着配这配那的,所以学习成本非常低。

    4. 自动化创建和部署机制 --->docker通过dockerfile配置文件来灵活的自动化创建和部署机制,大大的提高了效率,同样的我们的虚拟机也可以实现,自动化创建和部署

  • (3)如何选择?

  • "docker" or "虚拟机"如何选?

    通过上图的对比我们不难发现其实docker与虚拟机最大的区别点在于“隔离性”上

    有人说过这么一段话:“世界其实是公平的,它不会偏袒任何不劳而获的人,也不会辜负任何执着.......“同样docker容器之所以它的启动速度、性能......等方面,正是容器是直接运行在操作系统的内核上的操作系统级别的虚拟化,不可避免的是容器与容器之间再怎么隔离也是无法做到绝对的隔离,它是”安全隔离”。

    怎么理解安全隔离呢?形象的说也就是我们的容器遭到破坏的时候,并不是说docker容器之间,绝对隔离,其他容器不受一点的影响,它的安全机制是只保护我们docker容器中比较核心的部分,其他的容器还是会收到影响的

    而我们的虚拟机却不同,它是着重于实现虚拟机与虚拟机、虚拟机与主机之间绝对的隔离,这里的绝对隔离是指完全意义上的隔离,对于虚拟机来说,每一个VM都是一个个独立的主体,都有自己的网络,自己的声卡......因此,这就使得它的磁盘占用,对硬件资源的性能要求是比较高的......

    因此,各有各的优势,docker与虚拟机之间并无优劣之分,只是对于同样的一个问题的两种不同的解决方案,docker还是虚拟机,如何选择?关键是看用户对隔离性有何要求。

  • 以下便是docker的适用场景

    • 使用Docker容器开发、测试、部署服务。由于Docker容器非常轻量化,所以本地开发人员可以构建、运行并分享Docker容器,容器可以在开发环境中创建,然后测试,最终进入生产环境。

    • 创建隔离的运行环境。在很多企业应用中,同一服务的不同版本服务于不同用户,使用 Docker可以很容易地创建不同的生产环境来运行不同服务。

    • 搭建测试环境。由于Docker的轻量化,开发者很容易利用Docker在本地搭建测试环境用来测试程序在不同系统上的兼容性,甚至是搭建集群部署测试。

    • 构建多用户的平台及服务基础设施。

    • 提供软件及服务应用程序。

    • 高性能、超大规模的宿主机部署。

二、Docker的安装及部署

  1. 检查Centos的内核版本

    [root@localhost ~]# cat /etc/redhat-release
    CentOS Linux release 7.6.1810 (Core) 
  2. 添加内核转发参数

    • 编辑配置文件/etc/sysctl.conf 并添加以下内容

      [root@localhost ~]# vim /etc/sysctl.conf 
      net.ipv4.ip_forward = 1 
      net.ipv4.conf.default.rp_filter = 0 
      net.ipv4.conf.all.rp_filter = 0
    • 重新加载sysctl.conf

      [root@localhost ~]# sysctl -p
      net.ipv4.ip_forward = 1
      net.ipv4.conf.default.rp_filter = 0
      net.ipv4.conf.all.rp_filter = 0
  3. 清除本地防火墙规则

    [root@localhost ~]# iptables -F
    [root@localhost ~]# iptables -X
    [root@localhost ~]# iptables -Z
    [root@localhost ~]# /usr/sbin/iptables-save 
    # Generated by iptables-save v1.4.21 on Wed Nov 16 10:53:43 2022
    *nat
    :PREROUTING ACCEPT [32:3659]
    :INPUT ACCEPT [1:52]
    :OUTPUT ACCEPT [28:2061]
    :POSTROUTING ACCEPT [28:2061]
    :OUTPUT_direct - [0:0]
    :POSTROUTING_ZONES - [0:0]
    :POSTROUTING_ZONES_SOURCE - [0:0]
    :POSTROUTING_direct - [0:0]
    :POST_public - [0:0]
    :POST_public_allow - [0:0]
    :POST_public_deny - [0:0]
    :POST_public_log - [0:0]
    :PREROUTING_ZONES - [0:0]
    :PREROUTING_ZONES_SOURCE - [0:0]
    :PREROUTING_direct - [0:0]
    :PRE_public - [0:0]
    :PRE_public_allow - [0:0]
    :PRE_public_deny - [0:0]
    :PRE_public_log - [0:0]
    -A PREROUTING -j PREROUTING_direct
    -A PREROUTING -j PREROUTING_ZONES_SOURCE
    -A PREROUTING -j PREROUTING_ZONES
    -A OUTPUT -j OUTPUT_direct
    -A POSTROUTING -s 192.168.122.0/24 -d 224.0.0.0/24 -j RETURN
    -A POSTROUTING -s 192.168.122.0/24 -d 255.255.255.255/32 -j RETURN
    -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
    -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
    -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE
    -A POSTROUTING -j POSTROUTING_direct
    -A POSTROUTING -j POSTROUTING_ZONES_SOURCE
    -A POSTROUTING -j POSTROUTING_ZONES
    -A POSTROUTING_ZONES -o ens33 -g POST_public
    -A POSTROUTING_ZONES -g POST_public
    -A POST_public -j POST_public_log
    -A POST_public -j POST_public_deny
    -A POST_public -j POST_public_allow
    -A PREROUTING_ZONES -i ens33 -g PRE_public
    -A PREROUTING_ZONES -g PRE_public
    -A PRE_public -j PRE_public_log
    -A PRE_public -j PRE_public_deny
    -A PRE_public -j PRE_public_allow
    COMMIT
    # Completed on Wed Nov 16 10:53:43 2022
    # Generated by iptables-save v1.4.21 on Wed Nov 16 10:53:43 2022
    *mangle
    :PREROUTING ACCEPT [756:77619]
    :INPUT ACCEPT [756:77619]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [493:65988]
    :POSTROUTING ACCEPT [529:70244]
    :FORWARD_direct - [0:0]
    :INPUT_direct - [0:0]
    :OUTPUT_direct - [0:0]
    :POSTROUTING_direct - [0:0]
    :PREROUTING_ZONES - [0:0]
    :PREROUTING_ZONES_SOURCE - [0:0]
    :PREROUTING_direct - [0:0]
    :PRE_public - [0:0]
    :PRE_public_allow - [0:0]
    :PRE_public_deny - [0:0]
    :PRE_public_log - [0:0]
    -A PREROUTING -j PREROUTING_direct
    -A PREROUTING -j PREROUTING_ZONES_SOURCE
    -A PREROUTING -j PREROUTING_ZONES
    -A INPUT -j INPUT_direct
    -A FORWARD -j FORWARD_direct
    -A OUTPUT -j OUTPUT_direct
    -A POSTROUTING -o virbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
    -A POSTROUTING -j POSTROUTING_direct
    -A PREROUTING_ZONES -i ens33 -g PRE_public
    -A PREROUTING_ZONES -g PRE_public
    -A PRE_public -j PRE_public_log
    -A PRE_public -j PRE_public_deny
    -A PRE_public -j PRE_public_allow
    COMMIT
    # Completed on Wed Nov 16 10:53:43 2022
    # Generated by iptables-save v1.4.21 on Wed Nov 16 10:53:43 2022
    *security
    :INPUT ACCEPT [706:71434]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值