Docker理论与实战

Docker出现的背景:

  • 多人操作同一台服务器时会相互影响。
  • A开发创建了OpenJDK用来跑机器学习算法,B开发跑Tomcat需要用JDK。
  • 开发/测试/现场等多环境兼容。
  • 解决环境依赖的问题。

Docker基本概念:
Docker是一种应用容器引擎,Docker的仓库思想与Git是相同的。
主要有如下几个概念:

  • 引擎: 创建和管理容器的工具,通过读取镜像来生成容器,并负责从仓库拉取镜像或提交镜像到仓库中;
  • 镜像: 类似于虚拟机镜像,一般由一个基本操作系统环境和多个应用程序打包而成,是创建容器的模板;
  • 容器: 可看作一个简易版的Linxu系统环境(包括root用户权限、进程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒子;
  • 仓库: 集中存放镜像文件的场所,分为公共仓库和私有仓库,目前最大的公共仓库是官方提供的Docker Hub,此外国内的阿里云、腾讯云等也提供了公共仓库;
  • 宿主机: 运行引擎的操作系统所在服务器。

Docker基础操作系统:
以下系统镜像分别适用于不同的场景:

  • BusyBox: 一个极简版的Linux系统,集成了100多种常用Linux命令,大小不到2MB,被称为“Linux系统的瑞士军刀”,适用于简单测试场景;
  • Alpine: 一个面向安全的轻型Linux发行版系统,比BusyBox功能更完善,大小不到5MB,是官网推荐的基础镜像,由于其包含了足够的基础功能和体积较小,在生产环境中最常用;
  • Debian/Ubuntu: Debian系列操作系统,功能完善,大小约170MB,适合研发环境;
  • CentOS/Fedora: 都是基于Redhat的Linux发行版,企业级服务器常用操作系统,稳定性高,大小约200MB,适合生产环境使用。

Docker持久化存储方式:
在容器里增加、删除或修改文件,其实都是对可写层里的文件副本进行了操作。在容器关闭后,该可写层也会被删除,对容器的所有修改都会失效,因此需要解决容器内文件持久化的问题。Docker提供了两种方案来实现:

  • 本地存储

把宿主机文件系统里的目录映射到容器内的目录。如此一来,容器内在该目录里创建的所有文件,都存储到宿主机的对应目录中,在关闭容器后,宿主机的目录依然存在,再次启动容器时还能读取到之前创建的文件,因此实现了容器的文件持久化。
当然同时要明白,如果是对镜像自带文件进行了修改,由于镜像是只读的,该修改操作无法在关闭容器时保存下来,除非在修改了文件后构建一个新的镜像。

  • 网络共享存储

把多台宿主机的磁盘目录通过网络联合为共享存储,然后把共享存储中的特定目录映射给特定的容器。这样容器在重启时,还是能读取到关闭前创建的文件。生产环境中常用NFS作为共享存储方案。

Docker镜像制作方法

  • 通过正在运行的容器生成新镜像

当一个容器在运行时,在里面所有的修改都会体现在容器的可写层,Docker提供了commit命令,可以把正在运行的容器,叠加上可写层的修改内容,生成一个新镜像。如上图所示,在容器里新安装Spark组件的,如果关闭容器,Spark组件会随着可写层的消失而消失,如果在关闭容器之前使用commit命令生成新镜像,那么使用新镜像启动为容器时,容器里就会包含Spark组件。
这种方式比较简单,但无法直观的设置环境变量、监听端口等内容,适合在简单使用的场景运用。

  • 通过Dockerfile文件来生成新镜像

Dockerfile是一个定义了镜像创建步骤的文件,Docker引擎通过build命令读取Dockerfile,按定义的步骤来一步步构造镜像。在研发和实施环境中,通过Dockerfile 创建容器是主流做法。下面是一个Dockerfile的例子:
FROM ubuntu/14.04                                # 基础镜像
MAINTAINER guest                                 # 制作者签名
RUN apt-get install openssh-server -y            # 安装ssh服务
RUN mkdir /var/run/sshd                          # 创建目录
RUN useradd -s /bin/bash -m -d /home/guest guest # 创建用户
RUN echo ‘guest:123456’| chpasswd                # 修改用户密码
ENV RUNNABLE_USER_DIR /home/guest                # 设置环境变量
EXPOSE 22                                        # 容器内默认开启的端口
CMD ["/usr/sbin/sshd -D"]                        # 启动容器时自动启动ssh服务
Docker引擎可以根据以上Dockerfile定义的步骤,构造出一个带有ssh服务的Ubuntu镜像。

Docker使用场景:
1、作为轻量级虚拟机使用:
使用CentOS等系统镜像创建容器,当作虚拟机来使用,相比于传统虚拟机,启动速度更快,资源占用更少,单机可以启动大量的操作系统容器,方便进行各种测试;
2、作为云主机使用:
在公司内部,甚至可以取代VMWare这样的虚拟机管理平台,使用Docker容器作为云主机使用;
3、应用服务打包
在Web应用服务开发场景,可以把Java运行环境、Tomcat服务器打包为一个基础镜像,在修改了代码包后加入到基础镜像来构建一个新的镜像,能很方便的升级服务和控制版本;
4、容器云平台CaaS
Docker的出现,使得很多云平台供应商开始提供容器云的服务,简称容器即服务CaaS;IaaS(基础设施即服务)主要的用户是企业的系统管理员和运维人员;PaaS(平台即服务)其主要的用户是企业开发人员。SaaS(软件即服务)主要面对的是普通的用户。CaaS(容器即服务)能够对计算资源做到更高效的利用。
5、持续集成和持续部署
互联网行业提倡敏捷开发,持续集成部署CI/CD便是最典型的开发模式。使用Docker容器云平台,就能实现从代码编写完成推送到Git/SVN后,自动触发后端CaaS平台将代码下载、编译并构建成测试Docker镜像,再替换测试环境容器服务,自动在Jenkins或者Hudson中运行单元/集成测试,测试通过后,马上就能自动将新版本镜像更新到线上,完成服务升级。整个过程全自动化,一气呵成,最大程度地简化了运维,而且保证线上、线下环境完全一致,而且线上服务版本与Git/SVN发布分支也实现统一。
6、解决微服务架构的实施难题
基于Spring Cloud这样的微服务框架,能够实现微服务的管理,但微服务本身还是需要运行在操作系统上。一个采用微服务架构开发的应用中,微服务的个数往往很多,这就导致了一台服务器上往往需要启动多个微服务来提高资源的利用率,而微服务本身可能就只能兼容部分操作系统,这就导致了就算有大量的服务器资源(操作系统可能不一样),但由于微服务本身与操作系统可能相关,就不能做到让微服务在任意服务器上运行,这就带来了资源的浪费和运维的困难。利用Docker容器的环境隔离能力,让微服务运行在容器内,就能够解决以上所说的问题。
7、执行临时任务:
有时候用户只是想执行一次性的任务,但如果用传统虚拟机的方式就要搭建环境,执行完任务后还要释放资源,比较麻烦。使用Docker容器就可以构建临时的运行环境,执行完任务后关闭容器即可,方便快捷。
8、多租户环境:
利用Docker的环境隔离能力,可以为不同的租户提供独占的容器,实现简单而且成本较低。


总结
Docker的技术并不神秘,只是整合了前人积累的各种成果实现的应用级的容器化技术,它利用各种Linux发行版中使用了版本兼容的内核容器化技术,来实现镜像一次构建到处运行的效果,并且利用了容器内的基础操作系统镜像层,屏蔽了实际运行环境的操作系统差异,使用户在开发应用程序时,只需确保在选定的操作系统和内核版本上能正确运行即可,几乎不需要关心实际的运行环境的系统差异,大大提高效率和兼容性。但随着容器运行得越来越多,容器管理将会称为另一个运维的难题,这时候就需要引入Kubernetes、Mesos或Swarm这些容器管理系统,后面有机会再介绍这些技术。

docker run --name tomcat -p 8800:8080 --restart=always -v /home/estsh/i3plus/container/tomcat/webapps:/usr/local/tomcat/webapps -v /home/estsh/i3plus/container/tomcat/logs:/usr/local/tomcat/logs -v /home/estsh/i3plus/container/tomcat/conf:/usr/local/tomcat/conf -d tomcat

-d表示后台运行
--name tomcat 别名叫tomcat
--restart=always

#查看进程ID
docker ps -a|grep tomcat
#停止
docker stop 6a91f287b6c6
#删除镜像
docker rm 6a91f287b6c6
#进入容器
docker exec -it dbmaster bash
#从主机复制到容器(容器里没有解压命令,需要直接拷贝源文件)
docker cp impp_i3_mes.sql dbmaster:/root/
#从容器复制到主机
docker cp dbmaster:/root/impp_i3_mes.sql /root/

#查看镜像启动日志
docker logs dbmaster

#使用docker-compose重启服务
docker-compose stop/start dbmaster

#停服务、删容器、自动从网上拉对应版本的 image  -d后台运行。去掉-d为实时显示,ctrl+z转为后台运行。

chmod 644 my.cnf
docker-compose stop dbmaster
docker rm dbmaster
docker-compose up -d dbmaster

#列出docker所有容器ip

docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)

#列出docker-compose所有容器ip

docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值