学习Docker
一、Docker介绍
什么是Docker
Docker是一个开源的应用容器引擎,基于 GO语言
并遵从Apache2.0协议开源。
Docker可以让开发者打包他们的应用以及依赖打包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化
容器是完全使用沙箱机制,相互之间不会有任何接口(类似iphone的App),更重要的是容器性能开销极低。
为什么用Docker
-
简化程序
Docker让开发者可以打包他们的应用以及依赖的一个可移植的容器中,然后发布到任何流行的Linux机器上,Docker改变了虚拟化的方式。这个开发者可以直接将自己的成果放入docker中进行管理。方便快捷已经是Docker的最大优势。过去需要用数天乃至数周的任务。在容器的处理下,只需要数秒就能完成。
-
避免选择恐惧症
如果你有选择恐惧症,还是资深患者docker帮你打包你的纠结!比如docker镜像;docker镜像中包含了运行环境和配置。所以docker可以简化部署多种应用实例工作。比如web应用,后台应用,数据库应用,大数据应用。比如Hadoop的集群、消息队列等等都可以打包成一个镜像部署。
-
节省开支
一方面,云计算时代的到来。开发者不必为了追求效果而配置高的硬件。Docker改变了高性能必然高价格的思维定势。docker与云的结合。让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。
-
持续交付和部署
对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置。可以在任意地方正常运行。使用docker可以通过定制运用镜像来实现持续集成、持续交付、部署开发人员可以通过dockerfile进行镜像构建。并结合持续集成(Continuous Integration)系统进行集成测试。而运维人员则可以直接在生产环境中快速部署该镜像。甚至结合持续部署(Continuous Delivery/Deployment)系统进行自动部署。而且使用dockerfile镜像构建透明化。不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件。帮助更好的生产环境中部署该镜像。
-
更轻松的迁移
由于docker确保了执行环境的一致性,使得应用的迁移更加容易。docker可以在很多平台上运行。无论是物理机,虚拟机,公有云,私有云甚至是笔记本。其运行结果都是一致的。因此用户可以很轻易的将一个平台上运行的应用迁移到另一个平台上。而不用担心运行环境的变化导致应用无法正常运行的情况。
Docker的应用场景
- web应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
- 从头编译或者扩展现有的OpenShift或Clound Foundry平台来搭建自己的PaaS环境。
云计算·大数据时代
开发一套应用程序、服务器(Linux)、安装开发工具包(JDK Tomcat mysql rabbitMQ Redis Solr)
Iaas:(Infrastructure as a Service)(基础设施即服务)
阿里云、百度云、腾讯云、华为云
Iaas:(服务器):开发一套应用程序代码,安装开发环境工具包。
Paas:(Platform as a Service)(平台即服务)
Paas:服务器加安装开发环境工具包。只需要开发一套应用程序代码。
Saas:(Software as a Service)(软件即服务)
Saas:服务器+安装开发环境工具包+代码。只需要花钱购买服务即可。
Docker和虚拟机总结
-
实现原理和技术不同
虚拟机是用来进行硬件资源划分的完美解决方案。利用的是硬件虚拟化技术。比如VT-x、AMD-V会通过一个Hypervisor层来实现对资源的彻底隔离。
而龙系则是操作系统级别的虚拟化。利用的是内核的Cgroup和Namespace特性,此功能通过软件来实现,仅仅是进程本身就可以实现相互隔离,不需要任何辅助。
-
使用资源方面不同
Docker容器与主机共享操作系统内核不同的容器之间可以共享部分系统资源。因此更加轻量级,消耗的资源更少。
虚拟机会独占分配给自己的资源,不存在资源共享。各个虚拟机之间近乎完全隔离,更加轻量级,也会消耗更多的资源。
-
应用场景不同
若需要资源的完全隔离,并且不考虑资源的消耗,可以使用虚拟机。
若是想隔离进程并且需要运行大量进程实例,应该选择Docker容器。
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为MB |
一般为GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般为几十个 |
Docker总结
- Docker是世界上领先的软件容器平台。
- 使用Google公司推出了Go语言进行开发实现,基于Linux内核的Cgroup,namespace以及AUFS类的。UnionFS等技术。对进程进行封装隔离。属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其他的隔离进程,因此也称其为容器。Docker最初实现是基于LXC。
- Docker能够自动执行重复性任务。例如搭建和配置开发环境。从而解放了开发能源,以便于他们专注在真正重要的事情上。—— 构建杰出的软件。
- 用户可以方便的创建和使用容器。把自己的应用放入容器。容器还可以进行版本管理,复制,分享,修改。就可以像管理普通的代码一样。
- Docker的镜像提供了除内核外完整的运行环境。确保了应用运行环境一致性。从来都不会再出现环境不一致带来的问题。—— 一致的运行环境
- 可以做到秒级,甚至毫秒级的启动时间,大大的节约了开发、测试、部署的时间。——更快的启动时间。
- 避免公用的服务器资源会容易受到其他用户的影响。—— 隔离性
- 善于处理集中爆发的服务器使用压力。—— 弹性伸缩,快速扩展
- 可以很轻易的将在一个平台上运行的应用迁移另一个平台上,从而不用担心运行环境的变化导致应用无法正常运行的情况。—— 迁移方便
- 使用Docker可以通过定制应用镜像来实现持续集成,持续交付部署。—— 持续交付和部署
二、Docker架构
简介
Docker基本概念
docker包括三个基本概念
-
镜像(Image)
-
容器(Container)
-
仓库(Repository)
理解了这三个概念,就理解了docker的整个生命周期。
Docker引擎
Docker引擎组件的流程如下图所示:
docker使用客户端服务器(C/S)架构模式。使用远程API来管理和创建docker容器。
docker容器通过docker镜像来创建
Docker架构
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker | 面向对象 |
---|---|
容器 | 对象 |
镜像 | 类 |
Docker镜像(Images) | Docker进校是用于创建docker镜像的模板。 |
---|---|
Docker容器(Container) | 容器是独立运行的一个或一组应用。 |
Docker客户端(Client) | Docker客户端,通过命令行或者其他工具使用docker API与docker的守护进程通信。 |
Docker主机(Host) | 一个物理或虚拟机的机器用于执行docker守护进程和容器。 |
Docker仓库(Registry) | Docker仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub提供了庞大的镜像集合提供使用。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、Digital Ocean、Microsoft Azure。 |
Docker镜像
是一个存储现象的仓库。通常被部署在互联网服务端或云端。
hub.docker.com提供了庞大的镜像机和供使用。
分层存储
Docker容器
三、Docker仓库
公有Docker Register
Docker Register公开服务是开放给用户使用,允许用户管理镜像的Register服务。在这里公开服务,允许用户免费上传下载公开的镜像。并可能提供收费服务供用户管理私有镜像。
最常使用的Register公开服务是官方的Docker Hub
,这也是默认的Register,并拥有大量的高质量的官方现象,除此以外,还有CoreOS
的Quay.io
CoreOS相关镜像存储在这里;Google的Google Container Registry
,Kuberntes
的镜像使用的就是这个服务。
由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务提供商针对docker hub的镜像服务(Register Mirror)。这些镜像服务被称为加速器。常见的有阿里云加速器。Dao cloud加速器等。使用加速器会直接从国内的地址下载docker hub镜像,比直接从docker hub下载速度会提高很多。
那也有一些云服务商提供类似于docker hub的公开服务,例如时速云镜像仓库,网易云镜像服务。DaoCloud市场,阿里云镜像库等。
私有Docker Register
除了使用公开服务外,用户还可以在本地搭建私有Docker Register,Docker官方提供了Docker Register
镜像,可以直接使用作为私有Register服务。
开源的Docker Register镜像只提供了过了Docker Register API
的服务实现。是以支持Docker命令,经常使用,但不包含图形界面以及镜像维护,用户管理,访问控制的高级功能。在官方的商业化版本Docker Trusted Register
中。提供了这些高级功能。
除了官方外的Docker Register,还有第三方软件实现了Docker Register API。甚至提供了用户界面以及一些高级功能,比如VMWare Harbor
和Sonatype Nexus
。
四、Docker安装
-
检验版本
uname -r 检验linux内核版本(3.10以上版本)
从2017年3月开始。Docker在原来的基础上分为两个分支版本。docker CE和docker EE,docker CE即社区免费版docker EE即企业版强调安全,但需付费使用。本文介绍docker CE的安装使用。
官方网址Install Docker Engine on CentOS | Docker Documentation
- 卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docke-engine;
如果yum报告未安装这些软件包,则可以。
- 安装一些必要的系统工具
安装所需的软件包。
yum-utils
提供了yum-config-manager
应用,并device-mapper-persistent-data
和lvm2
由需要devicemapper
存储驱动程序。
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 添加软件源信息
源1:(官方推荐)
sudo 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
- 更新yum缓存:
sudo yum makecache fast
- 安装Docker-CE
sudo yum -y install docker-ce
- 启动Docker后台服务
sudo systemctl start docker
- 重启Docker服务
sudo systemctl restart docker
卸载
执行以下命令来删除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 mirror
- 阿里云加速器
- DaoCloud加速器
Docker官方加速器
https://docs.docker.com/registry/recipes/mirros/#use-case-the-china-registry-mirros
通过命令查看:在/etc/docker/daemon.json
中写如下内容(如果文件不存在,请新建该文件。)
cd /etc/docker
vi daemon.json
{
"registry-mirrors":["https://registry.docker-cn.com"]
}
注意,一定要保证该文件符合json规范。否则Docker将不能启动。
阿里云加速器
https://cr.console.aliyun.com/cn-hangzhou/instances/mirros
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<- 'EOF'
{
"registry-mirrors":["https://gxeo3yz7.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
重启Docker
systemctl daemon-reload
systemctl restart docker
检查加速器是否生效
配置加速器之后,如果拉取镜像仍然十分缓慢。请手动检查加速器配置是否生效。
在命令行执行docker info。查看镜像地址是否匹配,如匹配说明配置成功。
docker info
测试
从docker中下载镜像
docker pull tomcat
发现下载速度明显加快
六、Docker镜像
镜像是Docker的三大组件之一。
Docker形容器前需要本地存在对应的镜像。如果本地不存,Docker会从镜像仓库下载。
本节将介绍更多关于镜像的内容,包括:
从仓库获取镜像。
管理本地主机的镜像。
介绍镜像实现的基本原理。
Docker命令使用
获取命令行帮助信息直接在命令行内输入Docker命令后敲回车。
Docker获取镜像
之前提到过。Docker Hub上有大量高质量的镜像可以用。这里我们说一下怎么获取这些镜像。
查找镜像
可以从Docker Hub网站来搜索镜像。地址https://hub.docker.com/
我们也可以使用Docker search命令来搜索镜像,以Tomcat为例:
docker search tomcat
拉取镜像
docker pull tomcat:版本号 //不写:版本号 代表latest版本
Docker列出镜像
docker images
或
docker image ls
[root@master ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 17 months ago 141MB
tomcat latest fb5657adc892 17 months ago 680MB
列表包含了仓库名、 标签、 镜像ID、 创建时间、 占用的空间。
Docker删除本地镜像
语法:
docker image rm [选项] <镜像> [<镜像2>......]
用ID、镜像名、摘要删除镜像
其中,<镜像>可以是镜像短ID、镜像长ID、镜像名或者镜像摘要
如果要删除本地的镜像,可以使用 docker image rmi/rm
命令
docker image rmi 镜像ID
要删除镜像必须确认此镜像目前没有被任何容器使用。
Docker其他辅助命令
查看本地镜像的 IMAGE ID
docker images -q
看一个镜像的制作历程。
docker history 镜像名称
Docker保存镜像
备份本地仓库的镜像。
-
用save子将本地仓库的镜像保存当前目录下。
docker save -o tomcat.guo.tar 镜像名称
-
将本地目录下的镜像备份文件导入到本地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 tomcat -p 8080:8080 tomcat
练习1:
运行一个Tomcat容器:
docker run -i-t --name tomcat1 tomcat
3. 查看正在运行的容器
docker ps
4. 查看所有容器
docker ps -a
5. 停止容器
docker stop 容器ID
停止所有容器
docker stop $(docker ps -a -q)
6. 启动已终止容器
docker start 容器ID
7. 重启已关闭容器
docker restart 容器ID
8. 关闭和删除容器(删除前请停止该容器)
docker rm 容器ID
删除所有容器
docker rm $(docker ps -a -q)
9. Docker守护状态运行
10. Docker进入容器
某些时候需要进入容器进行操作,使用docker exec
命令
-i-t参数
docker exec后边可以跟多个参数。这里主要说明-i-t参数。
使用-i参数时,由于没有分配伪终端界面没有我们熟悉的Linux命令提示符。但命令执行结果仍然可以返回。
当参数-i-t一起使用时,这可以看到我们熟悉的Linux命令提示符。
docker exec -it 容器ID (Name) bash
ls -l
cd webapps
mkdir ROOT
cd ROOT
echo 'cxf-java' >> index.html
Docker退出容器
不会导致容器的停止。
exit
11.在宿主机和容器之间交换文件
docker cp [OPTIONS] CONTAINER:PATH LOCALPATH //容器中 复制到 宿主机
docker cp [OPTIONS] LOCALPATH- CONTAINER:PATH //宿主机 复制到 容器中
宿主机复制一个图片到容器中:将png图片复制到了容器指定目录下
docker cp xxx.png tomcat:/usr/local/tomcat/webapps/ROOT
将容器内的index.html复制出来,修改在复制回去
docker cp tomcat2:/usr/local/tomcat/webapps/ROOT/index.html /root
八、Docker查看日志
docker logs 容器ID /容器名称
docker logs tomcat8080
docker logs -f -t ==since='2023-05-06' --tail=10 qfjy_exam
--since:参数指定了输出日志开始日期,即只输出指定日期之后的日志。
-f:查看实时日志。
-t:查看日志产生的日期。
-tail=10:查看最后的10条日志。
qfjy_exam:容器名称
docker logs -f --tail=10 容器名称
查看后面10行
docker logs --tail=10 tomcat8080
九、作业案例
十、Docker数据卷
CentOS防火墙端口
开放8080端口(如下命令只针对CentOS7以上)
查看已开放的端口
firewall-cmd --zone=public --list-ports
开启端口:
firewall-cmd --zone=public --add-port=8080/tcp --permanent
关闭端口:
firewall-cmd --zone=public --remove-port=8080/tcp --permanent
开启防火墙
systemctl start firewalld
关闭防火墙
firewalld systemctl stop firewalld service
重启防火墙
firewalld-cmd --reload
禁止防火墙开机启动
firewalld systemctl disadle firewalld service
本文来自博客园,作者:cxf0616,转载请注明原文链接:https://www.cnblogs.com/cxfbk/p/17459289.html
风起于青萍之末,浪成于微澜之间
每一份成功都源于每日的坚持