文章大纲:
- 了解docker核心概念及安装方法
- 掌握docker镜像和容器的操作
- 掌握docker资源控制的方法
Docker概述
Docker从诞生到目前为止几年的光景,已经成为开源社区最火爆的项目,风头已经远远盖过了很流行的 Puppet和 Openstack。那么它到底是跟风炒作,还是名副其实呢?接下来就揭开它的神秘面纱,一探究竟。
1. Docker是什么
Docker是在 Linux容器里运行应用的开源工具,是一种轻量级的"虚拟机"。诞生于2013年,最初的发起者是 dotCloud公司,后来改名为 Docker Inc,专注于 Docker相关技术和产品的开发。 Docker项目目前已经加入了 Linux基金会,全部开源代码均在https://www. github.com/ docker上进行相关维护官网地址为为https://www.docker.com/,有相关文档可以参考。现在Docker与Openstack同为最受欢迎的云计算开源项目。
Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱。如图1.1所示,鲸鱼可以看作宿主机,而集装箱可以理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。正如 Docker的设计宗旨一样:Buid、 Ship and Run Any App、 Anywhere,即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的"一次封装,到处运行"的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
2. Docker和虚拟机的区别
作为一种轻量级的虚拟化方式, Docker与传统虚拟机相比具有显著的优势。
Docker容器很快,启动和停止可以在秒级实现,比传统虚拟机要快很多;Docker核心解决的问题是利用容器来实现类似VM的功更,从而利用更加节省的硬件资源提供给用户更多的计算资源,所以 Docker容器除了运行其中的应用之外,基本不消耗额外的系统资源,从而在保证应用性能的的同时,减小系统开销,使得在一个主机上同时运行数千个 Docker容器成为可能; Docker操作方便,还可以通过 Dockerfile配置文件支持灵活的自动化创建和部署。下表对使用 Docker容器技术与传统虚拟化技术的特性进行了比较。
3. Docker的使用场景
· 必须要脱离底层的硬件,现在开发者需要能方便地创建运行在云平台上的应用,
· 同时还需要任何时间地点可获取这些资源,这正是 Docker所能提供的。
· Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。
· 通过这种容器打包应用程序,意味着简化了重新部署、调试这些琐碎的重复工作,极大地提高了工作效率。
· 例如,服务器从腾讯云迁移到阿里云,如果采用 Docker容器技术,迁移只需要在新的服务器上启动需要的容器器即可。
Docker的核心概念及安装
1.镜像
Docker的镜像 ( image ) 是创建容器的基础,类似虚拟机的快照,可以理解为是一个面向 Docker容器引擎的只读模板。比如一个镜像可以是一个完整的 Centos操作系统环境,成为一个 Centos镜像:可以是一个安装了MySQL的应用程序,称为一个MySQL镜像,等等。
Docker提供了简单的机制来创建和更新现有的镜像,用户也可以从网上下载已经做好的应用镜像来直接使用。
2.容器
Docker的容器( Container)是从镜像创建的运行实例。它可以被启动、停止和删除。所创建的每个容器都是相互隔离、互不可见,可以保证安全性的平台。可以把容器看作一个简易版的 Linux环境, Docker利用容器来运行和隔离应用。
3.仓库
Docker仓库 ( Repository ) 是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到
· 公有仓库( Public)
· 家私有仓库( Private)
这样一来当下次要在另外一台机器上使用这个镜像时,只需要从仓库上拉取下来就可以了。
4. 仓库注册服务器器( Registry)
是存放仓库的地方,其中包含了多个仓库,每个仓库集中存放某类镜像,并且使用不同的标签(Tag)来区分它们。
是
· Docker Hub,目前最大的公共仓库,存放了数量庞大的镜像供用户下载使用。
4.安装 Docker
· Docker支持在主流的操作系统平台上进行使用,包括
· Windows系统、linux系统及 MacOS系统等。
· 目前前最新的 Redhat RHEL、 CentOS及Ubuntu系统官方软件源中都已经默认自带了 Docker包,可直接安装使用
· 也可以用 Docker自己的YUM源进行配置。
· Centos系统下安装 Docker可以有两种方式:
· 一种是使用用curl获得 Docker的安装脚本进行安装
· 另一种是使用YUM仓库来安装 Docker。需要注意的是,
· 目前 Docker只能支持64位系统。
本课程使用 Centos7.3系统, Docker自己的YUM源为例来进行相关安装操作。
一、安装docker并管理镜像
1.关闭selinux和firewalld防火墙,安装docker并启动
#yum -y install docker
#systemctl start docker
#systemctl enable docker
2.下载dhcp镜像
# docker search dhcp
# docker pull docker.io/networkboot/dhcpd
#[root@node3 ~]# docker images
3. 为/docker.io/networkboot/dhcpd重新命名
格式:docker tag 原镜像 新名
[root@node3 ~]# docker tag docker.io/networkboot/dhcpd dhcp:centos
4. 导出镜像
格式:docker save -o 导出名 原镜像
[root@node3 ~]# docker save -o dhcp dhcp:dhcp
5. 删除镜像
格式:docker rmi 镜像
[root@node3 ~]# docker rmi centos:dhcp
6. 导入镜像
格式:docker load --input 镜像 或docker load
[root@node3 ~]# docker load --input dhcp 或docker load
7.登录https://hub.docker.com 注册docker账户,并上传镜像
二、容器管理
1.添加允许ipv4
[root@node3 ~]# vim /usr/lib/sysctl.d/00-system.conf
net.ipv4.ip_forward=1
2. 创建容器.
格式:docker create [选项] 镜像 命令
常用的选项:-i输入一直处于打开状态,-t分配一个伪终端
[root@node3 ~]# docker create -it centos:dhcp /bin/bash
说明:创建容器时的命令,是容器的唯一主进程,容器会随着这个进程的启动而启动/停止而停止
3.查看容器
[root@node3 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d44f4cd21974 zhangchunhai/centos:dhcp "/entrypoint.sh /b..." 3 minutes ago
4.启动容器、停止容器
[root@node3 ~]# docker start d44f4cd21974
[root@node3 ~]# docker stop d44f4cd21974
5.创建并启动容器的另一种方法:
Docker run [选项] -p 容器内端口:本机端口 命令 镜像
-d:在后台运行
[root@docker ~]# docker run -d -p 80:80 httpd:linux
6.再次查看容器
[root@node3 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d44f4cd21974 zhangchunhai/centos:dhcp "/entrypoint.sh /b..." 5 minutes ago Up 42 seconds
7. 进入容器
格式:docker exec [选项] 容器名或id 命令
[root@node3 ~]# docker exec -it d44f4cd21974 /bin/bash
8. 导出容器
格式:docker export 容器名或id >导出的文件
[root@node3 ~]# docker export d44f4cd21974 >centos7dhcp
9.停止容器
[root@node3 ~]# docker stop d44f4cd21974
10.删除容器
[root@node3 ~]# docker rm d44f4cd21974
11导入容器(将成为镜像)
格式:cat 导出的容器 |docker import - 生成的镜像:标签
[root@node3 ~]# cat centos7dhcp |docker import - zhangchunhai/centos:dhcp
三、限制资源使用
1.限制cpu使用率
[root@node3 ~]# cd /sys/fs/cgroup/
[root@node3 cgroup]# ls
[root@node3cgroup]#cd cpu,cpuacct/system.slice/docker-3364d6aee72d0c01e606c047737683790ccfe2a1df14933e172cfcaf8ba2b820.scope/
[root@node3 docker-3364d6aee72d0c01e606c047737683790ccfe2a1df14933e172cfcaf8ba2b820.scope]# echo 20000 >cpu.cfs_quota_us
说明:
我们看到 /sys/fs/cgroup 目录中有若干个子目录,我们可以认为这些都是受 cgroups 控制的资源以及这些资源的信息。
· blkio — 这个子系统为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB 等等)。
· cpu — 这个子系统使用调度程序提供对 CPU 的 cgroup 任务访问。
· cpuacct — 这个子系统自动生成 cgroup 中任务所使用的 CPU 报告。
· cpuset — 这个子系统为 cgroup 中的任务分配独立 CPU(在多核系统)和内存节点。
· devices — 这个子系统可允许或者拒绝 cgroup 中的任务访问设备。
· freezer — 这个子系统挂起或者恢复 cgroup 中的任务。
· memory — 这个子系统设定 cgroup 中任务使用的内存限制,并自动生成内存资源使用报告。
· net_cls — 这个子系统使用等级识别符(classid)标记网络数据包,可允许 Linux 流量控制程序(tc)识别从具体 cgroup 中生成的数据包。
· net_prio — 这个子系统用来设计网络流量的优先级
hugetlb — 这个子系统主要针对于HugeTLB系统进行限制,这是一个大页文件系统。
2.多任务按比例分享cpu
[root@node3 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zhangchunhai/centos dhcp 56c1dba24f3e 23 hours ago 96.6 MB
[root@node3 ~]# docker run -tid --cpu-shares 1024 56c1dba24f3e /bin/bash -c ls
3.限制cpu内核使用:限制新建的容器使用1号内核
[root@node3 ~]# cat /proc/cpuinfo| grep "processor"| wc -l
2
[root@node3 ~]# docker run -tid --cpuset-cpus 1 56c1dba24f3e /bin/bash -c ls
4.对内存使用的限制:限制新建的容器使用内存512MB
[root@node3 ~]# docker run -tid -m 512MB 56c1dba24f3e /bin/bash -c ls
5.对blkio的限制:限制新建的容器的/dev/sda的写入速度为1MB
[root@node3 ~]# docker run -tid -device-write-bps /dev/sda:1MB 56c1dba24f3e /bin/bash -c ls