随着大数据平台型产品方向的深入应用实践和Docker开源社区的逐渐成熟,业界有不少的大数
据研发团队开始使用Docker。简单来说,Docker会让大数据平台部署更加简单快捷、让研发和测试团队集成交付更加敏捷高效、让产线环境的运维更加有质量保障。
在大数据平台型产品的开发过程中,经常要跟许多模块打交道,包括Hadoop、HBase、Hive、
Spark、Sqoop、Zookeeper……等多达几十个开源组件,为了不影响团队成员间的工作任务协同,
开发人员其实非常需要自己有一套独立的集群环境,以便反复测试自己负责的模块,可真实的企业
开发环境往往只有一两个大的虚拟集群,这可怎么办?
难道要给每个开发人员都配几台独立的物理机器?
针对每一次新版本的发布,产品测试组都需要反复的重装整个平台以便发现问题,而正如本文
前面所阐述的那样,大数据平台所依赖的组件繁多,不同组件模块依赖的底层库也不尽相同,经常
会出现各种依赖冲突问题,而一旦安装完成,就很难再让Linux系统恢复到一个非常干净的状态,
通过Remove、UnInstall、rpm -e等手动方式卸载,往往需要花费很长的时间,那如何才能快速地
恢复大数据平台集群的系统环境?
当测试人员在测试大数据平台过程中发现了一个Bug,需要保存现场,这里面包括相关的大数
据组件配置、进程状态、运行日志、还有一些中间数据,可是,平台集群服务器节点数量很多,针
对每个进程的配置目录和日志文件,都相对较独立,一般都需要专业的开发工程师或者运维工程师
进入相关服务器节点,按照不同组件的个性化配置信息,手工方式收集所需的各个条目信息,然后
打包汇集到日志中心服务器进行统一分析,而目前业界并没有一款能够自动分布式收集故障相关的
日志系统,但测试工作还要继续,怎么办?
传统解决方案的缺陷
想要解决这些问题,第一个想到的方案当然是用虚拟机,但这种方式并不能完美的解决以上问
题,比如:
在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资
源,如:服务器、网络、内存、存储等等,予以抽象、转换后呈现出来,打破实体结构间的不可切
割的障碍,使用户可以比原来的组态更好的方式来应用这些资源,这些资源的核心虚拟部分是不受
现有资源的架设方式,低于或者物理组态所限制,一般所指的虚拟化资源包括计算能力和资料存储。
在实际的生产过程中,虚拟化技术主要是用来解决高性能的物理硬件产能过剩和老的硬件产能
过低的重用重组,透明化底层物理硬件,从而最大化的利用物理硬件,对资源充分利用
虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip),桌面
虚拟化、服务虚拟化、虚拟机等等。
虚拟化简单讲,就是把一台物理计算机虚拟成多台逻辑计算机,每个逻辑计算机里面可以运行
不同的操作系统,相互不受影响,这样就可以充分利用硬件资源
小 结: Docker是一种容器技术,解决软件跨环境迁移的问题
虚拟机是一个计算机系统的仿真,简单来说,虚拟机可以实现在一台物理计算机上模拟多台计
算机运行任务。
VMs也消耗大量系统资源,每个VM不仅运行一个OS的完整copy并且需要所有硬件的虚拟化
copy,这消耗大量RAM和CPU。相比单独计算机,VM是比较经济的,但对于一些应用VM是过度
浪费的,需要容器。
特性 | 虚拟机 | 容器 |
---|---|---|
隔离级别 | 操作系统级 | 进程级 |
隔离策略 | 运行于Hypervisor上 | 直接运行在宿主机内核中 |
系统资源 | 5-15% | 0-5% |
启动速度 | 慢,分钟级 | 快,秒级 |
占用磁盘空间 | 非常大,GB-TB级 | 小,KB-MB甚至KB级 |
并发性 | 一台宿主机十几个,最多几十个 | 上百个,甚至上百上千个 |
高可用策略 | 备份、容灾、迁移 | 弹性、负载、动态 |
结论:与传统的虚拟化相比,Docker优势体现在启动速度快,占用体积小
Docker是一个客户端-服务端(C/S)架构程序,Docker客户端只需要向Docker服务端或者守护进程发出请求,服务端或者守护进程完成所有工作返回结果。
Docker提供了一个命令行工具Docker以及一整套的Restful API,可以在同一台宿主机器上运行
Docker守护进程或者客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程
Docker守护进程。
Docker使用C/S架构,Client 通过接口与Server进程通信实现容器的构建,运行和发布.client
和server可以运行在同一台集群,也可以通过跨主机实现远程通信。
Docker 镜像(Image)就是一个只读的模板。例如:一个镜像可以包含一个完整的操作系统
环境,里面仅安装了 Apache 或用户需要的其它应用程序
镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。Docker 提供了一个很简单的
机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜
像来直接使用。
镜像(Image)就是一堆只读层(read-only layer)的统一视角,也许这个定义有些难以理解,
看看下面这张图:
右边可以看到多个只读层,它们重叠在一起,除了最下面一层,其它层都会有一个指针指向下
一层。这些层是Docker内部的实现细节,并且能够在docker宿主机的文件系统上访问到。
统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供
了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
Docker 利用容器(Container)来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
结论:容器 = 镜像 + 读写层。并且容器的定义并没有提及是否要运行容器
仓库(Repository)是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务(Registry)
混为一谈,并不严格区分。
实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有
不同的标签(tag)。
仓库分为**公开仓库(Public)和私有仓库(Private)**两种形式。
大家需要注意,Docker本身并不是容器,它是创建容器的工具,是应用容器引擎。想要搞懂Docker,其实看它的两句口号就行。
第一句,是“Build, Ship and Run”。也就是,“搭建、发送、运行”,三板斧。
第二句口号就是:“Build once,Run anywhere(搭建一次,到处能用)”。
Docker技术的三大核心概念,分别是:
负责对Docker镜像进行管理的,是Docker Registry服务(类似仓库管理员)不是任何人建的
任何镜像都是合法的,万一有人盖了一个有问题的房子呢?
所以,Docker Registry服务队镜像的管理是非常严格的。
最常使用的Registry公开服务,是官方的Docker Hub,这也是默认的Registry,并拥有大量的高质量的官方镜像。
官方地址:https://hub.docker.com/
服务器: node1
Docker官方建议在Ubuntu中安装,因为Docker是基于Unbantu发布的,而且一般Docker出现
的问题Ubuntu是最先更新或者打补丁,在很多版本的Centos中是不支持更新最新的一些补丁包的。
由于学习的环境都使用的Centos,因此这里将Docker安装到Centos上,注意:建议安装在
Centos7.x以上的版本,在Centos6.x的版本中,安装前需要安装其他很多的环境,而且Docker很多
补丁不支持更新
Docker要求Linux的Kernel版本必须大于3.8,推荐使用3.10及更高,所以需要先验证CentOS的
内核是否大于3.8。
uname -r
如果已经安装过Docker,请先卸载,再重新安装,来确保整体的环境是一致的。由于这个虚拟
机是新创建的,所以并没有安装过Docker,但如果同学们使用已有的虚拟机,则需要按照下面的命
令卸载。
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
如果连接超时,可以使用alibaba源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io
sudo service docker start
systemctl enable docker
usermod -aG docker root
退出,然后重新登录,以便让权限生效
docker version
操作 | 指令 |
---|---|
启动docker | systemctl start docker |
停止docker | systemctl stop docker |
重启docker | systemctl restart docker |
查看docker状态 | systemctl status docker |
开机启动 | systemctl enable docker |
查看docker概要信息 | docker info |
查看docker帮助文档 | docker --help |
操作步骤:
鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来
解决 https://help.aliyun.com/product/60716.html
注册一个属于自己的阿里云账户(可复用淘宝账号)
登陆阿里云开发者平台
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
获取加速器地址
配置本机Docker运行镜像加速器
阿里云的本人自己账号的镜像地址(需要自己注册有一个属于你自己的):
https://xxxx.mirror.aliyuncs.com
vim /etc/docker/daemon.json
重启daemon服务
systemctl daemon-reload
重启Docker服务
systemctl restart docker
Linux 系统下配置完加速器需要检查是否生效
操作 | 指令 |
---|---|
查看Docker版本 | docker version |
查看docker概要信息 | docker info |
查看docker帮助文档 | docker --help |
网站:https://hub.docker.com
docker search centos
NAME:镜像名称
DESCRIPTION:镜像描述
STARS:用户评价,反应一个镜像的受欢迎程度
OFFICIAL:是否官方
AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的
docker pull 镜像名字
拉取镜像的时候默认拉取最新的版本,如果想拉取指定版本的话,需要添加版本号信息,不指
定版本的话拉取的是latest这个版本的镜像。
拉取指定版本的时候追加版本信息:docker pull centos:7
docker pull centos:7
查看Dockerfile文件内容:
FROM scratch 表示最基础的镜像文件,当继承自该镜像的时候表示只有一层文件
REPOSITORY:镜像名称
TAG:镜像标签
IMAGE ID:镜像id
CREATED:镜像的创建日期(不是获取该镜像的日期)
SIZE:镜像大小
-a :列出本地所有的镜像(含中间映像层)
-q :只显示镜像ID。
–digests :显示镜像的摘要信息
–no-trunc :显示完整的镜像信息
docker rmi -f 镜像ID
docker rmi -f 镜像名1:TAG 镜像名2:TAG
docker rmi -f $(docker images -qa)
有镜像才能创建容器,这是根本前提(下载一个CentOS镜像演示)
docker ps
docker ps -a
docker ps -l
docker ps -f status=exited
创建容器常用的参数说明
docker run
OPTIONS说明(常用):有些是一个减号,有些是两个减号
前者表示宿主机端口,后者是容器内的映射端口,可以使用多个-p做多个端口映射
启动交互式容器
docker run -it --name=centos 镜像名称:标签
/bin/bash
拉取centos:docker pull centos
docker run -it centos /bin/bash
这时通过ps命令查看,发现可以看到启动的容器,状态为启动状态
也可以这样写
docker run -it --name=mycentos centos:latest /bin/bash
/bin/bash的作用是因为docker后台必须运行一个进程,否则容器就会退出,在这里表示启动容
器后启动bash。
exit
docker run -di --name=容器名称 镜像名称:标签
docker run -di --name=mycentos2 centos:latest
什么是守护式容器:
能够长期运行、没有交互式会话、适合运行应用程序和服务
docker stop 容器名称(或者容器id)
docker stop mycentos2
docker start 容器名称(或者容器id)
docker start mycentos2
docker restart 容器名称(或者容器id)
docker restart mycentos2
docker kill 容器名称(或者容器id)
docker kill mycentos2
docker cp 需要拷贝的文件或者目录 容器名称:容器目录
docker cp /tmp/anaconda.log mycentos2:/tmp
docker exec -it mycentos2 /bin/bash
docker cp 容器名称:容器目录 需要拷贝的文件或者目录
docker cp mycentos2:/tmp /export/
可以在创建容器的时候,将宿主机的目录和容器内的目录进行映射,这样就可以通过修改宿主
机的某个目录的文件从而去影响容器。
创建容器添加-v参数,后边为宿主机目录:容器目录,例如:
docker run -di -v /root/data01/:/data01 --name=centos7 centos:7
docker exec -it centos7 /bin/bash
ls /datas
vim /root/data01/xx.txt 1 hello、2 hello
more xx.txt vi xx.txt 3 world、4 world
docker run -di --privileged=true -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos7 centos:7
如果共享的是多级的目录,可能会出现权限不足的提示,这是因为Centos7中的安全模块
selinux把权限禁掉了,我们需要添加参数–privileged=true来解决挂载的目录没有权限的问题?
docker inspect 容器名称(容器id)
docker inspect mycentos3
docker inspect --format=’{{.NetworkSettings.IPAddress}}’ 容器名称(容器id)
docker inspect --format=’{{.NetworkSettings.IPAddress}}’ mycentos3
docker rm 容器名称(容器ID)
docker stop mycentos3
docker rm mycentos3
总体步骤:
①搜索镜像
②拉取镜像
③查看镜像
④启动容器
⑤停止容器
⑥移除容器
docker search mysql
docker pull centos/mysql-57-centos7\
-p 代表端口映射,格式为宿主机映射端口:容器运行端口
-e 代表添加环境变量,MYSQL_ROOT_PASSWORD是root用户的登录密码
docker search nginx
docker pull nginx
docker run -di --name=mynginx -p 80:80 nginx
-p 代表端口映射,格式为宿主机映射端口:容器运行端口
docker search redis:4.0
docker pull redis:4.0
docker run -di --name=myredis -p 6379:6379 redis:4.0
-p 代表端口映射,格式为宿主机映射端口:容器运行端口
docker exec -it myredis redis-cli
在宿主机创建目录
mkdir -p /export/docker/myredis/data/
mkdir -p /export/docker/myredis/conf/
在conf创建配置文件redis.conf
启动容器
docker run -p 6379:6379 -v /export/docker/myredis/data/:/data -v
/export/docker/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis:4.0 redis-server
/usr/local/etc/redis/redis.conf --appendonly yes
查看持久化文件是否生成
ls /export/docker/myredis/data/
docker commit mynginx mynginx_image
docker run -di --name=mynginx2 -p 81:80 mynginx_image
docker save -o mynginx.tar mynginx_image
-o:表示output,输出的意思
docker rmi mynginx_image
因为该镜像存在容器,所以先删除容器,在删除镜像
docker load -i mynginx.tar
-i:表示输入的文件,执行后再次查看镜像,可以看到镜像已经恢复
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,
它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文
件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一
个虚拟文件系统下(unite several directories into a single virtual filesystem)。
Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没
有父镜像),可以制作各种具体的应用镜像
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把
各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
以pull为例,在下载的过程中我可以看到docker的镜像好像是在一层一层的在下载
最大的一个好处就是 - 共享资源
比如:有多个镜像都从相同的base镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,
同时内存中也只需加载一份base镜像,就可以为所有容器服务了,而且镜像的每一层都可以被共享。
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像
以熟悉的centos为例:https://hub.docker.com/_/centos/
从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,
命令 | 作用 |
---|---|
FROM image_name:tag | 定义了使用哪个基础镜像启动构建流程 |
MAINTAINER user_name | 声明镜像的创建者,创建者的用户名和邮箱地址 |
ENV key value | 设置环境变量(可以写多条) |
RUN command | 是Dockerfile的核心部分(可以写多条) |
ADD source_dir/file dest_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件,将会 |
COPY source_dir/file dest_dir/file | 和ADD相似,但是如果有压缩文件并不能解 |
WORKDIR path_dir | 设置工作目录 |
指明构建的新镜像是来自于哪个基础镜像,例如:
FROM centos: latest
指明镜像维护着及其联系方式(一般是邮箱地址),例如:
MAINTAINER JC Zhang [email protected]
不过,MAINTAINER并不推荐使用,更推荐使用LABEL来指定镜像作者,例如:
LABEL maintainer=“zhangsan.cn”
构建镜像时运行的Shell命令,例如:
RUN [“yum”, “install”, “httpd”]
RUN yum install httpd
启动容器时执行的Shell命令,例如:
CMD ["-C", “/start.sh”]
CMD ["/usr/sbin/sshd", “-D”]
CMD /usr/sbin/sshd -D
声明容器运行的服务端口,例如:
EXPOSE 80 443
设置环境内环境变量,例如:
ENV MYSQL_ROOT_PASSWORD 123456
ENV JAVA_HOME /usr/local/jdk1.8.0_45
拷贝文件或目录到镜像中,PS:如果是URL或压缩包,会自动下载或自动解压,例如:
ADD …
ADD html.tar.gz /var/www/html
ADD https://xxx.com/html.tar.gz /var/www/html
拷贝文件或目录到镜像中,用法同ADD,只是不支持自动下载和解压,例如:
COPY ./start.sh /start.sh
启动容器时执行的Shell命令,同CMD类似,只是由ENTRYPOINT启动的程序不会被docker run命
令行指定的参数所覆盖,而且这些命令行参数会被当作参数传递给ENTRYPOINT指定指定的程序。
ENTRYPOINT ["/bin/bash", “-C”, “/start.sh”]
ENTRYPOINT /bin/bash -C ‘/start.sh’
PS:Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效。
指定容器挂载点到宿主机自动生成的目录或其他容器,例如:
VOLUME ["/var/lib/mysql"]
PS:一般不会在Dockerfile中用到,更常见的还是在docker run的时候指定-v数据卷。
为RUN、CMD、ENTRYPOINT以及COPY和AND设置工作目录,例如:
WORKDIR /data
mkdir -p /export/docker/jdk8
cd /export/docker/jdk8/
vi Dockerfile
#依赖镜像名称和id
FROM centos:latest
#指定镜像创建者信息
MAINTAINER ITCAST
#切换工作目录
WORKDIR /usr
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把java添加到容器中
ADD jdk-8u221-linux-x64.tar.gz /usr/local/java
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_221
ENV JAR_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
docker build -t=‘jdk1.8’ .
注意后面的空格和点,不要省略,点表示当前目录
FROM centos:latest
MAINTAINER zhangjc
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
docker build -t mycentos:1.1 .
在 Docker 中,当我们执行 docker pull xxx 的时候 ,它实际上是从 registry.hub.docker.com
这个地址去查找,这就是Docker公司为我们提供的公共仓库。
在工作中,不可能把企业项目push到公有仓库进行管理。为了更好的管理镜像,Docker不仅
提供了一个中央仓库,同时允许搭建本地私有仓库。介绍registry、harbor两种私有仓库搭建。
docker run -di -v /opt/registry:/var/lib/registry -p 5000:5000 --name myregistry registry:2
Registry服务默认会将上传的镜像保存在容器的/var/lib/registry,将主机的/opt/registry目录挂载
到该目录,即可实现将镜像保存到主机的/opt/registry目录了。
现在通过push镜像到registry来验证一下。
docker tag nginx:latest localhost:5000/nginx:latest
docker push localhost:5000/nginx:latest
http://node1.itcast.cn:5000/v2/_catalog
docker pull localhost:5000/镜像名:版本号
docker pull localhost:5000/nginx:latest
首先需要有一个阿里云的账号
镜像仓库申请地址:https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
$ sudo docker login [email protected] registry.cn-hangzhou.aliyuncs.com
转自一只大数据路上的程序媛☀️
https://blog.csdn.net/weixin_48143996