首页 > 技术文章 > Docker从入门到精通<1>-docker简介、安装

yang-ning 2021-07-05 19:18 原文

docker简介

什么是容器?

根据官方的定义,Docker是以Docker容器为资源分割和调度的基本单位,封装整个软件运行时环境,为开发者和系统管理员设计的,用于构建、发布和运行分布式应用的平台。它是一个跨平台、可移植并且简单易用的容器解决方案。Docker的源代码托管在GitHub上,基于Go语言开发并遵从Apache 2.0协议。Docker可在容器内部快速自动化地部署应用,并通过操作系统内核技术(namespaces、cgroups等)为容器提供资源隔离与安全保障。

容器的优点

  • 持续部署与测试。容器消除了线上线下的环境差异,保证了应用生命周期的环境一致性和标准化。开发人员使用镜像实现标准开发环境的构建,开发完成后通过封装着完整环境和应用的镜像进行迁移,由此,测试和运维人员可以直接部署软件镜像来进行测试和发布,大大简化了持续集成、测试和发布的过程。

  • 跨云平台支持。容器带来的最大好处之一就是其适配性,越来越多的云平台都支持容器,用户再也无需担心受到云平台的捆绑,同时也让应用多平台混合部署成为可能。目前支持容器的IaaS云平台包括但不限于亚马逊云平台(AWS)、Google云平台(GCP)、微软云平台(Azure)、OpenStack等,还包括如Chef、Puppet、Ansible等配置管理工具

  • 环境标准化和版本控制。基于容器提供的环境一致性和标准化,你可以使用Git等工具对容器镜像进行版本控制,相比基于代码的版本控制来说,你还能够对整个应用运行环境实现版本控制,一旦出现故障可以快速回滚。相比以前的虚拟机镜像,容器压缩和备份速度更快,镜像启动也像启动一个普通进程一样快速。

  • 高资源利用率与隔离。容器没有管理程序的额外开销,与底层共享操作系统,性能更加优良,系统负载更低,在同等条件下可以运行更多的应用实例,可以更充分地利用系统资源。同时,容器拥有不错的资源隔离与限制能力,可以精确地对应用分配CPU、内存等资源,保证了应用间不会相互影响。

  • 容器跨平台性与镜像。Linux容器虽然早在Linux 2.6版本内核已经存在,但是缺少容器的跨平台性,难以推广。容器在原有Linux容器的基础上进行大胆革新,为容器设定了一整套标准化的配置方法,将应用及其依赖的运行环境打包成镜像,真正实现了“构建一次,到处运行”的理念,大大提高了容器的跨平台性。

  • 易于理解且易用。Docker的英文原意是处理集装箱的码头工人,标志是鲸鱼运送一大堆集装箱,集装箱就是容器,生动好记,易于理解。一个开发者可以在15分钟之内入门Docker并进行安装和部署,这是容器使用史上的一次飞跃。因为它的易用性,有更多的人开始关注容器技术,加速了容器标准化的步伐。

  • 应用镜像仓库。Docker官方构建了一个镜像仓库,组织和管理形式类似于GitHub,其上已累积了成千上万的镜像。因为Docker的跨平台适配性,相当于为用户提供了一个非常有用的应用商店,所有人都可以自由地下载微服务组件,这为开发者提供了巨大便利

  • 为用户可以快速体验新产品又提供了一种思路

docker容器 vs KVM虚拟机

image

Docker容器 虚拟机VM
操作系统 与宿主机共享操作系统 宿主机OS上运行虚拟机OS
存储大小 镜像小,便于存储与传输 镜像庞大(VMDK,vdi等)
运行性能 几乎没有性能损耗 操作系统额外的CPU、内存、存储消耗
移植性 轻便、灵活、适应于Linux 笨重、与虚拟化技术耦合度高
硬件亲和性 面向软件开发者 面向硬件运维者
部署速度 快速,秒级 较慢
隔离性 较弱一些 较强

容器的发展历程

  1. 早期的容器。
    容器的主要概念是为运行在同一主机上的多个进程提供隔离。我们可以追溯到几十年前提供某种程度的进程隔离的工具的历史。1979 年推出的chroot工具可以将进程及其子进程的根目录更改为文件系统中的新位置。当然,chroot在进程隔离方面并没有提供更多的东西。几十年后,FreeBSD 扩展了这个概念,在 2000 年引入了jails,通过操作系统级虚拟化对进程隔离提供了高级支持。FreeBSD jail 提供了更明确的隔离,它们具有自己的网络接口和 IP 地址。紧随其后的是 2001 年的Linux-VServer,采用类似的机制来划分文件系统、网络地址和内存等资源。Linux 社区在 2005 年进一步提出了提供操作系统级虚拟化的OpenVZ。也有其他尝试,但都不够全面,无法接近虚拟机。

  2. Linux 容器
    Linux Containers,通常被称为 LXC,可能是完整容器管理器的第一个实现。它是操作系统级虚拟化,提供了一种机制来限制和优先考虑多个应用程序之间的 CPU 和内存等资源。此外,它允许完全隔离应用程序的进程树、网络和文件系统。LXC 的好处是它可以与 vanilla Linux 内核一起工作,不需要任何额外的补丁。这与其前身 Linux-VServer 和 OpenVZ 形成对比。LXC 的第一个版本有其自身的问题,包括安全性,但这些问题在以后的版本中被克服了。此外,还有其他替代品紧随其后,例如LXD 和 LXCFS。
    现在作为每个 Linux 发行版一部分的 LXC 是在 2008 年创建的,主要基于 Google 的努力。在 LXC 用于包含cgroups是用于限制资源的非常重要的内核功能,LXC 提供进程隔离的另一个 Linux 内核特性是命名空间——它 允许我们对内核资源进行分区,以便一组进程能够看到其他进程不可见的资源。这些资源包括进程树、主机名、用户挂载和文件名等。

  3. Docker容器
    虽然 LXC 在用户空间级别提供了一个简洁而强大的界面,但它仍然不是那么容易使用,并且没有产生大众吸引力。这就是Docker改变游戏规则的地方。在抽象处理内核功能的大部分复杂性的同时,它提供了一种将应用程序及其依赖项捆绑到容器中的简单格式。
    Docker 项目由 Solomon Hykes 作为平台即服务公司 dotCloud 的一部分启动。它后来在 2013 年作为开源项目发布。
    启动时,Docker 使用 LXC 作为其默认执行环境。然而,那是短暂的,接近一年后,LXC 被用Go 编程语言编写的内部执行环境libcontainer所取代。
    切换到libcontainer允许 Docker 自由操作命名空间、cgroups、AppArmor 配置文件、网络接口和防火墙规则——所有这些都以可控和可预测的方式——而不依赖于像 LXC 这样的外部包。


安装docker

Linux平台是Docker原生支持平台,在Linux上使用Docker可以得到最佳的用户体验

环境准备

  • OS: Ubuntu 20.04.3 LTS
  • IP: 192.168.22.62
  • docker 版本: 较新稳定版, 这里为19.03.15

安装配置

移除旧版本的docker

sudo apt-get remove docker docker-engine docker.io containerd runc

安装docker使用源
由于默认的docker官方的镜像源在国外,速度非常慢,这里我们使用阿里云的镜像源
Ubuntu 的软件源配置文件是 /etc/apt/sources.list。将系统自带的该文件做个备份,将该文件替换为下面内容,即可使用 TUNA 的软件源镜像,选择我们的Ubuntu对应的版本,20.4 LTS
vim /etc/apt/sources.list

deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable
# deb-src [arch=amd64] https://download.docker.com/linux/ubuntu focal stabl

优化内核参数

cat /etc/sysctl.conf

net.ipv4.ip_forward=1
vm.max_map_count=262144
kernel.pid_max=4194303
fs.file-max=1000000
net.ipv4.tcp_max_tw_buckets=6000
net.netfilter.nf_conntrack_max=2097152

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness=0

cat /etc/security/limits.conf

*             soft    core            unlimited
*             hard    core            unlimited
*	      soft    nproc           1000000
*             hard    nproc           1000000
*             soft    nofile          1000000
*             hard    nofile          1000000
*             soft    memlock         32000
*             hard    memlock         32000
*             soft    msgqueue        8192000
*             hard    msgqueue        8192000

安装依赖

sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common

信任Docker的GPG公钥

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

对于 amd64 架构的计算机,添加软件仓库:

sudo add-apt-repository \
   "deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

显示系统可用docker版本

root@ubuntu-server1:/etc/apt# apt update
root@ubuntu-server1:/etc/apt# apt-cache madison docker-ce
Listing... Done
docker-ce/focal 5:20.10.12~3-0~ubuntu-focal amd64
docker-ce/focal 5:20.10.11~3-0~ubuntu-focal amd64
docker-ce/focal 5:20.10.10~3-0~ubuntu-focal amd64
docker-ce/focal 5:20.10.9~3-0~ubuntu-focal amd64
docker-ce/focal 5:20.10.8~3-0~ubuntu-focal amd64
docker-ce/focal 5:20.10.7~3-0~ubuntu-focal amd64
docker-ce/focal 5:20.10.6~3-0~ubuntu-focal amd64
docker-ce/focal 5:20.10.5~3-0~ubuntu-focal amd64
docker-ce/focal 5:20.10.4~3-0~ubuntu-focal amd64
docker-ce/focal 5:20.10.3~3-0~ubuntu-focal amd64
docker-ce/focal 5:20.10.2~3-0~ubuntu-focal amd64
docker-ce/focal 5:20.10.1~3-0~ubuntu-focal amd64
docker-ce/focal 5:20.10.0~3-0~ubuntu-focal amd64
docker-ce/focal 5:19.03.15~3-0~ubuntu-focal amd64
docker-ce/focal 5:19.03.14~3-0~ubuntu-focal amd64
docker-ce/focal 5:19.03.13~3-0~ubuntu-focal amd64
docker-ce/focal 5:19.03.12~3-0~ubuntu-focal amd64
docker-ce/focal 5:19.03.11~3-0~ubuntu-focal amd64
docker-ce/focal 5:19.03.10~3-0~ubuntu-focal amd64
docker-ce/focal 5:19.03.9~3-0~ubuntu-focal amd64

根据自己的需要安装docker版本

sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io

启动docker服务,并设置开机自启动

systemctl enable docker  &&  systemctl restart docker

查看docker版本信息

root@ubuntu-server1:~# docker info
Client:
 Debug Mode: false

Server:
 Containers: 2    # 当前主机运行容器的总数
  Running: 2       # 正在运行的容器的个数
  Paused: 0        # 暂停的容器的个数
  Stopped: 0       # 停止的容器的个数
 Images: 2          # 容器镜像的个数
 Server Version: 19.03.15   # 服务端的版本
 Storage Driver: overlay2   # 正在使用的存储引擎
  Backing Filesystem: xfs   # 后端文件系统,即服务器正在使用的磁盘文件系统
  Supports d_type: true      #  是否支持d_type
  Native Overlay Diff: true   # 是否支持差异数据存储
 Logging Driver: json-file   # 日志类型
 Cgroup Driver: cgroupfs    # Cgroups类型
 Plugins:  # 插件
  Volume: local    # 卷
  Network: bridge host ipvlan macvlan null overlay # overlay 跨主机通信
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog  # 日志类型
 Swarm: inactive     # 是否支持swarm
 Runtimes: runc      # 已经安装的容器运行时
 Default Runtime: runc  # 默认使用的容器运行时
 Init Binary: docker-init   # 初始化容器的守护进程,pid为1的进程
 containerd version: ea765aba0d05254012b0b9e595e995c09186427f   # 版本
 runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd    # runc版本
 init version: fec3683  # init版本
 Security Options:  # 安全选项
  apparmor  # 安全模块,https://docs.docker.com/engine/security/apparmor/
  seccomp   # 审计(操作),https://docs.docker.com/engine/security/seccomp/
   Profile: default  # 默认的配置文件
 Kernel Version: 5.4.0-91-generic  # 宿主机的内核版本
 Operating System: Ubuntu 20.04.3 LTS  # 宿主机操作系统
 OSType: linux   # 宿主机操作系统类型
 Architecture: x86_64  # 宿主机架构
 CPUs: 1     # 宿主机CPU数量
 Total Memory: 981.2MiB   # 宿主机总内存
 Name: ubuntu-server1   # 宿主机hostname
 ID: NNZB:QLJS:E44P:5QLV:KQZX:IFMN:BMWP:4FAP:CWJN:EHEE:ETVH:3FTD   # 宿主机ID
 Docker Root Dir: /var/lib/docker   # 宿主机数据保存目录
 Debug Mode: false   # 是否开启debug模式
 Registry: https://index.docker.io/v1/   # 镜像仓库
 Labels:  # 其他标签
 Experimental: false  # 是否为测试版
 Insecure Registries:  # 非安全的镜像仓库
  127.0.0.0/8
 Live Restore Enabled: false   # 是否开启活动重启(重启docker-daemon不关闭容器)
 Product License: Community Engine  # 产品许可信息

WARNING: No swap limit support  # 系统告警信息(没有开启swap资源限制)

注意:如果在生产环境中要使用的话,可能需要普通用户来执行docker的命令,此时需要把普通用户加入docker用户的组

推荐阅读