文章大纲:

  1. 了解docker核心概念及安装方法
  2. 掌握docker镜像和容器的操作
  3. 掌握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,即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的"一次封装,到处运行"的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。




容器镜像调整内容 容器镜像导出_docker


2. Docker和虚拟机的区别

作为一种轻量级的虚拟化方式, Docker与传统虚拟机相比具有显著的优势。

Docker容器很快,启动和停止可以在秒级实现,比传统虚拟机要快很多;Docker核心解决的问题是利用容器来实现类似VM的功更,从而利用更加节省的硬件资源提供给用户更多的计算资源,所以 Docker容器除了运行其中的应用之外,基本不消耗额外的系统资源,从而在保证应用性能的的同时,减小系统开销,使得在一个主机上同时运行数千个 Docker容器成为可能; Docker操作方便,还可以通过 Dockerfile配置文件支持灵活的自动化创建和部署。下表对使用 Docker容器技术与传统虚拟化技术的特性进行了比较。


容器镜像调整内容 容器镜像导出_centos_02


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


容器镜像调整内容 容器镜像导出_docker_03


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


容器镜像调整内容 容器镜像导出_docker镜像导出与导入_04


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


容器镜像调整内容 容器镜像导出_docker_05


[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