Docker使用指南

一:虚拟化

1.什么是虚拟化

在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件对资源充分利用虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、桌面虚拟化、服务虚拟化、虚拟机等等。

2.虚拟化种类

全虚拟化架构:虚拟机的监视器(hypervisor)是类似于用户的应用程序运行在主机的OS之上,如VMware的workstation,这种虚拟化产品提供了虚拟的硬件。

Docker使用指南_第1张图片

OS层虚拟化架构:只能安装与操作系统相同的系统

Docker使用指南_第2张图片

硬件层虚拟化:可以安装各种操作系统

Docker使用指南_第3张图片

硬件层的虚拟化具有高性能和隔离性,因为hypervisor直接在硬件上运行,有利于控制VM的OS访问硬件资源,使用这种解决方案的产品有VMware ESXi 和 Xen server,Hypervisor是一种运行在物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享一套基础物理硬件,因此也可以看作是虚拟环境中的“元”操作系统,它可以协调访问服务器上的所有物理设备和虚拟机,也叫虚拟机监视器(Virtual Machine Monitor,VMM)。Hypervisor是所有虚拟化技术的核心。当服务器启动并执行Hypervisor时,它会给每一台虚拟机分配适量的内存、CPU、网络和磁盘,并加载所有虚拟机的客户操作系统。宿主机Hypervisor是所有虚拟化技术的核心,软硬件架构和管理更高效、更灵活,硬件的效能能够更好地发挥出来。常见的产品有:VMware、KVM、Xen等等。Openstack

二:Docker

1.容器技术

在计算机的世界中,容器拥有一段漫长且传奇的历史。容器与管理程序虚拟化(hypervisor virtualization,HV)有所不同,管理程序虚拟化通过中间层将一台或者多台独立的机器虚拟运行与物理硬件之上,而容器则是直接运行在操作系统内核之上的用户空间。因此,容器虚拟化也被称为“操作系统级虚拟化”,容器技术可以让多个独立的用户空间运行在同一台宿主机上由于“客居”于操作系统,容器只能运行与底层宿主机相同或者相似的操作系统,这看起来并不是非常灵活。例如:可以在Ubuntu服务中运行Redhat Enterprise Linux,但无法再Ubuntu服务器上运行Microsoft Windows。相对于彻底隔离的管理程序虚拟化,容器被认为是不安全的。而反对这一观点的人则认为,由于虚拟容器所虚拟的是一个完整的操作系统,这无疑增大了攻击范围,而且还要考虑管理程序层潜在的暴露风险。尽管有诸多局限性,容器还是被广泛部署于各种各样的应用场合。在超大规模的多租户服务部署、轻量级沙盒以及对安全要求不太高的隔离环境中,容器技术非常流行。最常见的一个例子就是“权限隔离监牢”(chroot jail),它创建一个隔离的目录环境来运行进程。如果权限隔离监牢正在运行的进程被入侵者攻破,入侵者便会发现自己“身陷囹圄”,因为权限不足被困在容器所创建的目录中,无法对宿主机进一步破坏。最新的容器技术引入了OpenVZ、Solaris Zones以及Linux容器(LXC)。使用这些新技术,容器不在仅仅是一个单纯的运行环境。在自己的权限类内,容器更像是一个完整的宿主机。对Docker来说,它得益于现代Linux特性,如控件组(control group)、命名空间(namespace)技术,容器和宿主机之间的隔离更加彻底,容器有独立的网络和存储栈,还拥有自己的资源管理能力,使得同一台宿主机中的多个容器可以友好的共存容器被认为是精益技术,因为容器需要的开销有限。和传统虚拟化以及半虚拟化相比,容器不需要模拟层(emulation layer)和管理层(hypervisor layer),而是使用操作系统的系统调用接口。这降低了运行单个容器所需的开销,也使得宿主机中可以运行更多的容器。尽管有着光辉的历史,容器仍未得到广泛的认可。一个很重要的原因就是容器技术的复杂性:容器本身就比较复杂,不易安装,管理和自动化也很困难。而Docker就是为了改变这一切而生的。

2.Docker特点

  • 上手快:用户需要几分钟,可以把自己的程序“Docker”。Docker依赖于“写时复制”(copy-on-write)模型,使修改应用程序也非常迅速可以达到“随心所致,代码即改”的境界。随后,就可以创建容器来运行应用程序了。大多数Docker容器只需要不到1秒中即可启动。由于去除了管理程序的开销,Docker容器拥有很高的性能,同时同一台宿主机中也可以运行更多的容器,使用户尽可能的充分利用系统资源。
  • 职责的逻辑分类:使用Docker,开发人员只需要关心容器中运行应用程序,而运维人员只需要关心如何管理容器Docker设计目的就是要加强开发人员写代码的开发环境应用程序部署的生产环境一致性。从而降低那种“开发时一切正常,肯定是运维的问题(测试环境都是正常的,上线后了问题就归结肯定是运维的问题)”
  • 快速高效的开发生命周期:Docker的目标之一就是缩短代码从开发测试到部署、上线运行的周期你的应用程序具备移植性,易于构建易于协作。(通俗一点说,Docker就像一个盒子,里面可以装很多物件,如果需要这些物件的可以直接将该盒子拿走,而需要该盒子中一件件的取。)
  • 鼓励使用面向服务的架构:Docker还鼓励面向服务的体系结构和微服务架构Docker推荐单个容器运行一个应用程序或进程,这样就形成一个分布式的应用程序模型,这种模型下,应用程序或者服务可以表示系列内部互联的容器,从而使分布式部署应用程序,扩展调试应用程序变得非常简单同时提高了程序的内省性。(当然,可以在一个容器运行多个应用程序

3.Docker组件

Docker客户端和服务器:Docker是一个客户端-服务器C/S架构程序。Docker客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程完成所有工作并返回结果Docker提供了一个命令行工具Docker以及一整套RESTful API你可以在同一台宿主机运行Docker守护进程客户端,也可以本地Docker客户端连接运行在另一台宿主机上远程Docker守护进程

Docker使用指南_第4张图片

Docker镜像:镜像是构建Docker基石用户基于镜像来运行自己的容器。镜像也是Docker生命周期中的“构建”部分镜像基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来。例如添加一个文件执行一个命令;打开一个窗口。也可以将镜像当作容器的源代码”。镜像体积很小,非常“便携”,易于分享存储和更新

Registry(注册中心):DockerRegistry来保存用户构建的镜像Registry分为公共和私有两种。Docker公司运营公共的Registry叫做Docker Hub。用户可以在Docker Hub注册账号分享保存自己镜像(说明:在Docker Hub下载镜像巨慢,可以自己构建私有的Registry

Docker容器:Docker可以帮助构建部署容器,只需要把自己的应用程序或者服务打包放进容器即可。容器是基于镜像启动起来的,容器可以运行一个多个进程。我们可以认为,镜像是Docker生命周期的构建或者打包阶段容器则是启动或者执行阶段。  容器基于镜像启动,一旦容器启动完成后,我们就可以登录到容器安装自己需要的软件或者服务

Docker使用指南_第5张图片

所以Docker容器就是:一个镜像格式;一些列标准操作;一个执行环境

Docker借鉴标准集装箱的概念。标准集装箱将货物运往世界各地,Docker将这个模型运用到自己的设计唯一不同的是:集装箱运输货物Docker运输软件。和集装箱一样,Docker在执行上述操作时,不关心容器到底装了什么,不管是web服务器,还是数据库,或者是应用程序服务器什么的所有的容器都按照相同方式将内容“装载”进去Docker也关心你要容器运到何方:我们可以在自己的笔记本中构建容器,上传到Registry然后下载一个物理或者虚拟的服务来测试,在容器部署具体主机中。像标准集装箱一样Docker容器方便替换,可以叠加,易于分发,并且尽量通用。使用Docker,我们可以快速的构建一个应用程序服务器一个消息总线、一套实用工具一个持续集成(CI测试环境或者任意一种应用程序服务工具。我们可以在本地构建一个完整的测试环境,也可以为生产或开发快速复制一套复杂的应用程序

三:Docker安装

1.安装环境说明

Docker官方建议在Ubuntu中安装,因为Docker是基于Ubuntu发布的,而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的。在很多版本的CentOS中是不支持更新最新一些补丁包的。由于我们开发环境一般都使用CentOS因此这里我们将Docker安装到CentOS上。注意这里建议安装在CentOS7.x以上的版本,在CentOS6.x的版本中,安装前需要安装其他很多的环境而且Docker很多补丁不支持更新

2.安装

  • 使用yum命令在线安装,yum install docker,需要确认的输入y
  • ​​​​​​​安装后查看Docker版本,docker -v
  • 启动dockersystemctl start docker
  • 停止docker:systemctl stop docker
  • 重启docker:systemctl restart docker
  • 查看docker状态:systemctl status docker
  • 开机启动:systemctl enable docker
  • 查看docker概要信息:docker info
  • 查看docker帮助文档:docker --help

Docker使用指南_第6张图片

四:Docker镜像操作

1.什么是Docker镜像

Docker镜像是由文件系统叠加而成(是一种文件的存储形式)。最底端一个文件引导系统bootfs,这很像典型的Linux/Unix引导文件系统Docker用户几乎永远不会引导系统有什么交互。实际上,一个容器启动后,移动内存中,引导文件系统则会被卸载出更多的内存供磁盘镜像使用。Docker容器启动是需要的一些文件而这些文件就可以称为Docker镜像

Docker使用指南_第7张图片

2.列出镜像:docker images

Docker使用指南_第8张图片

  • REPOSITORY:镜像所在的仓库名称
  • TAG:镜像标签,区别多个相同的镜像,一般为版本
  • IMAGE ID镜像ID,唯一标识一个镜像
  • CREATED镜像的创建日期(不是获取该镜像的日期)
  • SIZE镜像大小

这些镜像都是存储Docker宿主机的/var/lib/docker目录

Docker使用指南_第9张图片

为了区分同一个仓库下的不同镜像,Docker提供一种称为标签Tag功能每个镜像在列出来时带有一个标签,例如12.10、12.04等等。每个标签对组成特定镜像的一些镜像进行标记(比如,标签12.04就是对所有Ubuntu12.04镜像的标记)。这种机制使得同一个仓库可以存储多个镜像。--- 版本号,我们在运行同一个仓库的不同镜像时可以通过仓库名后面加上一个冒号和标签指定该仓库中的某一具体镜像,例如docker run --name custom_container_name –i –t docker.io/ubunto:12.04 /bin/bash表明镜像Ubuntu:12.04启动一个容器,而这个镜像的操作系统就是Ubuntu:12.04。在构建容器时指定仓库标签也是一个习惯

3.搜索镜像(需要联网):docker search 镜像名称

Docker使用指南_第10张图片

  • NAME:仓库名称
  • DESCRIPTION:镜像描述
  • STARS:用户评价,反应一个镜像的受欢迎程度
  • OFFICIAL是否官方
  • AUTOMATED自动构建,表示该镜像由Docker Hub自动构建流程创建的

4.拉取镜像

从Docker Hub(注册中心)拉取:docker pull centos:7

目前国内访问docker hub速度上有点尴尬,使用docker Mirror势在必行。现有国内提供docker镜像加速服务的商家有不少,下面重点ustc镜像。ustc是老牌的linux镜像服务提供者了,还在遥远的ubuntu 5.04版本的时候就在用。ustc的docker镜像加速器速度很快。ustc docker mirror的优势之一就是不需要注册,是真正的公共服务。https://lug.ustc.edu.cn/wiki/mirrors/help/docker,配置使用ustc:

  • 编辑该文件:vi /etc/docker/daemon.json如果该文件不存在手动创建;说明:在centos7.x下,通过vi。
  • 该文件中输入如下内容
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

  • 注意:一定要重启docker服务,如果重启docker后无法加速,可以重新启动宿主机,然后通过docker pull命令下载镜像:速度杠杠的。

Docker使用指南_第11张图片

​​​​​​​5.删除镜像:docker rmi $IMAGE_ID:删除指定镜像/docker rmi `docker images -q`:删除所有镜像,注意符号为esc下面的键

Docker使用指南_第12张图片

有镜像的容器正在运行,镜像无法删除 

五:容器操作

1.查看正在运行容器:docker ps

  • CONTAINER ID:容器id
  • IMAGE:镜像
  • COMMAND:初始命令
  • CREATED:创建日期
  • STATUS:状态
  • PORTS:端口
  • NAMES:镜像名称

2.查看所有的容器(启动过的历史容器):docker ps –a

3.查看最后次运行的容器:docker ps –l

4.查看停止的容器:docker ps -f status=exited

5.创建运行容器docker run

参数说明:

  • -i:表示运行容器
  • -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
  • --name :为创建的容器命名。
  • -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
  • -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
  • -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射

交互式容器:创建完毕后马上进入到容器,多次创建容器名称不能相同

docker run -it --name=mycentos7 centos:7 /bin/bash

Docker使用指南_第13张图片

 之后就在容器中(centos7)了,通过docker ps就可以查看到有容器运行

退出容器:exit 

通过docker ps -a查看所有,状态就变了

 守护式容器:创建完毕后,后台运行,不进入到容器

docker run -di --name=mycentos702 centos:7

进入到容器中:docker exec -it 容器名 进入容器需要容器执行的命令

docker exec -it mycentos702 /bin/bash

exit退出时,容器不会停止

6.停止正在运行的容器:docker stop $CONTAINER_NAME/ID

7.启动已运行过的容器:docker start $CONTAINER_NAME/ID

8.文件拷贝

将文件拷贝到容器内:docker cp 需要拷贝的文件或目录 容器名称:容器目录

docker cp test.txt mycentos7:/usr/local/

Docker使用指南_第14张图片

将文件从容器内拷贝出来:docker cp 容器名称:容器目录 需要拷贝的文件或目录

docker cp mycentos7:/usr/local/test.txt test1.txt

Docker使用指南_第15张图片

容器之间不能拷贝

9.目录挂载:我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。

docker run -di --name=mycentos703 -v /usr/local/myhtml/:/usr/local/mh centos:7

在宿主机中创建文件,在容器中对应的目录中就存在文件,拷贝文件夹到宿主机的文件中,容器中也有对应的文件夹

在容器中访问文件夹可能会出现没有权限,这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数  --privileged=true  来解决挂载的目录没有权限的问题

docker run -di --name=mycentos704 -v /usr/local/myhtml/:/usr/local/mh --privileged=true centos:7

10.查看容器IP地址

命令查看容器运行的各种数据:docker inspect 容器名

Docker使用指南_第16张图片

直接输出IP地址:docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名

11.删除容器:docker rm $CONTAINER_ID/NAME

Docker使用指南_第17张图片

正在运行的容器无法删除

删除所有容器:docker rm `docker ps -a -q`

六:应用部署

1.mysql的部署

  • 拉取镜像:docker pull mysql
  • 创建MySQL容器:docker run -di --name=mysql01 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

  • 进入mysql

Docker使用指南_第18张图片

这时候通过SQLyog就可以连接docker中的mysql,容器中之间连接是通过容器的ip

2.tomcat的部署

  • 拉取镜像:docker pull tomcat:7-jre7
  • 创建容器: docker run -di --name=tomcat -v /usr/local/myhtml/:/usr/local/tomcat/webapps -p 8090:8080 tomcat:7-jre7  

3.nginx的部署

  • 拉取镜像:docker pull nginx
  • 创建容器:docker run -di --name=nginx1 -p 80:80 nginx

  • 修改nginx配置文件,官方的nginx镜像,nginx配置文件nginx.conf 在/etc/nginx/目录下:docker cp nginx1:/etc/nginx/nginx.conf /usr/local/

Docker使用指南_第19张图片

  • 修改文件后,在拷贝到容器的目录中:docker cp /usr/local/nginx.conf nginx1:/etc/nginx
  • 重启容器:docker restart nginx1

4.redis的部署

  • 拉取镜像:docker pull redis
  • 创建容器:docker run -di --name=redis1 -p 6379:6379 redis

七:备份与迁移

1.容器保存为镜像docker commit 容器名 新的镜像名称

Docker使用指南_第20张图片

2.备份镜像:docker  save -o 保存为的文件 镜像名

Docker使用指南_第21张图片

3.恢复镜像文件:docker load -i 镜像文件

Docker使用指南_第22张图片

以上三步操作可以实现镜像备份,还可以将自己的环境拷贝给其他人使用,统一环境。

你可能感兴趣的:(Docker)