docker(一) 入门

如今流行的服务: SpringBoot + SpringCloud + Dockerlinux

1. 虚拟化

  在计算机中,虚拟化是一种资源管理技术,是将计算机的各类实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户能够比本来的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。通常所指的虚拟化资源包括计算能力和资料存储。nginx

  在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能太低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件对资源充分利用web

  虚拟化技术种类不少,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、桌面虚拟化、虚拟机等等。docker

在这里插入图片描述

1.1. Hypervisor

  Hypervisor也叫虚拟机监视器(Virtual Machine Monitor),是一种运行在物理服务器和操做系统之间的中间软件层,可容许多个操做系统和应用共享一套基础物理硬件,它能够协调访问服务器上的全部物理设备和虚拟机。数据库

  Hypervisor是全部虚拟化技术的核心。当服务器启动并执行Hypervisor时,它会给每一台虚拟机分配适量的内存、CPU、网络和磁盘,并加载全部虚拟机的客户操做系统。使软硬件架构和管理更高效、更灵活,硬件的效能可以更好地发挥出来。apache

  常见的产品有:VMware、KVM、Xen等等。json

1.2. 容器技术

  在计算机的世界中,容器拥有一段漫长且传奇的历史。容器与管理程序虚拟化(hypervisor virtualization)有所不一样,管理程序虚拟化经过中间层将一台或者多台独立的机器虚拟运行与物理硬件之上,而容器则是直接运行在操做系统内核之上的用户空间。所以,容器虚拟化也被称为“操做系统级虚拟化”,容器技术可让多个独立的用户空间运行在同一台宿主机上。ubuntu

  因为“客居”于操做系统,容器只能运行与底层宿主机相同或者类似的操做系统,这看起来并非很是灵活。例如:能够在Ubuntu服务中运行Redhat Enterprise Linux,但没法再Ubuntu服务器上运行Microsoft Windows。centos

  容器被认为是精益技术,由于容器须要的开销有限。和传统虚拟化以及半虚拟化相比,容器不须要模拟层(emulation layer)和管理层(hypervisor layer),而是使用操做系统的系统调用接口。这下降了运行单个容器所需的开销,也使得宿主机中能够运行更多的容器。浏览器

2. Docker介绍

2.1. Docker组件

在这里插入图片描述

Docker核心组件都有:

  • Docker客户端
  • Docker服务器
  • Docker镜像
  • Docker仓库
  • Docker容器

2.1.1. Docker客户端和服务器

  Docker是一个客户端-服务器(C/S)架构程序。Docker客户端只须要向Docker服务器或者守护进程发出请求,服务器或者守护进程将完成全部工做并返回结果。咱们能够在同一台宿主机上运行Docker守护进程和客户端,也能够从本地的Docker客户端链接到运行在另外一台宿主机上的远程Docker守护进程。

2.1.2. Docker镜像和仓库

  Docker 镜像是用于建立 Docker 容器的模板。用户基于镜像来建立Docker容器。

  镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来。例如:

  • 添加一个文件;
  • 执行一个命令;
  • 打开一个窗口。

  也能够将镜像看成容器的“源代码”。镜像体积很小,很是“便携”,易于分享、存储和更新。

  Docker仓库是用来保存用户构建的镜像的地方也叫作Registry。仓库分为公共和私有两种。Docker公司运营公共的Registry叫作Docker Hub。用户能够在Docker Hub注册帐号,分享并保存本身的镜像(说明:在Docker Hub下载镜像巨慢,能够本身构建私有的Registry)。

2.1.3. 容器

  Docker能够帮助你构建和部署容器,你只须要把本身的应用程序或者服务打包放进容器便可。容器是基于镜像启动起来的,容器中能够运行一个或多个进程。

  咱们能够简单的认为,镜像是Docker中的构建或者打包阶段,而容器则是启动或者执行阶段。容器基于镜像启动,一旦容器启动完成后,咱们就能够登陆到容器中安装本身须要的软件或者服务。

在这里插入图片描述

Github.com hub.docker.com

  Docker借鉴了标准集装箱的概念,标准集装箱将货物打包装箱后,运往世界各地。Docker将这个模型运用到本身的设计中,不一样的是:集装箱运输货物,而Docker运输软件。

  和集装箱同样,Docker在执行上述操做时,并不关心容器中到底装了什么,它无论是web服务器,仍是数据库,或者是应用程序服务器什么的。全部的容器都按照相同的方式将内容“装载”进去。

  Docker也不关心你要把容器运到何方:咱们能够在本身的笔记本中构建容器,上传到Registry,而后下载到一个物理的或者虚拟的服务器来测试,在把容器部署到具体的主机中。像标准集装箱同样,Docker容器方便替换,能够叠加,易于分发,而且尽可能通用。

2.2. Docker优势

  Docker 是一个开源的虚拟化容器引擎,让开发者能够打包他们的应用以及依赖包到一个可移植的容器中,而后发布到任何流行的 Linux 机器上。

2.2.1. 提供一个简单、轻量的建模方式

  Docker上手很是快,用户只须要几分钟,就能够把本身的程序“Docker化”。Docker依赖于“写时复制”(copy-on-write)模型,使修改应用程序也很是迅速,能够说达到“随心所致,代码即改”的境界。

  随后,就能够建立容器来运行应用程序了。大多数Docker容器只须要不到1秒中便可启动。因为去除了管理程序的开销,Docker容器拥有很高的性能,同时同一台宿主机中也能够运行更多的容器,使用户尽量的充分利用系统资源。

2.2.2. 职责的逻辑分离

  使用Docker,开发人员只须要关心容器中运行的应用程序,而运维人员只须要关心如何管理容器。Docker设计的目的就是要增强开发人员写代码的开发环境与应用程序要部署的生产环境一致性。从而下降那种“开发时一切正常,确定是运维的问题(测试环境都是正常的,上线后出了问题就归结为确定是运维的问题)”

Build once,Run anywhere

2.2.3. 快速、高效的开发

  Docker的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具有可移植性,易于构建,并易于协做。(通俗一点说,Docker就像一个盒子,里面能够装不少物件,若是须要这些物件的能够直接将该大盒子拿走,而不须要从该盒子中一件件的取。)

2.2.4. 鼓励使用面向服务的架构

  Docker还鼓励面向服务的体系结构微服务架构。Docker推荐单个容器只运行一个应用程序或进程,这样就造成了一个分布式的应用程序模型,在这种模型下,应用程序或者服务均可以表示为一系列内部互联的容器,从而使分布式部署应用
程序,扩展或调试应用程序都变得很是简单,同时也提升了程序的内省性。(固然,能够在一个容器中运行多个应用程序)

2.2.5. 使用上区别

在这里插入图片描述

3. 安装Docker

3.1. 说明

  Docker官方建议在Ubuntu中安装,由于Docker是基于Ubuntu发布的,并且通常Docker出现的问题Ubuntu是最早更新或者打补丁的。在不少版本的CentOS中是不支持更新最新的一些补丁包的。

  这里咱们将Docker安装到CentOS上。注意:这里建议安装在CentOS7.x以上的版本,在CentOS6.x的版本中,安装前须要安装其余不少的环境并且Docker不少补丁不支持更新。

3.2. CentOS 7 下安装Docker

3.3. 安装Docker

使用yum命令安装

yum install docker

在这里插入图片描述

查看docker版本号

docker –v
在这里插入图片描述

3.4. Docker服务命令

  • 开机启动:systemctl enable docker.service/docker
  • 启动docker:systemctl start docker.service
  • 中止docker:systemctl stop docker.service
  • 重启docker:systemctl restart docker.service
  • 查看docker状态:systemctl status docker.service
  • 查看docker概要信息:docker info
  • 查看docker帮助文档:docker --help

4. 使用Docker镜像和仓库

4.1. 列出镜像

在这里插入图片描述

  • REPOSITORY:镜像所在的仓库名称
  • TAG:镜像标签
  • IMAGE ID:镜像ID
  • CREATED:镜像的建立日期(不是获取该镜像的日期)
  • SIZE:镜像大小

4.2. 镜像tag

  为了区分同一个仓库下的不一样镜像,Docker提供了一种称为标签(Tag)的功能。每一个镜像在列出来时都带有一个标签,每一个标签对组成特定镜像的一些镜像层进行标记(好比,标签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。

4.3. 查找镜像

在这里插入图片描述

可使用 docker search ${name} 查找docker hub上的镜像

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

4.4. 拉取镜像

4.4.1. 说明

  Docker镜像首页,包括官方镜像和其它公开镜像。Docker Hub上最受欢迎的10大镜像(经过Docker registry API获取不了镜像被pull的个数,只能经过镜像的stars数量,来衡量镜像的流行度。)。

在这里插入图片描述

  国情的缘由,国内下载 Docker HUB 官方的相关镜像比较慢,可使用国内(docker.io)的一些镜像加速器,镜像保持和官方一致,关键是速度块,推荐使用。Mirror与Private Registry的区别:

  • Private Registry(私有仓库)是开发者或者企业自建的镜像存储库,一般用来保存企业内部的 Docker 镜像,用于内部开发流程和产品的发布、版本控制。
  • Mirror是一种代理中转服务,咱们(好比daocloud)提供的Mirror服务,直接对接Docker Hub的官方Registry。Docker Hub 上有数以十万计的各种 Docker镜像。
  • 在使用Private Registry时,须要在Docker Pull 或Dockerfile中直接键入Private Registry 的地址,一般这样会致使与 Private Registry 的绑定,缺少灵活性。
  • 使用 Mirror 服务,只须要在 Docker 守护进程(Daemon)的配置文件中加入 Mirror 参数,便可在全局范围内透明的访问官方的 Docker Hub,避免了对 Dockerfile 镜像引用来源的修改。
  • 简单来讲,Mirror相似CDN,本质是官方的cache;Private Registry相似私服,跟官方没什么关系。对用户来讲,因为用户是要拖docker hub上的image,对应的是Mirror。yum/apt-get的Mirror又有点不同,它实际上是把官方的库文件整个拖到本身的服务器上作镜像,并定时与官方作同步;而Docker Mirror只会缓存曾经使用过的image。

4.4.2. 从docker hub拉取镜像

在这里插入图片描述

docker pull centos:7(指定version)。

目前国内访问docker hub速度上有点尴尬,使用docker Mirror势在必行。现有国内提供docker镜像加速服务的商家有很多,下面介绍:

4.4.3. ustc的镜像

  ustc是老牌的linux镜像服务提供者了,还在遥远的ubuntu 5.04版本的时候就在用。ustc的docker镜像加速器速度很快。ustc docker mirror的优点之一就是不须要注册,是真正的公共服务。

https://lug.ustc.edu.cn/wiki/mirrors/help/docker

步骤:

1. 编辑文件

在这里插入图片描述

vi /etc/docker/daemon.json

2. 在文件中输入以下内容

{
  “registry-mirrors”:[“https://docker.mirrors.ustc.edu.cn”]
}

3. 重启docker服务,若是重启docker后没法加速,能够从新启动Linux

在这里插入图片描述

systemctl restart docker.service

注意:必定要重启才能生效

4. 使用docker pull命令下载镜像

docker pull centos:7

5. 查看已下载的镜像

docker images

注意:国内网络的话可能超时致使下载失败。

4.4.4. 其余镜像仓库

4.4.4.1. daocloud镜像

  DaoCloud也提供了docker加速器,可是跟ustc不一样,须要用户注册后才能使用,而且每个月限制流量10GB。linux上使用比较简单,一条脚本命令搞定。

官网:https://www.daocloud.io/mirror#accelerator-doc

配置加速器步骤:

一、 执行该命令:curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://{your_id}.m.daocloud.io

在这里插入图片描述
获取执行语句的位置:
在这里插入图片描述

二、 实际上面的脚本执行后,改的是/usr/lib/systemd/system/docker.service文件,加了个–registry-mirror参数。若是不执行上面的脚本命令,能够直接修改这个文件也可。
在这里插入图片描述

三、 重启加载配置。说明:加速效果不是很明显。

  • systemctl daemon-reload // 从新加载配置
  • systemctl restart docker

四、 下载镜像:以nginx为例
在这里插入图片描述

在这里插入图片描述

执行命令:docker pull daocloud.io/daocloud/nginx-proxy

4.4.4.2. alicloud

  阿里云也提供了docker加速器,不过比daocloud更麻烦:不光要注册为阿里云的用户,还得加入开发者平台。不过虽然麻烦,可是它的服务还真是不错,pull速度很溜!配置方法跟daocloud相似,也是开通加速器之后给一个url。

步骤:

一、 同daocloud同样,在该/usr/lib/systemd/system/docker.service文件中添加:
–registry-mirror=https://{your_id}.mirror.aliyuncs.com\

二、 从新加载配置而且重启

三、 下载须要的镜像,例如:docker pull ubuntu

4.4.4.3. 网易镜像

网易也提供了Docker镜像服务:网易蜂巢(https://c.163.com/hub#/m/home/)

4.5. 删除镜像

一、 docker rmi $IMAGE_ID:删除指定镜像

在这里插入图片描述

二、 删除全部镜像:

docker rmi `docker images -q`

在这里插入图片描述

5. 容器操做【重点】

5.1. 建立容器

5.1.1. 建立容器命令

使用命令

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

建立容器经常使用的参数说明:

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

5.1.2. 实例

建立一个交互式容器并起名叫mycentos

docker run -it --name mycentos centos:7/bin/bash

在这里插入图片描述

建立一个守护式容器:若是对于一个须要长期运行的容器来讲,咱们能够建立一个守护式容器。命令以下(容器名称不能重复):

docker run -itd --name mycentos2 centos:7 /bin/bash

在这里插入图片描述

5.2. 查看容器

5.2.1. 查看正在运行的容器

查看当前正在运行的容器:

docker ps

退出当前容器,该容器也随之中止:

在这里插入图片描述

5.2.2. 查看全部的容器

启动过的历史容器:

docker ps –a

5.2.3. 查看最后一次运行的容器

docker ps –l

5.3. 登陆退出容器

5.3.1. 登陆容器

登陆(附着)守护式容器方式:

u docker attach container_name 或者container_id

例如:docker attach 83a46ff1aef6

exit退出时,容器随之中止

u docker exec –it container_name 或者container_id /bin/bash

例如:docker exec -it mycentos3 /bin/bash

exit退出时,容器不会中止

5.3.2. 退出容器

退出容器可使用exit命令或者使用[ctrl + D]退出。

5.4. 容器命名

docker rename 原名称 新名称

5.5. 启动中止容器

5.5.1. 中止正在运行的容器

docker stop $CONTAINER_NAME/ID

例如:docker stop 5982286fa3a8

5.5.2. 启动已运行过的容器

docker start $CONTAINER_NAME/ID

例如:docker start 5982286fa3a8

5.5.3. 删除容器

删除容器:

docker rm $CONTAINER_ID/NAME

例如:docker rm 5982286fa3a8

删除全部容器:

docker rm `docker ps -a -q`

5.6. 其余操做

5.6.1. 深刻容器内部:

docker inspect $CONTAINER_NAME/ID

例如:docker inspect 3f311573c03e

还能够经过-f或者–format来选定查看的结果

docker inspect -f='{{.NetworkSettings.IPAddress}}' 3f311573c03e

6. Docker环境下部署应用程序

在docker中部署应用能够有多种方式:

  • 方案一:根据系统镜像建立Docker容器,这个时候Docker就至关于一个虚拟机,而后进入容器部署对应的应用。具体步骤以下:
  1. 启动Centos系统镜像的容器my_container;
  2. 在该容器中部署应用程序,例如:Tomcat、Nginx等;
  3. 将部署完的my_container提交为新的镜像;
  4. 而后根据新的镜像去建立容器;
  5. 这个镜像能够打包,导入到其余的Docker服务器上
  • 方案二:直接经过docker pull拉取别人提交好的tomcat、nginx等应用程序镜像,而后基于这些镜像去建立容器。

6.1. 安装Tomcat-方案一

步骤:

一、 从docker hub上拉取镜像

docker pull centos:7

二、 列出已有的镜像

docker images

三、 建立交互式容器

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

四、 在容器中安装jdk。

1)将jdk上传到容器中:

先将jdk上传到宿主机中

在这里插入图片描述

2)从宿主机复制jdk到容器中

docker cp jdk-7u75-linux-x64.tar.gz mycentos:/

3)在容器中解压缩,并将jdk移动到/usr/local目录下

tar -zxf jdk-7u75-linux-x64.tar.gz
mv jdk1.7.0_75/ /usr/local/jdk7

4)配置环境变量

vi /etc/profile

5)在文件末尾追加

export JAVA_HOME=/usr/local/jdk7
export PATH=$JAVA_HOME/bin: $PATH

五、 将Tomcat上传到容器中

1)将Tomcat上传到宿主机,

在这里插入图片描述

2)上传到容器中。

docker cp apache-tomcat-7.0.47.tar.gz  mycentos:/

六、 安装Tomcat

1) 在容器中解压Tomcat

tar -zxf apache-tomcat-7.0.47.tar.gz

2) 移动Tomcat到/usr/local中

mv apache-tomcat-7.0.47/ /usr/local/tomcat7

七、 将此容器提交为新的镜像

docker commit mycentos mytomcat7

八、 咱们能够将手动制做好的镜像打包:

docker save mytomcat7 > /root/tomcat7.tar.gz

而后将这个镜像包上传到别的机器上

九、加载镜像

docker load < /root/tomcat7.tar.gz

十、利用新提交的镜像启动tomcat容器

建立容器时作端口映射,将host的8888端口映射到容器的8088端口,使用-p参数作映射

docker run -dit --name tomcat2 -p 8888:8080 mytomcat7 /bin/bash

十一、登录容器,启动tomcat进程

docker exec -it tomcat2 /bin/bash
source /etc/profile
/usr/local/tomcat7/bin/startup.sh

十二、经过浏览器访问

http://192.168.37.177:8888/

在这里插入图片描述

6.2. 安装tomcat-方案二

步骤:

一、 获取Tomcat镜像

docker pull tomcat

二、 查看镜像

docker images

三、 建立守护式容器,并设置端口映射

docker run -d --name tomcat3 -p 8889:8080 tomcat /bin/bash

四、 访问Tomcat

在这里插入图片描述

7. 将镜像推送到Docker Hub(了解)

7.1 注册Docker hub帐号

在Docker Hub注册后建立private/public的Repository。

7.2 登陆docker login

在这里插入图片描述

7.3 推送docker push

在这里插入图片描述

7.4 Docker hub查看

在这里插入图片描述

7.5 下载

在这里插入图片描述