第四阶段提升
时 间:2023年7月31日
参加人:全班人员
内 容:
Docker容器引擎基础
目录
一、Docker概述
(一)容器背景:
(二)云计算模式:
(三)容器对比传统虚拟化
(四)虚拟化架构:
Docker容器与传统虚拟机的对比
(五)Docker的使用场景
二、Docker的优点
1、快速的交付和部署
2、更高效的虚拟化
3、更轻松的迁移和扩展
4、简单的管理
三、Docker的核心概念
1、镜像(Image)
2、容器(Container)
3、仓库(Repository)
四、Docker的安装
(一)Docker发行版本:
1、Windows安装Docker(作为了解)
2、Linux安装Docker
(二)安装前准备:
(三)默认的yum安装
(四)安装docker-ce
(五)阿里云镜像加速器
五、Docker基础操作
(一)查看Docker的版本信息
(二)查看docker的详细信息
(三)Docker镜像操作
1、docker search //从Docker Hub搜索镜像
2、获取镜像
3、查看镜像信息
4、获取镜像的详细信息
5、为镜像添加新的标签
6、删除镜像
7、存出镜像和载入镜像
8、上传镜像
(四)Docker 容器操作
2、容器的启动与停止
3、容器的删除
一、Docker概述
(一)容器背景:
客户(老板)-产品-开发-测试-运维à项目周期不断延后,项目质量差。
随着云计算和DevOps生态圈的蓬勃发展,产生了大量优秀的系统和软件。软件开发人员可以自由选择各种软件应用环境。但同时带来的问题就是需要维护一个非常庞大的
开发(Dev)、测试(Test)、预上线(UAT)和生产环境(Pro)。
面对这种情况,Docker容器技术横空出世、提供了简单、灵活、高效的解决方案,不需要过多地改变现有的使用习惯,就可以和已有的工具进行整合。因此,掌握Docker相关技术也是途径云计算的必经之路。
Docker是在Linux容器里运行应用的开源容器管理工具,可以理解为轻量级的“虚拟机”。
它诞生于 2013 年初,最初是 DotCloud 公司内部商业版项目,后来更换架构师,此架构师将Docker进行了开源,导致Docker使用人员增多。
基于 Google公司推出的 Go(Golang) 语言开发。该项目后来加入了Linux基金会,遵从了Apache 2.0协议进行推广,项目代码在 GitHub(https://github.com/docker)上进行维护。
Docker 自开源后受到广泛的业内人士及社区的关注,以至于DotCloud公司后来都改名为 Docker Inc。RedHat系列系统从 RHEL6.5 版本开始支持 Docker;Google 也在其 PaaS 产品中广泛应用。
官方网站:Docker: Accelerated, Containerized Application Development
(二)云计算模式:
IAAS 基础设施及服务 Kvm/Docker+Openstack
PAAS 平台即服务 Docker+Kubernetes
SAAS 软件即服务
Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱。鲸鱼可以看做宿主机,而集装箱可以理解为实现应用相互隔离的容器,每个集装箱中都包含自己的应用程序。正如Docker的设计宗旨一样:Build、Ship and Run Any App、Anywhere,即通过对应用组件的封装、发布、部署、运行等生命周期的管理、达到应用组件级别的“一次封装,到处运行”的目的。
这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
(三)容器对比传统虚拟化
Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker在Linux原有的 LXC 技术的基础上进行二次封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。相同的容器类软件还有很多。
传统虚拟化技术结构中底层是服务器硬件,硬件上运行着宿主机的操作系统兼虚拟化平台,通过在虚拟化出硬件设备上部署操作系统,在操作系统之上运行应用服务。而虚拟化出硬件中的操作系统将占用大量的服务器硬件资源浪费。
容器技术技术结构中底层硬件上运行宿主机操作系统,在宿主机操作系统上运行Docker引擎,无需虚拟化硬件,也不用部署操作系统,而是直接运行容器,提供所需的应用服务隔离环境,极大的提高了资源利用率。
(四)虚拟化架构:
寄居架构 VMware Workstation
原生架构 VMware ESXI
作为一种新兴的虚拟化方式, Docker 跟传统的虚拟化方式相比具有众多的优势:
1、Docker 容器的启动可以在秒级实现,相比传统的虚拟机方式要快很多;
2、Docker核心解决的问题是利用容器来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源,所以Docker容器除了运行其中的应用之外,基本不消耗额外的系统资源,从而保证应用性能的同时,减小系统开销,使得在一台主机上同时运行数千个Docker容器成为可能;
3、Docker操作方便,还可以通过Dockerfile配置文件支持灵活的自动化创建Docker镜像。
Docker容器与传统虚拟机的对比
特性 | 容器 | 虚拟机 |
启动时间 | 秒级 | 分钟级 |
资源损耗 | 几乎无 | 至少损耗50%左右(系统占用) |
硬盘空间 | MB | GB |
系统支持 | 上千个 | 几十个 |
隔离性 | 资源限制 | 完全隔离 |
性能 | 接近原生 | 弱于 |
Docker之所以拥有众多优势,与操作系统虚拟化自身的特点是分不开的,传统虚拟化需要有额外的虚拟机管理程序和虚拟机操作系统层,而Docker容器是直接在操作系统层面之上实现的虚拟化。
(五)Docker的使用场景
Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。
通过这种容器打包应用程序,意味着简化了重新部署、调试这些琐碎的重复工作,极大的提高了工作效率。
例如:项目从腾讯云迁移阿里云,如果采用了Docker容器技术,迁移只需要在新的云服务器上启动项目需要的容器即可。
二、Docker的优点
1、快速的交付和部署
对(DevOps)人员来说,最希望的就是项目环境一次创建或配置,可以在任意地方正常运行。开发者可以使用一个标准的镜像来构建一套项目开发容器,代码开发完成之后,运维人员可以直接此容器打包迁移。Docker可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。Docker将会大量地节约开发、测试、部署的时间。
2、更高效的虚拟化
Docker容器的运行不需要额外的管理系统支持,它是内核级的虚拟化,并且容器调用的是宿主机的bin和lib。因此可以实现更高的性能和效率。
3、更轻松的迁移和扩展
Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个平台。
4、简单的管理
使用 Docker只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
三、Docker的核心概念
1、镜像(Image)
镜像是创建容器的基础,镜像类似传统虚拟机的快照,可以理解为是一个面向Docker容器引擎的只读模板。
比如:一个镜像可以包含一个完整的 CentOS 操作系统环境,里面仅安装了 Apache的应用程序(称之为Apache镜像)或用户需要的其它应用程序。
Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像(堆叠),用户甚至可以直接从其他人那里获取一个已经做好的镜像来直接使用。
2、容器(Container)
容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。多个容器之间都是相互隔离的、保证了应用平台的安全性。
可以把容器看做是一个正在运行的简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的一个或一组应用程序。Docker容器用来运行和隔离应用地方。
注意:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。
3、仓库(Repository)
仓库是集中存放镜像的地方。通常会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub(https://hub.docker.com/),存放了数量庞大的官方镜像供用户下载。国内的公开仓库有Docker Pool等,可以提供大陆用户更稳定快速的访问。
当然,用户也可以在本地网络内创建一个私有仓库。当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
注意:Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。
Docker素材站:http://get.daocloud.io/
四、Docker的安装
Docker支持在主流的操作系统平台上使用,包括Windows系统、Linux系统及MacOS系统等。
目前最新的RedHat 、CentOS、Ubuntu等操作系统官方软件源中都已经默认自带了Docker包,可以直接安装使用,也可以用Docker自己的YUM源进行配置。
(一)Docker发行版本:
Docker-EE 企业版
Docker-CE 社区版
1、Windows安装Docker(作为了解)
本次选用Windows7系统安装,虚拟硬件如下:
运行DockerToolbox-1.11.2
一路下一步
所有都安装
点击完成
运行Docker Quickstart Terminal
2、Linux安装Docker
CentOS系统下安装Docker可以有两种方式:
一种是使用curl获得Docker的安装脚本进行安装,
另一种是使用YUM仓库来安装Docker。主要注意的是目前Docker只能支持64位系统。
(二)安装前准备:
[root@huyang1 ~]# iptables -F
[root@huyang1 ~]# setenforce 0
[root@huyang1 ~]# systemctl stop firewalld
保证可以访问互联网
[root@huyang1 ~]# ping www.baidu.com
[root@huyang1 ~]# ls /etc/yum.repos.d/
[root@huyang1 yum.repos.d]# yum clean all && yum makecache fast
(三)默认的yum安装
[root@huyang1 ~]# yum -y install docker
启动docker并设置开机启动
[root@huyang1 ~]# systemctl start docker
[root@huyang1 ~]# systemctl enable docker
[root@huyang1 ~]# docker version
安装好的Docker有两个程序:Docker服务端和Docker客户端。其中Docker服务端是一个服务进程,管理着所有的容器。Docker客户端则扮演者Docker服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下Docker服务端和客户端运行在一台机器上。
(四)安装docker-ce
[root@huyang1 ~]# wget -O/etc/yum.repos.d/CentOS-Base.repo
http://mirrors.aliyun.com/repo/Centos-7.repo
[root@huyang1 ~]# yum -y install yum-utils
device-mapper-persistent-data lvm2
[root@huyang1 ~]# yum-config-manager --add-repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@huyang1 ~]# ls /etc/yum.repos.d/
[root@huyang1 ~]# yum -y install docker-ce
[root@huyang1 ~]# docker version 查看版本
[root@huyang1 ~]# systemctl start docker
[root@huyang1 ~]# systemctl enable docker
(五)阿里云镜像加速器
阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台
[root@huyang1 ~]# cat << END > /etc/docker/daemon.json
{ "registry-mirrors":[ "https://nyakyfun.mirror.aliyuncs.com" ]
}
END
[root@huyang1 ~]# systemctl daemon-reload
[root@huyang1 ~]# systemctl restart docker
[root@huyang1 ~]# docker version
五、Docker基础操作
(一)查看Docker的版本信息
[root@huyang1 ~]# docker version
(二)查看docker的详细信息
[root@huyang1 ~]# docker info
(三)Docker镜像操作
Docker创建容器前需要本地存在对应的镜像,如果本地加载不到相关镜像,Docker默认就会尝试从镜像仓库https://hub.docker.com下载,这是由Docker官方维护的一个公共仓库,可以满足用户的绝大部分需求,用户也可以通过配置来使用自定义的镜像仓库。
1、docker search //从Docker Hub搜索镜像
命令格式:docker search 关键字
参数:
--automated=false 仅显示自动创建的镜像
--no-trunc=false 输出信息不截断显示
-s, --stars=0 指定仅显示评价为指定星级以上的镜像
[root@huyang1 ~]# docker search nginx
[root@huyang1 ~]# docker search -s 100 nginx //搜索星级为100以上的镜像
回显信息中都是包含nginx关键字的镜像、
其中返回信息包括:
镜像名称(NAME)、
描述(DESCRIPTION)、
星级(STARS)、
是否官方创建(OFFICIAL)、
是否主动创建(AUTOMATED)
默认的输出结果会根据星级评价进行排序,表示该镜像的受欢迎度,在下载镜像时,可以参考这一项,在搜索时还可以使用-s或者--stars=x显示指定星级以上的镜像,x为任意数。星级越高表示越受欢迎: 是否为官方镜像一项是指是否是由官方项目组创建和维护的镜像,一般官方项目组维护的镜像使用单个单词作为镜像名称。我们称为基础镜像或者根镜像。像jwilder/nginx-proxy这种命名方式的镜像,表示是由Docker Hub的用户jwilder创建并维护的镜像,带有用户名为前缀: 是否主动创建资源则是指是否允许用户验证镜像的来源和内容。
使用docker search命令只能查找镜像,镜像的标签无法查找,因此如果需要查找docker标签,需要从网页上访问镜像仓库https://hub.docker.com进行查找。
2、获取镜像
搜索到符合需求的镜像,可以使用docker pull 命令从网络下载镜像到本地使用。
命令格式:docker pull 镜像名称[:标签]
对于Docker镜像来说,如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为latest,也可以通过指定的标签来下载特定版本的某一镜像。
这里标签就是用来区分镜像版本的。
[root@huyang1 ~]# docker pull nginx
[root@huyang1 ~]# docker pull centos
从整个下载的过程可以看出,镜像文件是由若干层(Layer)组成,我们称为AUFS(联合文件系统),是实现增量保存于更新的基础,下载过程中会输出镜像的各层信息。镜像下载到本地之后就可以随时使用该镜像了。
用户也可以选择从其他注册服务器仓库下载,这时需要在仓库名称前指定完整的仓库注册服务器地址。
3、查看镜像信息
使用docker images命令查看下载到本地的所有镜像。
命令格式:docker images 仓库名称[:标签]
[root@huyang1 ~]# docker images
[root@huyang1 ~]# docker images nginx
从回显的信息:
REPOSITORY 镜像所属仓库
TAG 镜像的标签信息
IMAGE ID 镜像的唯一ID
CREATED 镜像创建时间
SIZE 镜像大小
4、获取镜像的详细信息
命令格式:docker inspect 镜像名或镜像ID
[root@huyang1 ~]# docker inspect nginx
镜像的详细信息中包括创建时间、系统版本、主机名、域名、用户、卷、标签、操作系统、设备ID等各种信息。
5、为镜像添加新的标签
命令格式:docker tag 名称[:标签] 新名称[:新标签]
[root@huyang1 ~]# docker tag nginx nginx:test
[root@huyang1 ~]# docker images
6、删除镜像
使用docker rmi 命令可以删除多余的镜像。
删除镜像的操作有两种方法:使用镜像的标签删除镜像;使用镜像的ID删除镜像。
命令格式:
docker rmi 镜像名称[:标签]
docker rmi 镜像ID
例:
[root@huyang1 ~]# docker rmi nginx:test
当一个镜像有多个标签的时候, docker rmi命令只是删除该镜像多个标签中的指定标签,不会影响镜像文件,相当于只是删除了镜像的一个标签而已,但该镜像只剩下一个标签的时候就要小心了,再使用删除命令就会彻底删除该镜像。
docker rmi 镜像ID
例:
[root@huyang1 ~]# docker rmi 60
当使用docker rmi命令后面跟上镜像的ID号时,必须确保该镜像没有被容器使用才能进行,删除时系统会先删除掉所有指向该镜像的标签,然后删除该镜像文件本身。如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。
7、存出镜像和载入镜像
当需要把一台机器上的镜像迁移到另一台机器上的时候,需要将镜像保存成本地文件,这一个过程叫做存出镜像,可以使用docker save命令进行存出操作。之后就可以复制该文件到其他机器。
命令格式:docker save -o 存出镜像为本地文件 镜像名
例:
[root@huyang1 ~]# docker save -o nginx-images nginx
[root@huyang1 ~]# ls -l nginx-images
将存出的镜像从A 机器拷贝到B 机器,需要在B 机器上使用该镜像,就可以将该导出文件导入到B 机器的本地镜像列表中,这一过程叫做载入镜像。使用docker load 或者docker load --input 进行载入操作。
命令格式:docker load < 存出的文件或者docker load --input 存出的文件
例如,从文件dhcp中载入镜像到本地镜像库中:
[root@huyang1 ~]# docker load < nginx-images
或者
[root@huyang1 ~]# docker load --input nginx-images
8、上传镜像
本地存储的镜像越来越多,就需要指定一个专门存放这些镜像的地方也就是仓库了。目前比较方便的就是公共仓库,默认上传到Docker Hub 官方仓库,需要注册使用公共仓库的账号,可以使用docker login 命令来输入用户名、密码和邮箱来完成注册和登录。在上传镜像之前,需要对本地镜像添加新的标签,然后再使用docker push 命令进行上传。
命令格式:docker push 仓库名称:标签
例如:
在公共仓库上已经注册成功了一个账号,这个账号叫做crushlinux和对应密码,新增镜像的标签为192.168.200.111:5000/nginx:test。
[root@huyang1 ~]# docker login hub.docker.com
Username: crushlinux
Password: 对应密码
login Succeeded
成功登陆后就可以上传镜像
[root@huyang1 ~]# docker tag nginx
192.168.200.111:5000/nginx:test
[root@huyang1 ~]# docker push
192.168.200.111:5000/nginx:test
[root@huyang1 ~]# docker load < nginx.tar
[root@huyang1 ~]# docker images
注意:可以发现,此时的nginx的ID号不同
(四)Docker 容器操作
容器是Docker 的另一个核心概念,简单说,容器是镜像的一个运行实例,是独立运行的一个或一组应用以及它们所必需的运行环境,包括文件系统、系统类库、shell 环境等。
镜像是只读模板,而容器会给这个只读模板一个额外的可写层。
下面将具体介绍围绕容器的具体操作:
1、创建容器与运行容器
Docker 的创建就是将镜像加载到容器的过程,Docker 的容器十分轻量级,用户可以随时创建或者删除。
新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器,这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全停止。停止的容器可以重新启动并保留原来的修改。
可以使用docker create 命令新建一个容器。
命令格式:docker create [选项]… 镜像运行的程序
常用选项:
-i 让容器的输入保持打开
-t 让Docker 分配一个伪终端
-d 守护进程形式运行
例:
[root@huyang1 ~]# docker create -it centos /bin/bash
注意:如果创建容器命令报错“WARNING: IPv4 forwarding is disabled. Networking will not work.
”,就使用vi编辑器打开/etc/sysctl.conf文件,在其中添加net.ipv4.ip_forward=1,然后使用sysctl -p命令加载配置。
[root@huyang1 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@huyang1 ~]# sysctl -p
使用docker create 命令创建新容器后会返回一个唯一的ID。
可以使用docker ps 命令来查看所有容器的运行状态。添加-a 选项可以列出系统中所有容器状态。
[root@huyang1 ~]# docker ps -a
输出信息:
显示容器的ID 号、
加载的镜像、
运行的程序、
创建时间、
目前所处的状态、
端口映射。
其中状态一栏为空表示当前的容器处于停止状态。
2、容器的启动与停止
启动停止容器可以使用docker start 命令。
命令格式:docker start 容器的ID/名称
[root@huyang1 ~]# docker start
b3ba7fee6e87a25937cfc83b7bec4efeb1e01ee9c2a80fd327ac250f32c3591cf(可以写全称、也可以写缩称,前提是在运行的id没有重复的情况下)
[root@huyang1 ~]# docker ps -a
容器启动后,可以看到容器状态一栏已经变为UP,表示容器已经处于启动状态。如果用户想创建并启动容器,可以直接执行docker run 命令,等同于先执行docker create 命令,再执行docker start 命令。需要注意只要后面的命令运行结束,容器就会停止。
3、容器的删除
docker start|stop|restart|kill //运行已停止的容器|停止一个正在运行的容器|重启一个容器|杀死一个正在运行的容器
可以使用docker rm 命令将一个已经终止状态的容器进行删除。
命令格式:docker rm 容器ID/名称
例如,删除ID 号为21f5e00a42e7的容器:
[root@huyang1 ~]# docker rm -f
3ba7fee6e87a25937cfc83b7bec4efeb1e01ee9c2a80fd327ac250f32c3591cf
如果删除一个正在运行的容器,可以添加-f 选项强制删除,但是建议先将容器停止再做删除操作。
Docker 默认的存储目录为/var/lib/docker,Docker的镜像、容器、日志等内容全部都存储在此,可以单独使用大容量的分区来存储这些内容,并且一般选择建立LVM 逻辑卷。从而避免Docker 运行过程中存储目录容量不足。