容器技术已经成为应用程序封装和交付的核心技术
? 容器技术的核心有以下几个内核技术组成:
– CGroups(Control Groups)-资源管理
– NameSpace-进程隔离
– SELinux安全
? 由于是在物理机上实施隔离,启动一个容器,可以像启动一个进程一样快速
Docker是完整的一套容器管理系统
? Docker提供了一组命令,让用户更加方便直接地使用容器技术,而不需要过多关心底层内核技术
Docker特性
Docker优点:
削减高峰,填堵低峰
相比于传统的虚拟化技术,容器更加简洁高效
传统虚拟机需要给每个VM安装操作系统
容器使用的共享公共库和程序
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker的缺点
容器的隔离性没有虚拟化强
共用Linux内核,安全性有先天缺陷
SELinux难以驾驭
监控容器和容器排错是挑战
docker应用场景
Web 应用的自动化打包和发布。
自动化测试和持续集成、发布。
在服务型环境中部署和调整数据库或其他的后台应用。
从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
八个Docker的真实应用场景
Docker提供了轻量级的虚拟化,它几乎没有任何额外开销,这个特性非常酷。
首先你在享有Docker带来的虚拟化能力的时候无需担心它带来的额外开销。其次,相比于虚拟机,你可以在同一台机器上创建更多数量的容器。
Docker的另外一个优点是容器的启动与停止都能在几秒中内完成。
1. 简化配置
这是Docker公司宣传的Docker的主要使用场景。虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件、系统),Docker在降低额外开销的情况下提供了同样的功能。它能让你将运行环境和配置放在代码中然后部署,同一个Docker的配置可以在不同的环境中使用,这样就降低了硬件要求和应用环境之间耦合度。
2. 代码流水线(Code Pipeline)管理
前一个场景对于管理代码的流水线起到了很大的帮助。代码从开发者的机器到最终在生产环境上的部署,需要经过很多的中间环境。而每一个中间环境都有自己微小的差别,Docker给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单不少。
3. 提高开发效率
这就带来了一些额外的好处:Docker能提升开发者的开发效率。如果你想看一个详细一点的例子,可以参考Aater在DevOpsDays Austin 2014大会或者是DockerCon上的演讲。
不同的开发环境中,我们都想把两件事做好。一是我们想让开发环境尽量贴近生产环境,二是我们想快速搭建开发环境。
理想状态中,要达到第一个目标,我们需要将每一个服务都跑在独立的虚拟机中以便监控生产环境中服务的运行状态。然而,我们却不想每次都需要网络连接,每次重新编译的时候远程连接上去特别麻烦。这就是Docker做的特别好的地方,开发环境的机器通常内存比较小,之前使用虚拟的时候,我们经常需要为开发环境的机器加内存,而现在Docker可以轻易的让几十个服务在Docker中跑起来。
4. 隔离应用
有很多种原因会让你选择在一个机器上运行不同的应用,比如之前提到的提高开发效率的场景等。
我们经常需要考虑两点,一是因为要降低成本而进行服务器整合,二是将一个整体式的应用拆分成松耦合的单个服务(译者注:微服务架构)。如果你想了解为什么松耦合的应用这么重要,请参考Steve Yege的这篇论文,文中将Google和亚马逊做了比较。
5. 整合服务器
正如通过虚拟机来整合多个应用,Docker隔离应用的能力使得Docker可以整合多个服务器以降低成本。由于没有多个操作系统的内存占用,以及能在多个实例之间共享没有使用的内存,Docker可以比虚拟机提供更好的服务器整合解决方案。
6. 调试能力
Docker提供了很多的工具,这些工具不一定只是针对容器,但是却适用于容器。它们提供了很多的功能,包括可以为容器设置检查点、设置版本和查看两个容器之间的差别,这些特性可以帮助调试Bug。你可以在《Docker拯救世界》的文章中找到这一点的例证。
7. 多租户环境
另外一个Docker有意思的使用场景是在多租户的应用中,它可以避免关键应用的重写。我们一个特别的关于这个场景的例子是为IoT(译者注:物联网)的应用开发一个快速、易用的多租户环境。这种多租户的基本代码非常复杂,很难处理,重新规划这样一个应用不但消耗时间,也浪费金钱。
使用Docker,可以为每一个租户的应用层的多个实例创建隔离的环境,这不仅简单而且成本低廉,当然这一切得益于Docker环境的启动速度和其高效的diff
命令。
8. 快速部署
在虚拟机之前,引入新的硬件资源需要消耗几天的时间。虚拟化技术(Virtualization)将这个时间缩短到了分钟级别。而Docker通过为进程仅仅创建一个容器而无需启动一个操作系统,再次将这个过程缩短到了秒级。这正是Google和Facebook都看重的特性。
你可以在数据中心创建销毁资源而无需担心重新启动带来的开销。通常数据中心的资源利用率只有30%,通过使用Docker并进行有效的资源分配可以提高资源的利用率。
docker:微服务,基于linux内核
Docker 架构
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker | 面向对象 |
---|---|
容器 | 对象 |
镜像 | 类 |
Docker 镜像(Images) |
Docker 镜像是用于创建 Docker 容器的模板。 |
Docker 容器(Container) |
容器是独立运行的一个或一组应用。 |
Docker 客户端(Client) |
Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。 |
Docker 主机(Host) |
一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker 仓库(Registry) |
Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。 Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。 |
Docker Machine |
Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
镜像
在Docker中容器是基于镜像启动的
镜像是启动容器的核心
镜像采用分层设计
使用快照的COW技术,确保底层数据不丢失
Docker hub镜像仓库
https://hub.docker.com
Docker官方提供公共镜像的仓库(Registry)
1、镜像是只读的
2、镜像应该从官方下载,不要试图自己手工制作
3、镜像采用联合文件系统,分层设计
4、查看当前系统有哪些镜像
docker镜像管理
二、部署docker
1、关闭防火墙和selinux
2、安装
[[email protected] docker]# systemctl stop firewalld.service
[[email protected] docker]# setenforce 0
[[email protected] docker]# vim /etc/selinux/config
[[email protected] docker]# yum install -y docker-io
3、起动
[[email protected] docker]# systemctl start docker
[[email protected] docker]# systemctl enable docker.service
[[email protected] docker]# systemctl status docker
5、docker国内镜像仓库 daocloud 阿里https://dashboard.daocloud.io
可以先在daocloud或阿里注册用户,获得阿里或daocloud的开发者网址,然后执行以下操作
[[email protected] docker]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --registry-mirror=http://aad0405c.m.daocloud.io
[[email protected] docker]# systemctl daemon-reload
[[email protected] docker]# systemctl restart docker
[[email protected] docker]# docker search ubuntu
6、在仓库中搜索镜像
[[email protected] docker]# docker search centos
7、导入镜像
[[email protected] docker_images]# docker load < centos.tar
[[email protected] docker]# cd /root/docker/docker_images/
[[email protected] docker_images]# for i in * ; do docker load < ${i} ;done
[[email protected] docker_images]# docker images
8、导出镜像
[[email protected] docker_images]# docker save nginx > /tmp/nginx.tar
9、如果运行容器时,本地没有镜像,docker将自动在仓库中下载
[[email protected] docker]# dokcer run busybox echo hello
[[email protected] docker]# docker run busybox tac /etc/passwd
10、下载名为buxybox的镜像
[[email protected] docker]# docker pull busybox( 系统命令的集成)
镜像常用命令
命令列表
– docker images //查看镜像列表
– docker history //查看镜像制作历史
– docker inspect //查看镜像底层信息
– docker pull //下载镜像
– docker push //上传镜像
– docker rmi //删除本地镜像
– docker save //镜像另存为tar包
– docker load //使用tar包导入镜像
– docker search //搜索镜像
– docker tag //修改镜像名称和标签(相当于软连接)
docker images
? 查看镜像列表
– 镜像仓库名称 – 镜像标签 – 镜像ID – 创建时间 – 大小
容器常用命令
? 命令列表
– docker run //运行容器
– docker ps //查看容器列表,正在运行中的镜像,-a所有
– docker stop //关闭容器
– docker start //启动容器
– docker restart //重启容器
– docker attach|exec //进入容器
– docker inspect //查看容器底层信息
– docker top //查看容器进程列表
– docker rm //删除容器
? 列出容器列表 docker ps
– docker ps 查看正在运行的容器
– docker ps -a 查看所有容器列表
– docker ps -aq 仅显示容器id
? 管理容器docker stop|start|restart
– docker stop 关闭容器
– docker start 开启容器
– docker restart 重启容器
进入容器 docker attach|exec
– docker attach 进入容器,exit会导致容器关闭(进入当前解释器)
– docker exec 进入容器,退出时不会关闭容器(新建一个解释器)
显示容器详细信息
docker inspect 容器id
crtl+pq //把容器放在后台运行
容器
1、容器基于镜像启动
2、容器需要有程序在前台执行,一旦程序执行结束,容器也就停止
3、想要容器一直运行,需要一个交互式的终端或驻留在系统的进程
[[email protected] docker_images]# docker run centos echo hello
4、查看容器信息
[[email protected] docker_images]# docker ps
[[email protected] docker_images]# docker ps -a
5、开启一个交互式的容器
[[email protected] docker_images]# docker run -it centos bash
6、退出容器,但是不想结束容器,按组合键ctrl+p+q
7、在已启动的容器中运行新进程
[[email protected] docker_images]# docker ps 查看容器的ID
[[email protected] docker_images]# docker exec -it 0905ef31ad02 bash
[[email protected] /]#
[[email protected] docker_images]# docker top 0905ef31ad02 查看容器中的进程
8、重新连接容器
[[email protected] docker_images]# docker attach 0905ef31ad02
常用的与镜像相关的命令
1、了解镜像的制作过程
[[email protected] ~]# docker history centos
2、了解镜底层信息
[[email protected] ~]# docker inspect centos
查看某一具体项信息
[[email protected] ~]# docker inspect -f {{.RootFS}} centos
3、删除本地镜像
[[email protected] ~]# docker rmi nginx
如果有容器在使用该镜像则无法删除
4、为镜像新建tag
[[email protected] ~]# docker tag centos:latest centos:basic 或
[[email protected] ~]# docker tag centos centos:basic
如果源镜像没有指定tag,那么系统默认使用latest,如果源镜像没有latest,那么将会报错
常用容器相关命令
1、在容器中运行命令
[[email protected] ~]# docker run centos ls / 命令在新建的容器中运行,执行结束后,容器也就相应的停止
2、查看run的帮助
[[email protected] ~]# docker help run
3、在后台运行容器
[[email protected] ~]# docker run -itd centos bash
4、连接容器
[[email protected] ~]# docker attach 55ff014ffa6d
5、在容器中配置yum,并安装net-tools
6、查看正在运行的容器
[[email protected] ~]# docker ps
7、查看所有容器列表
[[email protected] ~]# docker ps -a
8、仅显示容器ID
9、容器状态管理
[[email protected] ~]# docker start | stop | restart 容器
10、使用nginx镜像
[[email protected] ~]# docker load < nginx.tar
[[email protected] ~]# docker run -d nginx
[[email protected] ~]# docker ps
[[email protected] ~]# docker stop 容器ID
[[email protected] ~]# docker exec -it 容器ID
11、查看容器信息
[[email protected] ~]# docker inspect 2f3e82361b46
[[email protected] ~]# docker inspect -f {{.NetworkSettings}} 2f3e82361b46
12、查看容器中运行的进程
[[email protected] ~]# docker top 2f3e82361b46
13、删除容器
[[email protected] ~]# docker ps -aq
[[email protected] ~]# docker rm ef2ff7026212
[[email protected] ~]# docker rm $(docker ps -aq) 删除所有的容器
14、操作容器时,每个容器还有一个名字,可以通过名字进行容器管理,容器的名字通过docker ps查看,最后一个字段即为名字
15、启动容器时,为其指定名字
[[email protected] ~]# docker run -itd --name rhel7.2 centos bash
16、启动容器,前台运行apache
[[email protected] docker_images]# docker run --name centos_web1 -it centos bash
[[email protected] /]# cd /etc/yum.repos.d/
[[email protected] yum.repos.d]# mkdir backup
[[email protected] yum.repos.d]# mv *repo backup
[[email protected] yum.repos.d]# yum-config-manager --add ftp://172.17.0.1/rhel7.2 配置好yum
[[email protected] yum.repos.d]# yum install -y httpd
[[email protected] ~]# httpd -DFOREGROUND
[[email protected] ~]# docker tag busybox:latest busybox:v1
[[email protected] ~]# docker images
[[email protected] ~]# docker stop $(docker ps -aq)
[[email protected] ~]# docker rm $(docker ps -aq)
[[email protected] ~]# docker ps -aq | while read l; do echo docker rm ${l}; done
原文地址:https://www.cnblogs.com/wwchihiro/p/9250501.html