一、容器管理工具介绍
LXC
2008
是第一套完整的容器管理解决方案
不需要任何补丁直接运行在linux内核之上管理容器。创建容器慢,不方便移植
Docker
是在LXC基础上发展起来的。拥有一套容器管理生态系统
生态系统包含︰容器镜像、注册表、RESTFUL API及命令行操作界面
Docker版本
2017年的3月1号之后,Docker的版本命名开始发生变化,同时将CE版本和EE版本进行分开。
Docker社区版(CE)∶为了开发人员或小团队创建基于容器的应用,与团队成员分享和自动化的开发管道。docker-ce提供了简单的安装和快速的安装,以便可以立即开始开发。docker-ce集成和优化,基础设施。
Docker企业版(EE)∶专为企业的发展和IT团队建立。docker-ee为企业提供最安全的容器平台,以应用为中心的平台。
二、部署docker
用于管理容器,官网地址:www.docker.com
谷歌开发的基于golang语言
1、获取docker-ce的yum
按照官方文档去安装docker
安装之前必须卸载旧版docker,直接复制粘贴
yum list | grep docker 查看是否安装了docker
检测yum源是否配置成功,ls /etc/yum.repos.d,查看是否存在docker-ce.repo
2、安装docker
yum repolist 查看yum仓库是否有docker-ce-stable的软件包
yum -y install docker-ce 直接安装,也可以复制粘贴文档
安装特定版本可以看官方文档
设置docker开机自启 systemctl enable docker,启动docker,systemctl start docker
如果报错daemon守护进程没有开启,就是没有开docker服务
3、容器、镜像、仓库之间的关系
registry是仓库,但实际上是注册表的意思,里面可以放镜像
docker客户端收到命令发送给docker daemon守护进程,假如命令是调用CentOS镜像资源。
daemon就会在本地找是否有对应的镜像,如果没有就会在Registry仓库下载。
最后才通过对应的镜像images创建容器
安装的软件其实是在容器中,就比如字帖,就是一个模板。写字的时候需要加一张纸在上面,所以软件安装到容器中效率高,还可以用完就删,不会对镜像产生影响。
4、启动容器
第一步:查看本地是否有镜像
第二步:搜索镜像docker search 镜像名称
第三步:下载镜像
docker pull centos 下载centos镜像,默认是latest。可以在后面添加指定的版本号
docker pull centos:7.5 docker pull mysql:8.0.2
查看镜像是否下载完成docker images
第四步:运行容器
--name=c1是给容器命名,只不过二进制代码才是容器的真正的名称
uptime是容器启动时间 还有用户和1到15分钟的 负载均衡
在容器中安装apache、iproute
在本地可以访问容器ip并获取资源,exit退出之后就无法访问了,ps可以查看容器中的进程
5、docker daemon管理
远程管理docker daemon充分条件
可以把docker client与docker daemon分开部署
可以通过第三方软件管理docker daemon创建的容器
第一步:关闭docker daemon守护进程并修改daemon配置文件
修改后只保留dockerd
修改之后必须reload
第二步:重新启动docker
systemclt start docker
第三步:添加远程配置文件管理docker daemon
默认情况,/etc/docker下没有daemon.json
键值对的配置规则:hosts 对应" "," "
远程管理docker daemon 必须写2375端口
重启docker
第四步:远程连接测试
注意是远程主机的ip,不是容器的ip。
网页访问的时候要加端口号
可以通过远程命令pull下载镜像
6、docker命令行命令介绍
docker --help
可以分为docker管理命令和普通命令,管理命令是普通命令的补充
例如image ,普通命令是docker images 但是管理类命令是docker image ls
pull下载镜像
6.1、容器镜像传输
打包本地镜像用save命令
删除镜像之前必须删除容器rm 容器名称或者container id
容器哪怕是退出状态也会占用镜像
docker images 查看镜像
把镜像导入本地用load -i tar包名称
启动容器,run是普通命令,container是管理命令
容器可以随便创建,所以不用在意容器,它的作用其实就是用来跑服务的。
echo "container webpage" >> /var/www/html/index/html
容器安装httpd服务之后用决定路径命令启动
为了方便使用,可以把容器保存成tar包,也就是基于容器生成容器镜像
导入容器镜像tar包用import -m 事务标签 容器镜像tar包 容器镜像标签
可以用history 命令查看容器镜像的历史信息,之前创建了哪些容器镜像
方便通过标签tag去识别之前安装的容器镜像
创建一个新的容器c4可以直接使用导入的容器镜像
之前安装一个软件需要重复在多台服务器上安装,容器镜像保存并导入之后就不用重复安装了
每创建一个新的容器都可以直接使用导入的容器镜像
二、查看容器ip的方法
第一种:exec 容器的名称 ip a s
查看正在运行的容器的ip,不用进入容器中,直接在终端就能查看
run是创建一个新的容器
第二种:不需要和容器进行交互,直接用 docker inspect 容器名称
inspect可以查看容器的 所有信息
第三种:需要进入容器的,必须安装iproute
容器的ip地址是由docker0网桥自动分配的
2.1、停止正在运行的容器
docker ps 是查看正在运行的容器 docker ps -a 是查看所有存在的容器
删除容器之前必须stop
关闭和开启多个容器
通过attach附加参数进入进入容器,前提是容器必须是开启状态
删除容器之前必须停止stop
2.2、容器端口映射
容器的配置是一次性的,无法修改,只能删除之后释放容器空间。
停止容器之后rm容器,重新配置端口等信息
197服务器上的容器映射主机80端口
容器端口映射
合法的端口,全世界都能访问
less /etc/services
主机的端口有多少个?
分情况,tcp协议有多少个,udp协议有多少个,然后每个ip又都有tcp和udp
端口号的范围:1 ~ 65535
一种是发送信息以后,可以确认信息是否到达,也就是有应答的方式,这种方式大多采用TCP协议;
一种是发送以后就不管了,不去确认信息是否到达,这种方式大多采用UDP协议。对应这两种协议的服务提供的端口,也就分为TCP端口和UDP端口。
三、数据持久化存储
3.1、容器使用docker主机存储数据
第一步∶在Docker Host创建用于存储的目录
docker --help 查看-v命令是创建一个volume
挂载一个volume,随时随地可以把容器中的数据保存到docker主机
创建容器时自动就创建了data目录到/目录下,所以docker主机创建的目录就可以自动挂载到data
进入正在运行的容器并以命令行交互,attach进入容器之后才能touch
案例:运行在容器中的http服务,使用docker host的/web目录中的网页文件,并能够在doker host上进行修改,修改后立即生效。
第一步︰创建/web并添加网页文件
第二步:启动容器对/web目录进行挂载
也就是把docker主机创建的web目录挂载到容器c200使用
第三步:安装好http服务之后访问8080端口
httpd -k start 开启http服务,然后使用另外的主机访问docker主机ip:8080就可以访问到web目录
ctrl + p +q 退出容器不停止运行容器之后可以修改主机的web目录内容
容器时间同步
docker run -it -v /etc/localtime:/etc/localtime --name 容器名称 centos:latest /bin/bash
把docker host的时间同步到容器
在容器外执行容器内命令
exec 是在容器中打开新的终端,并且可以启动新的进程。用exit退出,不会导致容器的停止。
容器内的命令ls, docker ip a s 不是容器内的命令
容器间使用link互联
容器的编排其实就是每个服务的启动顺序,例如lnmp架构中如果有调度器,必须先启动数据库服务再启动web服务器。web服务器是调度服务器的依赖,数据库服务器又是web服务器的依赖
第一步︰创建被依赖容器
第二步:创建依赖于源容器的容器
也就是说想启动容器,必须先启动被依赖的容器c202,才能启动c203
容器202和203被自动映射到了/etc/hosts中
哪怕停止运行容器之后新增一个容器去抢占了原有的ip也不会影响容器的编排关系
容器的ip还是会自动映射到/etc/hosts文件中
只能先启动被依赖的容器,才能启动依赖于源容器的容器
四、docker容器镜像
4.1、容器镜像介绍
Docker镜像就是一组只读的目录,或者叫只读的Docker容器模板,镜像中含有一个Docker容器运行所需要的文件系统,所以我们说Docker镜像是启动一个Docker容器的基础。
可以将Docker镜像看成是Docker容器的静态时,也可将Docker容器看成是Docker镜像的运行时。
从Docker的官方文档来看,Docker容器的定义和Docker镜像的定义几乎是相同,Docker容器和Docker镜像的区别主要在于docker容器多出了一个可写层。
联合文件系统(UnionFS )是一种轻量级的高性能分层文件系统,它支持将文件系统中的修改信息作为一次提交,并层层叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,应用看到的是挂载的最终结果。
联合文件系统是实现Docker镜像的技术基础。Docker镜像可以通过分层来进行继承。例如,用户基于基础镜像(用来生成其他镜像的基础,不是centos操作系统,只是复刻了相同的文件系统目录结构)来制作各种不同的应用镜像(tomcat、apache)。这些镜像共享同一个基础镜像层,提高了存储效率。此外,当用户改变了一个Docker镜像(比如升级程序到新的版本),则会创建一个新的层
( layer )。因此,用户不用替换整个原镜像或者重新建立,只需要添加新层即可。用户分发镜像的时候,也只需要分发被改动的新层内容(增量部分)。这让Docker的镜像管理变得十分轻量级和快速。
镜像是静态的只读状态,但是镜像开启的 容器可以在里面读写并安装服务
还可以把容器镜像打包之后放到其他docker主机上运行
docker client向docker daemon发起创建容器的请求
docker daemon查找有无客户端需要的镜像
如无,则到容器的镜像仓库中下载需要的镜像
拿到容器镜像后再启动容器
容器镜像就是文件系统,用来保存和启动容器的
4.2基础镜像
1.部署一台最小化软件安装操作系统
2.把最小化软件安装操作系统根目录进行打包
每台计算机的映射都是不一样的,会自动映射键盘鼠标等,如果镜像迁移到另外一台计算机,一定会报错。所以打包镜像必须排除进程目录/proc和内核目录/sys
--numeric-owner 总是以数字代表用户/组的名称(打包的镜像里面用户和组的名称和id一定不一样)
-cvf 创建可显示的文件,就是把/目录打包成tar包
3.使用docker import导入至容器运行主机
用scp命令把打包的基础镜像拷贝到另外一台主机的/root
docker import tar包名称 自定义名称
导入镜像成功之后docker images 查看或者 docker image ls
运行容器docker run -it --name
proc进程目录是容器本身的目录和镜像没关系
4.3、应用镜像
在基础镜像运行的容器中安装apache,如果报错就yum clean all再安装
然后使用commit提交镜像
docker commit 容器名称 自定义应用镜像名称:tag标签
应用镜像就是在基础镜像运行的容器中安装软件,然后commit成一个应用镜像
运行应用镜像,也就是运行安装的软件对应的服务,永远杀不死,一直运行。
4.4、Dockerfile的关键字
FROM(指定基础image )
MAINTAINER(用来指定镜像创建者信息)
RUN(运行命令)
CMD(设置container启动时执行的操作)
如果容器镜像中有此命令,启动容器时,不要手动让容器执行其它命令
ENTRYPOINT(设置container启动时执行的操作)进入点
USER(设置container容器的用户)
EXPOSE(指定容器需要映射到宿主机器的端口)暴露端口号
ENV(用于设置环境变量)
ADD(从src复制文件到container的dest路径)
VOLUME(指定挂载点)
WORKDIR(切换目录)
4.5、docker build 通过Dockerfile 创建应用镜像的过程分析
通过Dockerfile创建一个可以在启动容器时就直接启动httpd应用的镜像
步骤∶
1、创建一个文件夹(目录)
2、在文件夹(目录)中创建Dockerfile文件及其它文件
3、使用docker build命令创建镜像
4、使用创建的镜像启动容器
目的︰通过Dockerfile创建一个可以在启动容器时就直接启动httpd应用的镜像步骤︰
创建一个目录,用于存储Dockerfile所使用的文件
在此目录中创建Dockerfile文件及制作镜像所使用到的文件
在此目录中使用docker build创建镜像(读取Dockerfile文件)
使用创建的镜像启动容器
思考︰
1.基础镜像是谁? centos7u62.安装httpd
3.yum -y install httpd
4.安装完成后如何启动httpd?编写一个把httpd启动的脚本文件
5.把httpd放在前端执行还是后端执行?前端
6.暴露端口? tcp80
7.添加一个测试文件,用于验证httpd是否可用?
4.6、使用Dockerfile创建应用镜像
创建一个test目录之后编辑一个脚本
vim run-httpd.sh
删掉apache的pid
前端运行httpd服务 foreground前景
直接创建一个index.html
然后再创建Dockerfile文件
vim Dockerfile
注意必须把index.html 文件add到项目文件目录下面/var/www/html/
如果安装过程中报错还可以添加 rpm --rebuilddb 重建数据库
使用docker build 创建应用镜像
-t 指定应用镜像的名称,自定义的需要tag
-d 后台运行应用镜像时不能在后面加 /bin/bash ,因为脚本中的CMD会被覆盖
验证直接用inspect 应用镜像id 查看IP,就能访问到写入的index.html内容
Dockerfile创建的 应用镜像更换项目内容
在test目录创建一个目录挂载到项目目录就可以实现网站内容更换
4.6.1、Dockerfile工作原理
在Dockerfile定义所要执行的命令,使用docker build创建镜像,过程中会按照Dockerfile所定义的内容打开临时性容器(使用docker commit进行提交),把Dockerfile文件中的命令全部执行完成,就得到了一个容器应用镜像。
4.6.2、通过Dockerfile安装nginx应用镜像
前提都是在docker服务器上有基础镜像
第一步:创建一个目录并在目录中创建相关的文件
报错是因为echo '单引号'
第二步:vim Dockerfile
第三步:通过docker build 创建nginx镜像
镜像都是创建到当前目录的
容器是不支持做数据持久化的,所以才关闭nginx的后台运行,不关闭的话
容器会产生访问日志,只能收集,无法保存
docker images验证镜像是否创建成功
第四步:后台启动nginx应用镜像容器
通过docker inspect 容器id 查看容器的ip
curl http://ip 访问容器的项目文件内容
五、docker存储数据的位置和方法
docker info 尽可能显示docker系统信息
存储的驱动overlay2
AUFS联合文件系统是乌班图 统一文件系统是CentOS
容器镜像就是把系统的 /目录打包
下载镜像之后会发现镜像的存储位置是overlay2
查看镜像可以diff看到根目录的结构
overlay2中的l文件本来是空的,但是创建镜像之后就会产生于软链接去挂载镜像
因为镜像的字符长度超了
5.1 Overlay及Overlay2原理
OverlayFS将单个Linux主机上的两个目录合并成一个目录。这些目录被称为层,统一过程被称为联合挂载。OverlayFS底层目录称为lowerdir,高层目录称为upperdir。合并统一视图称为merged。当需要修改一个文件时,使用CoW将文件从只读的Lower复制到可写的Upper进行修改,结果也保存在Upper层。在Docker中,底下的只读层就是image,可写层就是Container。
overlay2是overlay的改进版,只支持4.0以上内核添加了Multiple lower layers in overlayfs的特性,所以overlay2可以直接造成muitiple lower layers不用像overlay一样要通过硬链接的方式(最大128层) centos的话支持3.10.0-514及以上内核版本也有此特性,所以消耗更少的inode
本质区别是镜像层之间共享数据的方式不用
overlay共享数据方式是通过硬连接
而overlay2是通过**每层的lower文件*
overlay2这个目录存储的镜像及数据如果磁盘空间不够了可以
考虑去查找不需要的容器rm删除
docker运行后overlay2目录就会新增数据,运行前只有一条镜像数据