Docker从入门到精通<1>-docker简介、安装
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虚拟机
Docker容器 | 虚拟机VM | |
---|---|---|
操作系统 | 与宿主机共享操作系统 | 宿主机OS上运行虚拟机OS |
存储大小 | 镜像小,便于存储与传输 | 镜像庞大(VMDK,vdi等) |
运行性能 | 几乎没有性能损耗 | 操作系统额外的CPU、内存、存储消耗 |
移植性 | 轻便、灵活、适应于Linux | 笨重、与虚拟化技术耦合度高 |
硬件亲和性 | 面向软件开发者 | 面向硬件运维者 |
部署速度 | 快速,秒级 | 较慢 |
隔离性 | 较弱一些 | 较强 |
容器的发展历程
-
早期的容器。
容器的主要概念是为运行在同一主机上的多个进程提供隔离。我们可以追溯到几十年前提供某种程度的进程隔离的工具的历史。1979 年推出的chroot工具可以将进程及其子进程的根目录更改为文件系统中的新位置。当然,chroot在进程隔离方面并没有提供更多的东西。几十年后,FreeBSD 扩展了这个概念,在 2000 年引入了jails,通过操作系统级虚拟化对进程隔离提供了高级支持。FreeBSD jail 提供了更明确的隔离,它们具有自己的网络接口和 IP 地址。紧随其后的是 2001 年的Linux-VServer,采用类似的机制来划分文件系统、网络地址和内存等资源。Linux 社区在 2005 年进一步提出了提供操作系统级虚拟化的OpenVZ。也有其他尝试,但都不够全面,无法接近虚拟机。 -
Linux 容器
Linux Containers,通常被称为 LXC,可能是完整容器管理器的第一个实现。它是操作系统级虚拟化,提供了一种机制来限制和优先考虑多个应用程序之间的 CPU 和内存等资源。此外,它允许完全隔离应用程序的进程树、网络和文件系统。LXC 的好处是它可以与 vanilla Linux 内核一起工作,不需要任何额外的补丁。这与其前身 Linux-VServer 和 OpenVZ 形成对比。LXC 的第一个版本有其自身的问题,包括安全性,但这些问题在以后的版本中被克服了。此外,还有其他替代品紧随其后,例如LXD 和 LXCFS。
现在作为每个 Linux 发行版一部分的 LXC 是在 2008 年创建的,主要基于 Google 的努力。在 LXC 用于包含cgroups是用于限制资源的非常重要的内核功能,LXC 提供进程隔离的另一个 Linux 内核特性是命名空间——它 允许我们对内核资源进行分区,以便一组进程能够看到其他进程不可见的资源。这些资源包括进程树、主机名、用户挂载和文件名等。 -
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用户的组
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 上周热点回顾(1.20-1.26)
· 【译】.NET 升级助手现在支持升级到集中式包管理