目录
!!!注:以下内容为B站 千锋教育Docker快速入门教程 笔记
视频链接:Docker
一、Docker介绍
服务上线会出现的问题
问题1:
某IT部门要上线一个项目。常规操作,直接去线上服务器,拷贝一个tomcat,然后改端口号,然后部署应用到webapps文件夹下,重启就好。
一个服务器上可能会部署多个应用服务。如果某个应用出现问题,CPU100%,可能这个服务器上的其他应用也会出现问题。对于一个大型应用拆分为几十个微服务,分别交由不同的团队开发,不同团队之间水平参差不齐。如果还采用这种部署方式,你的应用可能会因为另一个团队的应用发生意外。因部署在了同一台服务器上,导致全部出现问题。
问题2:
开发和线上代码(同一套代码)问题。开发阶段部署一套软件环境,测试人员在开发中测试没有问题,运维进行部署,但是正式部署到服务器时,发生了问题(启动参数、环境问题、漏配了参数)等意外。
问题3:
随着微服务技术的兴起,一个大的应用需要拆分成多个微服务。多个微服务的生成,就会面临庞大系统的部署效率,开发协同效率问题。然后通过服务的拆分,数据的读写分离、分库分表等方式重新架构,而且这种方式如果要做的彻底,需要花费大量人力物力。可能需要部署很多个服务器。
问题4:
持续的软件版本发布/测试项目。到线上环境的集成
什么是Docker
Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。
Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似iPhone的 app),更重要的是容器性能开销极低。
为什么用docker
1、简化程序:
Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是Docker的最大优势,过去需要用数天乃至数周的任务,在Docker容器的处理下,只需要数秒就能完成。
2、避免选择恐惧症:
如果你有选择恐惧症,还是资深患者。Docker帮你打包你的纠结!比如 Docker 镜像;Docker镜像中包含了运行环境和配置,所以Docker可以简化部署多种应用实例工作。比如Web应用、后台应用、数据库应用、大数据应用比如Hadoop集群、消息队列等等都可以打包成一个镜像部署。
3、节省开支
一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker改变了高性能必然高价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。
4、持续交付和部署
对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。使用Docker可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过Dockerfile来进行镜像构建,并结合持续集成(Continuous Integration)系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署(Continuous Delivery/Deployment)系统进行自动部署。而且使用Dockerfile使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像
5、更轻松的迁移
由于Docker确保了执行环境的一致性,使得应用的迁移更加容易。Docker可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
Docker的应用场景
Web应用的自动化打包和发布。
自动化测试和持续集成、发布。
在服务型环境中部署和调整数据库或其他的后台应用。
从头编译或者扩展现有的OpensShift或Cloud Foundry平台来搭建自己的Paas环境。
开发一套应用程序代码、服务器(Linux)、安装开发环境工具包(JDK/Tomcat/Mysql/Nginx/RabbitNMQ/Redis/Solr)
IaaS: (Infrastructure-as-a- Service) (基础设施即服务)
阿里云、百度云、腾讯云、华为云 企业只需开发一套应用程序代码、安装开发环境工具包
PaaS: (Platform as a Service) (平台即服务)
服务器+安装开发环境工具包 企业只需要开发一套应用程序代码。
SaaS: (Software-as-a-Service) (软件即服务)
服务器+安装开发环境工具包+代码 企业只需要花钱购买服务即可。
Docker 和虚拟机总结
名词解释:
infrastructure (基础服务) 硬件 Host OS主机操作系统 VM虚拟机 Hypervisor虚拟层程序
1.实现原理技术不同
虚拟机是用来进行硬件资源划分的完美解决方案,利用的是硬件虚拟化技术,如此VT-x、AMD-v会通过一个hypervisor 层来实现对资源的彻底隔离。
而容器则是操作系统级别的虚拟化,利用的是内核的cgroup和Namespace特性,此功能通过软件来实现,仅仅是进程本身就可以实现互相隔离,不需要任何辅助。
2.使用资源方面不同
Docker容器与主机共享操作系统内核,不同的容器之间可以共享部分系统资源,因此更加轻量级,消耗的资源更少。
虚拟机会独占分配给自己的资源,不存在资源共享,各个虚拟机之间近乎完全隔离,更加重量级,也会消耗更多的资源。
3.应用场景不同
若需要资源的完全隔离并且不考虑资源的消耗,可以使用虚拟机。若是想隔离进程并且需要运行大量进程实例,应该选择Docker容器。
Docker总结
●Docker是世界领先的软件容器平台
●Docker使用Google公司推出的Go语言进行开发实现, 基于Linux内核的cgroup, namespace, 以及AUFS类的UnionFS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。Docke最初实现是基于LXC。
●Docker能够自动执行重复性任务, 例如搭建和配置开发环境,从而解放了开发人员以便他们专注在真正重要的事情上:构建杰出的软件。
●用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
●Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一 致性,从而不会再出现“这段代码在我机器上没问题啊"这类问题。--一致的运行环境
●可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部罢的时间。--更快速的启动时间
●避免公用的服务器,资源会容易受到其他用户的影响。-- 隔离性
●善于处理集中爆发的服务器使用压力; -- 弹性伸缩,快速扩展
●可以很轻易的将在一个平台上运行的应用,迁移到另一 个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。-- 迁移方便
●使用Docker可以通过定制应用镜像来实现持续集成、持续交付、部署。--持续交付和部署
二、Docker架构
简介
Docker使用客户端服务器(C/S)架构模式,使用远程API来管理和创建Docker容器。
Docker容器通过Docker镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker基本概念
Docker包括三个基本概念
镜像(Image )
容器(Container )
仓库( Repository )
理解了这三个概念,就理解了Docker的整个生命周期。
Docker引擎
Docker引擎组件的流程如下图所示:
Docker使用客户端服务器(C/S)架构模式,使用远程API来管理和创建Docker容器。
Docker容器通过Docker镜像来创建。
Docker架构
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker镜像
是一个存入镜像的仓库。通常被部署在互联网服务器或者云端。
Docker Hub( https://hub.docker.com)提供了庞大的镜像集合供使用。
Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数 (如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
三、Docker仓库
Docker仓库用来保存镜像,可以理解为代码控制中的代码仓库。
Docker Hu(https://hub.docker.com)提供了庞大的镜像集合供使用。
公有Docker Registry
Docker Registry公开服务是开放给用户使用、允许用户管理镜像的Registry服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
最常使用的Registry公开服务是官方的Docker Hub,这也是默认的Registry,并拥有大量的高质量的官方镜像。除此以外,还有Coreos 的Quay.io, CoreOs 相关的镜像存储在这里; Google 的Google Container Registry, Kubernetes的镜像使用的就是这个服务。
由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对Docker Hub的镜像服务( Registry Mirror ),这些镜像服务被称为加速器。常见的有阿里云加速器、DaoCloud 加速器等。使用加速器会直接从国内的地址下载Docker Hub的镜像,比直接从Docker Hub下载速度会提高很多。
国内也有一些云服务商提供类似于Docker Hub的公开服务。比如时速云镜像仓库、网易云镜像服务、 DaoCloud镜像市场、阿里云镜像库等。
私有Docker Registry
除了使用公开服务外,用户还可以在本地搭建私有Docker Registry。Docker 官方提供了Docker Registry镜像,可以直接使用做为私有Registry服务。
开源的Docker Registry镜像只提供了Docker Registry API的服务端实现,足以支持docker 命令,不影响使用。但不包含图形界面,以及镜豫维护、用户管理、访问控制等高级功能。在官方的商业化版本Docker Trusted Registry中,提供了这些高级功能。
除了官方的Docker Registry外,还有第三方软件实现了Docker RegistryAPI,甚至提供了用户界面以及一些高级功能。比如,VMWare Harbor和Sonatype Nexus.
四、Docker安装
官方提供的安装教程:
https://docs.docker.com/install/linux/docker-ce/centos/#install-using-the-repository
CentOS安装要求:
Docker支持以下的CentOS版本:
CentOS 7 (64 bit)
CentOS 6.5 (64 bit)或更高的版本
安装
目前,CentOS 仅发行版本中的内核支持Docker, Docker 运行在CentOS7上,要求系统为64位、系统内核版本为3.10以上。Docker 运行在CentOS 6.5或更高的版本的Centos上,要求系统为64位、系统内核版本为2.6.32-431或者更高版本。
1、校验版本
uname -r #校验linux内核版本(3.10以上版本)
从2017年3月开始docker在原来的基础上分为两个分支版本: Docker CE和Docker EE。
Docker CE即社区免费版,Docker EE即企业版,强调安全,但需付费使用。
本文介绍Docker CE的安装使用。
2、移除旧的版本
sudo yum remove docker \
docker-client \
docker-cl1ent-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
如果yum报告未安装这些软件包,则可以。
3、安装一些必要的系统工具
安装所需的软件包。yum-utils 提供了yum-config-manager应用,并device-mapper-persistent-
data和lvm2由需要devicemapper存储驱动程序。
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
4、添加软件源信息
源1: (官方推荐)
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
源2: (阿里云源)
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5、更新yum缓存:
sudo yum makecache fast
6、安装Docker-CE
sudo yum -y install docker-ce
7、启动Docker后台服务
sudo systemctl start docker
8、重启Docker服务
sudo systemctl restart docker
9、安装成功后可通过查看
docker version
卸载
执行以下命令来删除Docker CE:
$ sudo yum remove docker-ce
$ sudo rm -rf /var/lib/docker
五、Docker 镜像加速器
鉴于国内网络问题,后续拉取Docker镜像十分缓慢,我们可以需要配置加速器来解决
使用Docker的时候,需要经常从官方获取镜像。但是由于显而易见的网络原因,拉取镜像的过程非常耗时,严重影响使用Docker 的体验。因此DaoCloud推出了加速器工具解决这个难题,通过智能路由和缓存机制,极大提升了国内网络访问Docker Hub的速度,目前已经拥有了广泛的用户群体,并得到了Docker 官方的大力推荐。如果您是在国内的网络环境使用 Docker,那么Docker 加速器一定能帮助到您。
Docker官方和国内很多云服务商都提供了国内加速器服务,例如:
Docker官方提供的中国registry miror
阿里云加速器
DaoCloud加速器
Docker官方加速器
我们以Docker官方加速器进行介绍
https://docs.docker.com/registry/recipes/mirror/#use-case-the-china-regstry-mirror
通过命令查看:在/etc/docker/daemon.json中写入如下内容(如果文件不存在请新建该文件)
{
"registry-mirrors":["https://registry.docker-cn.com"]
}
注意,一定要保证该文件符合json规范,否则Docker将不能启动
重启Docker:
sudo systemctl daemon-reload
sudo systemctl restart docker
阿里云加速器
阿里云的镜像源有个加速器,可以加速你获取容器的速度。这个加速器地址是每个人专属的。
网址: https://dev.aliyun.com/
登录阿里云个人帐号。
管理中心--容器镜像服务--镜像加速器
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
sudo mkdir -p /etc/docker
cd /etc/docker
vi daemon.json
{
"registry-mirrors": ["https://gxeo3yz7.mirror.aliyuncs.com"]
}
sudo systemctl daemon-reload
sudo systemctl restart docker
检查加速器是否生效
配置加速器之后,如果拉取镜像仍然十分缓慢,请手动检查加速器配置是否生效,在命令行执行docker info,查看镜像地址是否匹配,如匹配,说明配置成功
docker info
六、Docker镜像
镜像是Docker的三大组件之一。
Docker运行容器前需要本地存在对应的镜像,如果本地不存,Docker会从镜像仓库下载。
本节将介绍更多关于镜像的内容,包括:
从仓库获取镜像;
管理本地主机上的镜像;
介绍镜像实现的基本原理;
Docker命令使用
获取命令行帮助信息直接在命令行内输入docker命令后敲回车
Docker获取镜像
之前提到过,Docker Hub上有大量的高质量的镜像可以用,这里我们就说一下怎么获取这些镜像。
查找镜像
我们可以从Docker Hub网站来搜索镜像,Docker Hub网址为: https://hub.docker.com/
我们也可以使用docker search命令来搜索镜像。比如我们需要一个tomat的镜像来作为我们的web服务。 我们可以通过docker search命令搜索tomcat来寻找适合我们的镜像。
[root@docker ~]# docker search --help
Usage: docker search [OPTIONS] TERM
Search the Docker Hub for images
Options:
-f, --filter filter Filter output based on conditions provided
根据提供的条件过滤器输出
--format string Pretty-print search using a Go template
用Go模板打印出漂亮的搜索结果
--limit int Max number of search results (default 25)
提索结果的最大数量(默认值为25)
--no- trunc Don't truncate output
不要截断输出
docker search tomcat
获取镜像
从Docker镜像仓库获取镜像的命令是 docker pull 其命令格式为:
docker pull [选项] [Docker Registey 地址[:端口号]/] 镜像名[:标签]
具体的选项可以通过docker pull --help 命令看到,这里我们说一下镜像名称的格式。
- Docker 镜像仓库地址: 地址的格式一般是<域名/IP>[:端口号]。默认地址是Docker Hub。
- 仓库名:这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于Docker Hub,
如果不给出用户名,则默认为library,也就是百方镜像。
我们需要一个tomcat的镜像来作为我们的web服务。通过docker pull获取镜像
docker pull tomcat:版本号 //不写 :版本号代表laster版本
Docker列出镜像
要想列出已经下载下来的镜像,可以使用docker image ls命令。
docker images
docker image ls
列表包含了仓库名、标签、镜像ID、创建时间以及所占用的空间。
其中仓库名、标签在之前的基础概念已经介绍过了。镜像ID则是镜像的唯一标识,一个镜像可以对应多个标签。
因此,如果拥有相同的ID,因为它们对应的是同一个镜像。
Docker删除本地镜像
语法:
docker image rm [选项] <镜像1> [<镜像2> ....]
用 ID、镜像名、摘要删除镜像
其中,<镜像>可以是镜像短ID、镜像长ID、镜像名或者镜像摘要。
如果要删除本地的镜像,可以使用docker image rmi / rm 命令
docker image rmi 镜像ID //常用
要删除镜像必须确认此镜像目前没有被任何容器使用
Docker其它辅助命令
查看本地镜像的IMAGE ID
docker images -q
查看一个镜像的制作历程
docker history 镜像名称
Docker保存镜像
备份本地仓库的镜像
1、用save子命令将本地仓库的镜像保存当前目录下
docker save -o tomcat.guo.tar镜像名称
2、将本地目录下的镜像备份文件导入到本地Docker仓库
#方式一(不输出详细信息):
docker load -i tomcat.guo.tar
#方式二(输出详细信息):
docker load < tomcat.guo.tar
七、容器
容器是Docker核心概念。
简单的说,容器是独立运行的一个或一组应用,以及它们的运行环境。
对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和运行在上面的应用。
如下将具体介绍如何来管理一个容器,包活创建、启动和停止等
1、查看容器状态
docker ps //查看运行的容器
docker ps -a //查看所有的容器(包含运行和退出)
docker container ls
docker container ls-a
2、Docker启动容器
启动容器有二种方式,一种是基于镜像新建一个容器并启动,一种是将在终止状态( stopped)的容器重新启动
docker run 参数 镜像名称:tag 执行的命令
常用参数:
-i 保持和docker容器内的交互,启动容器时,运行的命令结束后,容器依然存活,没有退出(默认是会退出,即停止的)
-t 为容器的标准给入虚拟一个tty
-d后台运行容器
--rm 容器在启动后,执行完成命令或程序后就销毁
--name 给容器起一个自定义名称
-p 宿主机:内部端口
docker run --rm -d --name tomcat1 -p 8081:8080 tomcat
3、停止容器
通过docker ps找到容器id
docker stop 容器ID //停止正在运行容器〔或Ctrl+c)
docker stop $(docker ps -a -q) //停止所有的容器
docker container stop tomcat1/!停止正运行容器(ID或Names)
4、启动已终止容器
通过docker ps找到容器id
docker start 容器名/容器ID
6、关闭和删除容器
docker rm 容器ID
7、Docker守护态运行
更多的时候,需要让 Docker在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时,可以通过添加 -d 参数来实现
如果不使用-d参数运行容器:将会在当前宿主机运行。
如果使用了-d参数运行容器。此时容器会在后台运行并不会把输出的结果(STDOUT)打印到宿主机上面(输出结果可以用docker logs查看)。
docker logs tomcat1 //(ID或Names)
8、Docker进入容器
某些时候需要进入容器进行操作,使用docker exec命令
-i-t参数
docker exec后边可以跟多个参数,这里主要说明-i-t参数。
只用-i参数时,由于没有分配伪终端,界面没有我们熟悉的Linux命令提示符,但命令执行结果仍然可以返回。
当-i-t参数一起使用时,则可以看到我们熟悉的Linux命令提示符。
docker exec -it 容器ID(Names) bash
示例:
进入容器。对默认的tomcat进行页面修改,然后再访问查看效果。
注意默认容器内linux包是最小安装。只拥有最基本的命令
exit,不会导致容器的停止
docker exec -it tomcat1 bash //进入容器名称叫tomcat1
cd webapps
mkdir ROOT
echo 'hello-docker' >>index.html //对容器内的index.html进行字符串追加
9、在宿主机和容器之间交换文件
在宿主机和容器之间相互COPY文件 cp的用法如下
docker cp [OPTIONS] 容器名:文件路径 宿主机路径 //容器中复制到宿主机
docker cp [OPTIONS] 宿主机路径 容器名:文件路径 //宿主机复制到容器中
宿主机复制一个图片到容器中:将png图片复制到了容器指定目录下
docker cp guoweixin.png tomcat2:/usr/local/tomcat/webapps/ROOT
将容器内的index .jsp复制出来,修改再复制回去
docker cp tomcat2:/usr/local/tomcat/webapps/ROOT/index.jsp /root
八、Docker查看日志
docker logs 容器名称/ID
docker logs -f -t --since="2018-12-1" --tail=10 tomcat
--since :此参数指定了输出日志开始日期,即只输出指定日期之后的日志。
-f:查看实时日志
-t:查看日志产生的日期
--tail=10:查看最后的10条日志
tomcat:容器名称
九、Docker数据卷
问题:通过镜像创建一个容器。容器一旦被销毁,则容器内的数据将一并被删除。但有些情况下,通过服务器上传的图片出会丢失。容器中的数据不是持久化状态的。
那有没有一种独立于容器、提供持久化并能服务于多个容器的东西呢?
什么是数据卷
数据卷:是一个可供一个或多个容器使用的特殊目录
特性:
数据卷可以在容器之间共享和重用
对数据卷的修改会立马生效
对数据卷的更新,不会影响镜像
数据卷默认会一直存在,即使容器被删除
为什么需要数据卷?
这得从docker容器的文件系统说起。出于效率等一系列原因,docker容器的文件系统在宿主机上存在的方式很复杂,这会带来下面几个问题:
不能在宿主机上很方便地访问容器中的文件。
无法在多个容器之间共享数据。
当容器删除时,容器中产生的数据将丢失。
为了解决这些问题,docker引入了数据卷(volume)机制。数据卷是存在于一个或多个容器中的特定文件或文件夹,这个文件或文件夹以独立于docker文件系统的形式存在于宿主机中。
数据卷的最大特定是:其生存周期独立于容器的生存周期。
使用数据卷的最佳场景
在多个容器之间共享数据,多个容器可以同时以只读或者读写的方式挂载同一个数据卷,从而共享数据卷中的数据。
当宿主机不能保证一定存在某个目录或一些固定路径的文件时,使用数据卷可以规避这种限制带来的问题
当你想把容器中的数据存储在宿主机之外的地方时,比如远程主机上或云存储上。
当你需要巴容器数据在不同的宿主机之间备份、恢复或迁移时,数据卷是很好的选择。
数据卷的应用
#1创建数据卷
docker volume create 数据卷名称
创建数据卷之后,默认会存放到目录: / var/lib/docker/volume/数据卷名称/_data目录下
#2查看数据卷
docker volume inspect 数据卷名称
#3查看全部教据卷信息
docker volume ls
#4删除数据卷
docker volume rm 数据卷名称
#5应用数据卷
#5.1 当你映射数据卷时,如果数据卷不存在,Docker会帮你自动创建docker run -v 数据卷名称:容器内路径 镜像ID
#5.2直接指定一个路径作为数据卷的存储位置
docker run -v 路径:容器内部的路径 镜像ID
docker run -d --name tomcat-8080 -p 8080:8080 -v /root/docker-volumn/exam:/usr/local/tomcat/webapps/exam tomcat
centos防火墙端口
开放8080端口(如下命令只针对Centos7以上)
查看已经开放的端口:
firewall-cmd --list-ports
开启端口:
firewall-cmd --zone=public --add-port=8080/tcp --permanent
关闭端口:
firewall-cmd --permanent --zone=public --remove-port=8080/tcp
开启防火墙:
systemctl start firewalld
重启/关闭防火墙:
firewall-cmd --reload #重启
firewall systemctl stop firewalld #停止
firewall systemctl disable firewalld #禁止firewall开机启动