Docker初探
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
-
应用场景
-
Web 应用的自动化打包和发布。
-
自动化测试和持续集成、发布。
-
在服务型环境中部署和调整数据库或其他的后台应用。
- 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境
-
-
作用
- 解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术
- 简化程序
- 节省开支
- 早前的虚拟技术
- 虚拟机
- 资源占用多
- 启动慢
- 冗余步骤多
- 虚拟机
- 容器虚拟化技术 LinuxContainers
- 是对进程的隔离,而非模拟一个完整的系统
- 可以将软件运行所需的所有资源打包到一个隔离的容器
- 无需捆绑一整套操作系统,只需软件工作所需的库资源和设置
- 虚拟机与容器的比较
- 传统虚拟机技术上虚拟一套硬件后,在其上运行一个完整的操作系统,在系统上再运行所需的应用进程
- 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,也没有进行硬件虚拟。因此容器更为轻便
- 每个容器间相互隔离,每个容器都有自己的文件系统,容器之间进程不会相互影响,能区分计算资源
- 开发自运维 DevOps
- 更快速的应用交付和部署
- 更便捷的升级和扩缩容
- 更简单的系统运维
- 更高效的计算资源利用
- 一次封装,随处运行
- 底层原理
- C-S结构,Docker守护进程运行在主机上。通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器
- 容器是 一个运行时环境,即集装箱
- Docker 比虚拟机有更少的抽象层。Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU,内存利用率上Docker将会在效率上有明显的优势
- Docker 利用的是宿主机的内核,而不需要GuestOS。因此,新建一个容器时,Docker无需和虚拟机一样重新加载操作系统内核,从而避免引寻,加载操作系统内核这个费时费资源的过程,当新建一个虚拟机时,虚拟机需要加载GuestOS,这个新建过程是分钟级别的。而Docker由于直接利用宿主机的操作系统,则省略了这个过程,因此新建一个Docker只需几秒
- 解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术
-
安装
- 前提条件
- CentOS仅发行版中的内核支持Docker
- CentOS7,要求系统为64位,系统内核版本为3.10以上
- CentOS6.5或更高的版本,要求系统为64位,系统内核版本为2.6.32-431或以上
- 相关命令
uname -r cat /etc/redhat-release lsb_release -a (centos7不支持)
- 下载
- 官网 www.docker.com
- 中文网 docker-cn.com
- 国内镜像
- 网易加速器:http://hub-mirror.c.163.com
- 官方中国加速器:https://registry.docker-cn.com
- ustc的镜像:https://docker.mirrors.ustc.edu.cn
- daocloud:https://www.daocloud.io/mirror#accelerator-doc(注册后使用)
- 仓库
- hub.docker.com
- 版本
- 社区版 Docker CE
- 企业版
- 基本组成
- 镜像 image
- Docker镜像是由文件系统叠加而成。最低端是一个引导文件系统,即bootfs。当一个容器启动后,它将会被移到内存中,而引导文件系统则会被卸载,以留出更多的内存供initrd磁盘镜像使用
- Docker镜像的第二层是root文件系统rootfs,它位于引导文件系统之上。rootfs可以是一种或多种操作系统
- 在Docker里,root文件系统永远只能是只读状态,并且Docker利用联合加载技术又会在root文件系统层上加载更多的只读文件系统。联合加载指的是一次同时加载多个文件系统,但是在外面看起来只能看到一个文件系统。联合加载会将各层文件系统叠加到一起,这样最终的文件系统会包含所有底层的文件和目录
- 当从一个镜像启动容器时,Docker会在该镜像的最顶层加载一个读写文件系统
- 当Docker第一次启动一个容器时,初始的读写层是空的。当文件系统发生变化时,这些变化都会应用到这一层上。如果修改一个文件,这个文件首先会从该读写层下面的只读层复制到该读写层。该文件的只读版本依然存在,但是已经被读写层中的该文件副本所隐藏
- 通常这种机制被称为写时复制,这也是使Docker如此强大的技术之一。每个只读镜像层都是只读的,并且以后永远不会变化。当创建一个新容器时,Docker会构建出一个镜像栈,并在栈的最顶端添加一个读写层。这个读写层再加上其下面的镜像层以及一些配置数据,就构成了一个容器
- 容器 container
- 用镜像创建的运行实例
- 可以被启动,开始,停止,删除。每个容器都是相互隔离,保证安全的平台
- 其定义与镜像几乎一致,也是一堆层的统一视角,唯一的区别在于容器的最上面那一层是可读可写的
- 仓库 repository
- 集中存放镜像文件的场所
- 仓库(repository)和仓库注册服务器(registry)是由区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含多个镜像,每个镜像有不同的标签
- 分为公开仓库(public)和私有仓库(private)。国内的公开仓库包括阿里云,网易云等
- 镜像 image
- 安装步骤
- CentOS6.x
- yum install -y epel-release
- yum install -y docker-io
- 配置文件 /etc/sysconfig/docker
- 启动后台服务 service docker start
- docker version 验证
[root@centos69-zjx ~]# docker version Client version: 1.7.1 Client API version: 1.19 Go version (client): go1.4.2 Git commit (client): 786b29d/1.7.1 OS/Arch (client): linux/amd64 Server version: 1.7.1 Server API version: 1.19 Go version (server): go1.4.2 Git commit (server): 786b29d/1.7.1 OS/Arch (server): linux/amd64
- CentOS6.x
- 前提条件
-
-
- CentOS7.x
- uname -r 命令查看你当前的内核版本
- 确保 yum 包更新到最新
yum update
- 卸载旧版本
yum remove docker docker-common docker-selinux docker-engine
- 安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
- 设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 查看所有仓库中所有docker版本,并选择特定版本安装
yum list docker-ce --showduplicates | sort -r
- 安装docker
sudo yum install docker-ce
- 启动并加入开机启动
systemctl start docker systemctl enable docker
- 验证安装是否成功
docker version
- 设置阿里云镜像加速地址
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://k*****k.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
- uname -r 命令查看你当前的内核版本
- CentOS7.x
-