当前位置: 首页 > news >正文

docker实战

2019独角兽企业重金招聘Python工程师标准>>> hot3.png


Docker简介

  • Docker 最初 dotCloud 公司内部的一个业余项目

  • Docker 基于 Go 语言

  • Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案

  • Docker 的基础是 Linux 容器(LXC)等技术

  • Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多

  • Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器

  • 容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。

  • 容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。

      打开翻译君输入Docker 结果显示码头工人,没错!码头工人搬运的是集装箱,那么今天要讲的Docker其操作的也是集装箱,这个集装箱就静态而言就是一个应用镜像文件,就动态而言,就是一个容器。

149c8d0ff9c30bbea949dfb64e8d13748fd.jpg

       Docker从狭义上来讲就是一个进程,从广义上来讲是一个虚拟容器,其实更专业的叫法是应用容器( Application Container ),Docker进程和普通的进程没有任何区别,它就是一个普通的应用进程。不过是用来操作镜像文件的。所以Docker进程+构建的应用镜像文件就等于Docker容器。本文所有讲的Docker都是指Docker容器哦。

注意 : 

当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:

 

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载

  • 利用镜像创建并启动一个容器

  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层

  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去

  • 从地址池配置一个 ip 地址给容器

  • 执行用户指定的应用程序

  • 执行完毕后容器被终止

 

可以利用 docker start 命令,直接将一个已经终止的容器启动运行。

构建企业级Docker虚拟化平台实战

  1. 重点剖析虚拟化和云计算概念;
  2. 分析Docker虚拟化的概念和原理;
  3. 从0开始实战Docker虚拟化平台;
  4. 基于Docker构建Nginx WEB服务器和CentOS虚拟机;
  5. 基于开源监控软件Cadvisor监控Docker云主机。

 

1、虚拟化技术的概念

     虚拟化,是目前比较火爆的技术,用于将物理资源转变为逻辑上可以管理的资源,以打破物理结构之间的壁垒,计算元件运行在虚拟的设备上,而不是真实的设备上;

      虚拟化的原理,虚拟化的底层是要进行虚拟化的物理机器,基于虚拟化技术将物理机虚拟生成N个虚拟机资源,应用程序、软件(Nginx、Apache、Tomcat、Redis、Memcached等)运行在虚拟机中;

     虚拟化的意义,虚拟化的技术不单单是将某台物理机虚拟生成N台虚拟机,更广义的含义是将多组物理机资源转变为逻辑资源,同时可以实现统一的资源管理和调度分配;

      虚拟化最终的目的,实现高配物理机硬件资源的合理的利用,将物理资源最大化的使用,不浪费任何的资源,淘汰一些效率比较低的服务器硬件,保证IT信息高速的发展;

        虚拟化技术,主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件资源。

     docker与传统虚拟化(KVM,XEN等)对比:

     Docker容器是在操作系统层面上实现虚拟化,直接复制本地主机的操作系统,而传统方式则是在硬件的基础上,虚拟出自己的系统,再在系统上部署相关的    APP应用。

 

假设公司需求,需要部署100个Nginx服务,有如下的方案:

采购100台低配物理机,每台物理机部署一个Nginx服务;

采购10台高配物理机,每台物理机虚拟10台虚拟机(配置同低配物理机),每个虚拟机部署一个Nginx服务(每个虚拟机部署一个WEB服务)(企业推荐)

      Docker虚拟化技术,三个概念:Docker镜像,Docker容器,Docker仓库;

      Docker镜像Docker images类似ISO镜像文件,静止的,不能被修改,一个模板文件;就类似于VM虚拟机里面的快照,但是可比快照轻量化多了。通过ID或者易识别的名字+tag来确认唯一的目标镜像。ImagesID是一个64位的字符,但是一般我们都是使用前面12位就足够区别了。

      镜像是分层的,有基础镜像,仅仅包含操作系统,比如centos镜像;有中间件镜像,比如redis等数据库镜像;最后是应用镜像,就是指具体的应用服务了,应用镜像可以非常丰富,随时可以发布,这三者之间依次叠加。

      使用 Docker构建镜像的时候,每一个命令都会在前一个命令的基础上形成一个新镜像层。如下图,基础镜像就是centos镜像,中间件镜像就是两个红色圈,应用镜像就是紫色圈。其中redis+centos这样叠加组合的中间件镜像就可以供A服务或者B服务使用,这样叠加组合更加灵活。仍和一种镜像都可以从Docker hub公共仓库中拉取。

3e9a65f945dccc4862d7e47bb8cdf9c28ba.jpg

      Docker容器Docker containers,基于Docker镜像运行的实体,类似程序和进程的关系,进程是程序(软件)运行的实体;从镜像中创建容器,这如同从快照中创建虚拟机;      打个比方,你首先下载了一个Ubuntu的镜像,然后又安装mysql和Django应用及其依赖,来完成对它Ubutun镜像的修改,非常完美应用镜像生成了

       Docker容器,基于Docker镜像运行后的实体,类似程序和进程的

       镜像就生成一个容器。容器启动之后就会运行Django服务了。

411758e3257418832cea850905b1aad919d.jpg

       容器就是一个个独立的封闭的集装箱,但是也需要对外提供服务的,所以Docker允许公开容器的特定端口,在启动Docker的时候,我们就可以将容器的特定端口映射到宿主机上面的任意一个端口,所以,如果几个服务都需要80端口,那么容器的对外端口是80,但是映射到宿主机上面就是任意端口,就不会产生冲突,所以就不需要通过代理来解决冲突。容器对外端口与宿主机的端口映射可以通过下面的命令来完成。

启动docker容器
 docker run -d -p 2222:22 --name 容器名 镜像名
 -d 守护容器,就是后台运行,退出命令窗口容器也不会停止
 -it 交互式容器 退出命令窗口容器就停止运行了
 -p宿主机端口和容器端口映射
 8081:80 宿主机端口:容器公开的端口

09c460a187370a5e010fc38b026130a80fe.jpg

 

       Docker仓库Docker registeries,存储镜像的仓库,存储镜像的地方,分为公共仓库(Public)、私有仓库(Private);公有仓库docker hub提供了非常多的镜像文件,这些镜像直接拉取下来就可以运行了,你也可以上传自己的镜像到docker hub上面。同时也可以自己搭建私有仓库用于团队项目管理。

Docker的生命周期

b0f0ef135d2f164d15aa11ad7e61b5cbbfb.jpg

1:开发构建镜像并将镜像push到Docker仓库;

2:测试或者运维从Docker仓库拷贝一份镜像到本地;

3:通过镜像文件开启Docker容器并提供服务。

Docker特点

1:构建容易分发简单;

2:隔离应用解除依赖;

3:快速部署测完就销。

Docker与传统虚拟机区别

7e4dee2abbd386b0830c9328557f21b8ff7.jpg

     VM 的 Hypervisor 需要实现对硬件的虚拟化,并且还要搭载自己的操作系统,其中虚拟机操作系统占用内存是比较大的,一个操作系统有好几个G,自然在启动速度和资源利用率以及性能上有非常大的开销

          Docker 应用容器相对于 VM 有以下几个优点:

1:启动速度快,容器启动本质就是一个开启一个进程而已,因此都是秒启,而 VM 通常要更久;

2:资源利用率高,一台普通 PC 可以跑成百上千个容器,你跑十个 VM 试试;

3:性能开销小, VM 通常需要额外的 CPU 和内存来完成 OS 的功能,这一部分占据了额外的资源。

 

运行docker

       Docker 容器只是一个运行于宿主操作系统host OS上的应用进程,所以你需要一个镜像来运行它Docker 镜像以进程的方式运行时就叫做 Docker 容器。你可以加载本地 Docker 镜像,也可以从 Docker Hub 上下载。Docker Hub 是一个提供公有和私有镜像来进行拉取pull操作的集中仓库。官方的 Docker Hub 位于 hub.docker.com。 当你指示 Docker 引擎运行容器时,它会首先搜索本地镜像,如果没有找到,它会从 Docker Hub 上拉取相应的镜像。

     运行一个 Apache web 服务器的 Docker 镜像,比如 httpd 进程。你需要运行 docker container run 命令。旧的命令为 docker run, 但后来 Docker 添加了子命令部分,所以新版本支持下列命令:

e062e67768619d6ff8d34403e3f58c7d4f1.jpg

Docker 的 run 命令将镜像名作为强制参数,另外还有很多可选参数。常用的参数有:

  • -d:从当前 shell 脱离容器

  • -p X:Y:绑定容器的端口 Y 到宿主机的端口 X

  • --name:命名你的容器。如果未指定,它将被赋予随机生成的名字

  • -e:当启动容器时传递环境编辑及其值

    通过上面的图片, 将 httpd 作为镜像名来运行容器。接着,本地镜像没有找到,Docker 引擎从 Docker Hub 拉取了它。注意,它下载了镜像 httpd:latest, 其中 :后面跟着版本号。如果你需要运行特定版本的容器,你可以在镜像名后面注明版本名。如果不提供版本名,Docker 引擎会自动拉取最新的版本。

输出的最后一行显示了你新运行的 httpd 容器的唯一 ID。

查看 Docker 容器的历史纪录

      在第一步我们使用了 -d 参数来将容器,在它一开始运行的时候,就从当前的 shell 中脱离出来。在这种情况下,我们不知道容器里面发生了什么。所以为了查看容器的历史纪录,Docker 提供了 logs 命令。它采用容器名称或 ID 作为参数。

db597cabd43b4a50828792cf808a878a40b.jpg

这里使用了容器名称作为参数。你可以看到httpd 容器中与 Apache 相关的历史纪录。

确定 Docker 容器的进程

    容器是一个使用宿主资源来运行的进程。这样,你可以在宿主系统的进程表中定位容器的进程。让我们在宿主系统上确定容器进程。

 

      Docker 使用著名的 top 命令作为子命令的名称,来查看容器产生的进程。它采用容器的名称或 ID 作为参数。在旧版本的 Docker 中,只可运行 docker top 命令。在新版本中,docker top 和 docker container top 命令都可以生效。

01ecb3c1ac0866463a2170efa4fb3557b3e.jpg

在第一个输出中,列出了容器产生的进程的列表。它包含了所有细节,包括用户号uid、进程号pid,父进程号ppid、开始时间、命令,等等。这里所有的进程号你都可以在宿主的进程表里搜索到。这就是我们在第二个命令里做得。这证明了容器确实是宿主系统中的进程

停止 Docker 容器

采用容器名称或 ID 作为参数。

a60184254eaad09da74ea79a1df96211960.jpg

列出停止的或不活动的 Docker 容器

现在停止了容器,这时如果使用 ls 命令,它将不会出现在列表中。

a4816d6c80a0fd889e38a9c128b95f61bb1.jpg

在这种情况下,如果想要查看停止的或不活动的容器,你需要在 ls 命令里同时使用 -a 参数。

541957776c856a2ef9a54179f9b758c734c.jpg

在这种情况下,如果想要查看停止的或不活动的容器,你需要在 ls 命令里同时使用 -a 参数。

重新启动 Docker 容器

启动和运行的区别。当你运行一个容器时,你将启动一个全新的容器。当你启动一个容器时,你将开始一个已经停止并保存了当时运行状态的容器。它将以停止时的状态重新开始运行。

8f48d32d2f64334ca90f7820becbde3e7a7.jpg

移除 Docker 容器

     注意:不可以移除运行中的容器。移除之前需要先停止容器。你可以使用 -f 参数搭配 rm 命令来强制移除容器,但并不推荐这么做。

c0c77674703deb6573c4b031e2b000d8138.jpg

一旦移除了容器,即使再使用 ls -a 命令也查看不到容器了。

 

  1. 虚拟化技术进行分类,分为三大类:完全虚拟化、半虚拟化、轻量级虚拟化(Docker),虚拟化技术,分层抽象图:

b8e8d713393bba4c0375b55c17b4b71a4d9.jpg

      互联网主流的虚拟化技术:KVM、ESXI、HP-V、XEN、Docker、Virtual Box等,使用量最多:Docker、KVM、ESXI、。

       完全虚拟化技术:通过软件实现对操作系统的资源再分配,比较成熟,例如,KVM,virtualBOX.

       半虚拟化技术:是通过代码修改已有的系统,形成一种新的可虚拟化的系统,调用硬件资源去安装多个系统,整体速度上相对高一点,代表产品有Xen.

        轻量级虚拟化:Docker(介于完全虚拟化、半虚拟化之间)

     Docker技术的产物是Docker容器(集装箱),容器中存放各种依赖文件、库、应用软件,可以打包繁杂的库文件、依赖程序到容器中,可以方便迁移到其他的平台;

63c34fba159d2884aea87f288e3d498fc9c.jpg

1449b05e448e39479dfdd43cf058ec6e32b.jpg

  1. 传统虚拟化技术,如果想部署Nginx服务,必须基于底层硬件-VMM-GuestOS-Nginx服务;
  2. Docker虚拟化技术,如果想部署Nginx服务,必须基于底层硬件-VMM-Nginx服务;
  3. 虚拟化的用途(优势)快速分配资源、对服务器资源进行统一的调度和分配,可以做到弹性扩容和缩容。(比如:10台物理机--虚拟成100虚拟机)
  4. 虚拟化要求物理机的配置高,基于高配物理机生成N个虚拟机,京东线上虚拟机物理机配置:CPU 64C , MEN   256G   ,Disk   4T(RAID10),线上生成环境配置:2C4G40G;   4C8G40G;    8C16G100G;

例子:物理机8C16G,最多虚拟 :   7台+   1台4c      +1台2C           虚拟机 

      云计算和虚拟化有什么关系?虚拟化是云计算的基础,虚拟化是云计算组成部分,是云计算中负责虚拟化资源管理的模块。

 

2、Docker虚拟化概念

  1. Docker虚拟化技术类似集装箱打包技术,Docker最终的产物是Docker容器(集装箱);
  2. 基于Docker虚拟化技术,将各种依赖包、环境、系统统一打包成一个容器,将该容器便捷的迁移,例如内网打包环境,外网直接发布环境;
  3. 开发人员内网调试一套环境,非常复杂,系统涉及到很多依赖包、环境、系统,想要发布到线上,还需要在线上去调试环境,有了Docker技术之后,可以直接将内部的环境统一打包、集成;
  4. 下图为传统虚拟化方案:à需要部署Nginx,先部署OS系统,基于OS系统再部署Nginx;

0f18fa6869b7fef3a42172684a30b10ed19.jpg

 

    5、如下为Docker虚拟化方案:à需要部署Nginx,无需部署OS系统,基于Docker引擎直接部署Nginx;

489ebf12e86b92550e3769557b8437ebc89.jpg

 

3、0开始构建Docker虚拟化平台

  1. 如何构建企业级Docker虚拟化平台?有什么要求呢?
  2. 要求有一台物理机设备,同时要求物理机安装Linux操作系统,推荐CentOS,对Linux内核要求,官方3.8.x+;
  3. 生产环境的,推荐使用Linux内核3.10.0+,推荐的Linux操作系统CentOS7.3,对物理机的配置:CPU:16C,内存:32G,硬盘:600G;

79e35b1f70a14df71575c91f981e7bf7911.jpg

  4、基于CentOS7.x安装部署Docker平台,

setenforce 0               #先关闭防火墙

yum install epel-release docker* -y

   5、基于CentOS6.x安装部署Docker平台,如果系统版本低于CentOS6.5话,需要先升级内核,

然后运行命令:

setenforce 0               #先关闭防火墙

rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm           #扩展源

yum install epel-release lxc docker-io device-map* cgroup lxc  libcgroup device-mapper-event-libs device-mapper* -y

              1、启动docker 容器命令:/etc/init.d/docker start

              2、查看docker进程 :ps -ef | grep docker 

              3、启动nginx容器命令:docker run -itd nginx = /usr/local/nginx/sbin/nginx

              4、进入nginx容器指令:docker exec -it b43031c78a5d /bin/bash

  6、Docker软件引擎安装完毕,重启Docker服务,service docker restart

edff0d400a6e1bc536c9523835b048196ed.jpg

  7、同时查看Docker引擎的版本,客户端和服务端的版本信息:

072870e2b1430982dcb828abe995bc93580.jpg

注意:Docker启动容器,必须先有镜像,镜像好比是一个模板!容器

67fe429812d5f94c68e469a6e89bd53c69d.jpg

8、启动Docker引擎独立服务,指令如下:

service  docker  restart                              #用于CentOS6.x

systemctl restart docker.service              #用于CentOS7.x

ps -ef | grep docker                    #通用CentOS6和7;查看容器是否启动

 

9、从官网仓库搜索并且下载镜像的指令如

              docker search nginx 搜索外网仓库Nginx镜像;

              docker pull docker.io/nginx 下载外网仓库Nginx镜像;

              docker images 查看本地服务器镜像列表;

 

10、从Docker官网下载Nginx、CentOS镜像,下载之前先搜索镜像:docker search nginx 或者docker search centos;

  1. 基于Docker镜像运行和启动一个Docker Nginx容器,执行如下指令:

                        docker  run  -itd  docker.io/nginx

    2.如何访问Docker Nginx容器的80服务呢?首先获取Docker容器的IP地址:docker inspect 容器ID |grep -i ipaddr,如图所示:

b7d407237d43a81d0d7faf17d4a808019b8.jpg

开启一百台nginx服务,从20台到120台,端口从6020到60120,启动80端口的nginx服务。

#for i in 'seq 20  120';do docker run -itd -p 60$i:80 docker.io/nginx;done

c873d1a936d89af376b89506a3422fa920a.jpg

进入容器之后,,使用ifconfig   查看IP地址。下面有docker的IP地址

启动22端口,开启远程连接。

#/etc/init.d/ssh restart 

#netstat -lntp                            #查看22端口有没有开启

在另一台虚拟机上登录,命令:ssh -l root 172.17.0.1

 

 

参考链接:https://mp.weixin.qq.com/s/lMVzelHgm2neLKuUQ91r7g

https://mp.weixin.qq.com/s/LeaYn-CUeu3wognse1fSzw

 

更多操作链接 : https://mp.weixin.qq.com/s/xjkW8O-YasgCNJeX2jR4ZQ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/u/3803405/blog/1833105

相关文章:

  • Hive 部署
  • Openstack 之 Prometheus 监控
  • python3 异步模块asyncio
  • 紫书 习题 11-10 UVa 12264 (二分答案+最大流)
  • 大数据经典学习路线(及供参考)
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • MySQL数据库运维之数据恢复
  • 函数防抖和函数节流
  • 持续开放,腾讯TARS、TSeer助力Linux建设开源社区
  • 探索 JS 中的模块化
  • 跟我一起学docker(四)--容器的基本操作
  • Ubuntu安装jdk
  • python全栈开发 * 19 面向对象 知识点汇总 * 180701
  • replace 使用正则
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • 【译】JS基础算法脚本:字符串结尾
  • 《剑指offer》分解让复杂问题更简单
  • 【Amaple教程】5. 插件
  • Centos6.8 使用rpm安装mysql5.7
  • cookie和session
  • ES6系统学习----从Apollo Client看解构赋值
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • js面向对象
  • Mysql优化
  • Nodejs和JavaWeb协助开发
  • Promise面试题2实现异步串行执行
  • spring boot 整合mybatis 无法输出sql的问题
  • Vue小说阅读器(仿追书神器)
  • Vue学习第二天
  • 当SetTimeout遇到了字符串
  • 复杂数据处理
  • 排序(1):冒泡排序
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 原生Ajax
  • const的用法,特别是用在函数前面与后面的区别
  • postgresql行列转换函数
  • 交换综合实验一
  • ​iOS安全加固方法及实现
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (06)Hive——正则表达式
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (二)windows配置JDK环境
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (四)c52学习之旅-流水LED灯
  • (算法)求1到1亿间的质数或素数
  • (转)Oracle存储过程编写经验和优化措施
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .gitignore文件—git忽略文件
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET Remoting学习笔记(三)信道
  • .NET/C# 的字符串暂存池
  • .NET处理HTTP请求
  • @private @protected @public