docker:
本身是容器:
容器可以保护内容物
docker最初是dotCloud公司内部的一个业余项目,基于谷歌公司推出的Go语言实现的
以前为了实现同一台机上的各个应用隔离,采用虚拟化技术,但消耗资源过大
各应用的隔离是通过namespace的隔离来实现的
玩容器保证linux内核版本在3.8以上
user-操作进程的用户和用户组实现隔离在内核3.8版本才实现
docker引擎出道即巅峰,便捷,简单,规范
1、Docker是什么?
Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,
并发布和应用到任意平台中。比如,你在本地用Python开发网站后台,
开发测试完成后,就可以将Python3及其依赖包、Flask及其各种插件、Mysql、Nginx等打包到一个容器中,
然后部署到任意你想部署到的环境。
Docker的三个概念
镜像(Image):类似于虚拟机中的镜像,是一个包含有文件系统的面向Docker引擎的只读模板。
任何应用程序运行都需要环境,而镜像就是用来提供这种运行环境的。
例如一个Ubuntu镜像就是一个包含Ubuntu操作系统环境的模板,同理在该镜像上装上Apache软件,
就可以称为Apache镜像。
容器(Container):类似于一个轻量级的沙盒,
可以将其看作一个极简的Linux系统环境(包括root权限、进程空间、用户空间和网络空间等),
以及运行在其中的应用程序。Docker引擎利用容器来运行、隔离各个应用。
容器是镜像创建的应用实例,可以创建、启动、停止、删除容器,各个容器之间是是相互隔离的,互不影响。
注意:镜像本身是只读的,容器从镜像启动时,Docker在镜像的上层创建一个可写层,镜像本身不变。
基于autofs
仓库(Repository):类似于代码仓库,这里是镜像仓库,是Docker用来集中存放镜像文件的地方。
注意与注册服务器(Registry)的区别:注册服务器是存放仓库的地方,一般会有多个仓库;
而仓库是存放镜像的地方,一般每个仓库存放一类镜像,每个镜像利用tag进行区分,
比如Ubuntu仓库存放有多个版本(12.04、14.04等)的Ubuntu镜像。
Docker的安装和卸载
Docker可以安装在Windows、Linux、Mac等各个平台上。
具体可以查看文档Install Docker。安装完成之后,可以查看Docker的版本信息:
容器:镜像运行时的实体
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,
容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。
容器的实质是进程,但与直接在宿主执行的进程不同,
容器进程运行于属于自己的独立的命名空间。前面讲过镜像使用的是分层存储,容器也是如此。
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。
因此,任何保存于容器存储层的信息都会随容器删除而丢失。
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据 ,
容器存储层要保持无状态化。
所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,
在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, 使用数据卷后,
容器可以随意删除、重新 run,数据却不会丢失。
注意:
容器在整个应用程序生命周期工作流中提供以下优点:隔离性、可移植性、灵活性、可伸缩性和可控性。
最重要的优点是可在开发和运营之间提供隔离。
仓库:集中存放镜像文件的地方
镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其他服务器上使用这个镜像,
我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);
每个标签对应一个镜像。
所以说,镜像仓库是 Docker 用来集中存放镜像文件的地方,类似于我们之前常用的代码仓库。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。
我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。
如果不给出标签,将以 latest 作为默认标签。
这里补充一下 Docker Registry 公开服务和私有 Docker Registry 的概念:
Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服务。
一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
最常使用的 Registry 公开服务是官方的 Docker Hub ,这也是默认的 Registry,
并拥有大量的高质量的官方镜像,网址为:hub.docker.com/ 。
在国内访问 Docker Hub 可能会比较慢,国内也有一些云服务商提供类似于 Docker Hub 的公开服务。
除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry 。
Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。
开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 Docker 命令,
不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。
Docker的主要应用场景
简化配置
虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件、系统),
Docker在降低额外开销的情况下提供了同样的功能。它能让你将运行环境和配置放在代码中然后部署,
同一个Docker的配置可以在不同的环境中使用,这样就降低了硬件要求和应用环境之间耦合度。
简单的来说,容器镜像打包完成后,它就是个独立的个体了,丢到哪里都能跑,而无需针对各个平台去独立配置。
代码流水线(Code Pipeline)管理
前一个场景对于管理代码的流水线起到了很大的帮助。代码从开发者的机器到最终在生产环境上的部署,
需要经过很多的中间环境。而每一个中间环境都有自己微小的差别,
Docker给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单不少。
提高开发效率
不同的开发环境中,我们都想把两件事做好。一是我们想让开发环境尽量贴近生产环境,
二是我们想快速搭建开发环境。
使用Docker非常简单的就能够实现这两点,而且哪怕是开发环境的机器配置一般的情况下搭建多个生成服务应用。
一台一般配置服务器或开发机也能轻松的跑起多个Docker应用,而无需额外增加机器配置。
因为Docker有个非常NB的特性,拥有虚拟化的特性,而几乎没有额外的开销。
Docker改变了什么?
综上所述,Docker到底改变了什么?笔者是这么理解的:
Docker改变了云服务,使云服务的共融共通的理想逐步成为了可能。
并且Docker 已经是云策略的一部分,许多开发者正在计划使用 Docker 将业务迁移到云端。
另外,为了避免被云服务供应商绑定,Docker成为很多开发者的首选。
Docker改变了产品交付,为产品的整个生命周期提供了一整套的解决方案和流程。
Docker改变了开发方式,提供了简化的环境配置、封装的运行环境以及统一的环境。并且提供了快速部署的方式。
Docker改变了测试,多版本测试变得极为方便,快速构建测试环境也变得更加简单并且无需开发人员干预或者搭建。
Docker改变了运维,环境的一致性让运维变得更加简单,同时热更新的支持让运维不再需要半夜加班部署更新,
更新可以随时进行。当出现重大问题时,还能快速回滚到指定版本。
Docker改变了架构,自动化扩容支持让架构变得更加简单,分布式系统也更加易于搭建和支持。
同时遗留的单体应用也很易于转变为现代应用。
总之,在某种程度上,Docker改变了产品开发中的一些游戏规则。虽然Docker是一项技术,
但是它也带来了新的思维,新的流程和工作方法,Docker在推动行业的发展,Docker已经在改变世界,
并且在逐步的变为事实……
缺点:
太依赖操作系统
依赖网络
银行U盾等场景不能用
2、linux上docker安装
卸载旧版本
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine
Device Mapper
Docker默认使用AUFS作为存储驱动,但是AUFS并没有被包括在Linux的主线内核中。
CentOS中可以使用Device Mapper作为存储驱动,这是在2.6.9内核版本引入的新功能。
我们需要先确认是否启用该功能:
$ ls -l /sys/class/misc/device-mapper
lrwxrwxrwx 1 root root 0 May 1 20:55 /sys/class/misc/device-mapper -> …/…/devices/virtual/misc/device-mapper
如果没有检测到Device Mapper,需要安装device-mapper软件包:
$ sudo yum install -y device-mapper
然后重新加载dm_mod内核模块:
$ sudo modprobe dm_mod
安装docker-ce
参照阿里镜像源安装
CentOS 7(使用 yum 进行安装)
#step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
#Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#Step 3
sudo sed -i ‘s+download.docker.com+mirrors.aliyun.com/docker-ce+’ /etc/yum.repos.d/docker-ce.repo
#Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
#Step 4: 开启Docker服务
sudo service docker start
#注意:
#官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。
例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
#vim /etc/yum.repos.d/docker-ce.repo
#将[docker-ce-test]下方的enabled=0修改为enabled=1
#安装指定版本的Docker-CE:
#Step 1: 查找Docker-CE的版本:
#yum list docker-ce.x86_64 --showduplicates | sort -r
#Loading mirror speeds from cached hostfile
#Loaded plugins: branch, fastestmirror, langpacks
#docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
#docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable
#docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
#Available Packages
#Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
#sudo yum -y install docker-ce-[VERSION]
查看安装的docker版本:
docker -v
[root@220 ~ ]# docker version
Client: Docker Engine - Community
Version: 20.10.14
API version: 1.41
Go version: go1.16.15
Git commit: a224086
Built: Thu Mar 24 01:49:57 2022
OS/Arch: linux/amd64
Context: default
Experimental: true
docker的配置文件:
/etc/docker/daemon.json
资源目录:
/var/lib/docker/
little docker ]#cd /var/lib/docker/
[root@little docker ]#ll
total 0
drwx–x–x 4 root root 120 Feb 20 14:48 buildkit
drwx-----x 2 root root 6 Feb 20 14:48 containers 容器信息
drwx------ 3 root root 22 Feb 20 14:48 image 镜像资源
drwxr-x— 3 root root 19 Feb 20 14:48 network
drwx-----x 3 root root 40 Feb 20 14:48 overlay2
drwx------ 4 root root 32 Feb 20 14:48 plugins
drwx------ 2 root root 6 Feb 20 14:48 runtimes
drwx------ 2 root root 6 Feb 20 14:48 swarm
drwx------ 2 root root 6 Feb 20 14:48 tmp
drwx------ 2 root root 6 Feb 20 14:48 trust
drwx-----x 2 root root 50 Feb 20 14:48 volumes
3、docker加速器:
国内使用docker官方镜像源,会因为网络原因无法下载,或一直处于超时状态。我们使用
daocloud.io的方法进行加速配置
[root@little ~ ]#curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://abcd1234.m.daocloud.io
docker version >= 1.12
{“registry-mirrors”: [“http://abcd1234.m.daocloud.io”]}
Success.
You need to restart docker to take effect: sudo systemctl restart docker
或者修改本地配置文件:
[root@little ~ ]#vim /etc/docker/daemon.json
{“registry-mirrors”: [“http://abcd1234.m.daocloud.io”]}
保存即可
验证拉取镜像速度:
docker image pull nginx
阿里云加速
[root@little ~ ]#vim /etc/docker/daemon.json
{“registry-mirrors”: [“https://q2gr04ke.mirror.aliyuns.com”],“insecure-registries”:[“10.1.1.100:5000”]}
~
docker 1.12 开始支持live restore,就是关闭docker daemon ,而不关闭容器
有两种方式开启:
如果docker daemon正在运行并且你不想停止它,你可以添加配置到docker daemon的配置文件。
例如:在linux系统上默认的配置文件是/etc/docker/daemon.json
{“live-restore”: true}
你必须传递一个SIGHUP信号给daemon进程来重载配置。更多有关使用config.json来配置docker daemon的信息,
可以参考
daemon configuration file
在使用dockerd启动时指定–live-restore选项