生产环境,测试环境中,Docker 可以做什么
Docker 是容器管理工具
Docker是一个轻量级、便携式、与外界隔离的容器,也是一个可以在容器中很方便地构建、传输、运行应用的引擎。和传统的虚拟化技术不同的是,Docker
引擎并不虚拟出一台虚拟机,而是直接使用宿主机的内核和硬件,直接在宿主机上运行容器内应用。也正是得益于此,Docker
容器内运行的应用和宿主机上运行的应用性能差距几乎可以忽略不计。
但是 Docker 本身并不是一个容器系统,而是一个基于原有的容器化工具 LXC 用来创建虚拟环境的工具。类似 LXC 的工具已经在生产环境中使用多年,Docker 则基于此提供了更加友好的镜像管理工具和部署工具。
Docker 不是虚拟化引擎
Docker 第一次发布的时候,很多人都拿 Docker 和虚拟机 VMware、KVM 和 VirtualBox
比较。尽管从功能上看,Docker 和虚拟化技术致力于解决的问题都差不多,但是 Docker
却是采取了另一种非常不同的方式。虚拟机是虚拟出一套硬件,虚拟机的系统进行的磁盘 *** 作,其实都是在对虚拟出来的磁盘进行 *** 作。当运行 CPU
密集型的任务时,是虚拟机把虚拟系统里的 CPU
指令“翻译”成宿主机的CPU指令并进行执行。两个磁盘层,两个处理器调度器,两个 *** 作系统消耗的内存,所有虚拟出的这些都会带来相当多的性能损失,一台虚拟机所消耗的硬件资源和对应的硬件相当,一台主机上跑太多的虚拟机之后就会过载。而
Docker 就没有这种顾虑。Docker 运行应用采取的是“容器”的解决方案:使用 namespace 和 CGroup
进行资源限制,和宿主机共享内核,不虚拟磁盘,所有的容器磁盘 *** 作其实都是对 /var/lib/docker/
的 *** 作。简言之,Docker 其实只是在宿主机中运行了一个受到限制的应用程序。
从上面不难看出,容器和虚拟机的概念并不相同,容器也并不能取代虚拟机。在容器力所不能及的地方,虚拟机可以大显身手。例如:宿主机是
Linux,只能通过虚拟机运行 Windows,Docker 便无法做到。再例如,宿主机是 Windows,Windows 并不能直接运行
Docker,Windows上的 Docker 其实是运行在 VirtualBox 虚拟机里的。
Docker 使用层级的文件系统
前面提到过,Docker 和现有容器技术 LXC 等相比,优势之一就是 Docker 提供了镜像管理。对于 Docker
而言,镜像是一个静态的、只读的容器文件系统的快照。然而不仅如此,Docker
中所有的磁盘 *** 作都是对特定的Copy-On-Write文件系统进行的。下面通过一个例子解释一下这个问题。
例如我们要建立一个容器运行 JAVA Web 应用,那么我们应该使用一个已经安装了 JAVA 的镜像。在
Dockerfile(一个用于生成镜像的指令文件)中,应该指明“基于 JAVA 镜像”,这样 Docker 就会去 Docker Hub
Registry 上下载提前构建好的 JAVA 镜像。然后再 Dockerfile 中指明下载并解压 Apache Tomcat 软件到 /opt/tomcat
文件夹中。这条命令并不会对原有的 JAVA 镜像产生任何影响,而仅仅是在原有镜像上面添加了一个改动层。当一个容器启动时,容器内的所有改动层都会启动,容器会从第一层中运行 /usr/bin/java
命令,并且调用另外一层中的 /opt/tomcat/bin
命令。实际上,Dockerfile 中每一条指令都会产生一个新的改动层,即便只有一个文件被改动。如果用过 Git
就能更清楚地认识这一点,每条指令就像是每次 mit,都会留下记录。但是对于 Docker
来说,这种文件系统提供了更大的灵活性,也可以更方便地管理应用程序。
我们Spantree的团队有一个自己维护的含有 Tomcat 的镜像。发布新版本也非常简单:使用 Dockerfile
将新版本拷贝进镜像从而创建一个新镜像,然后给新镜像贴上版本的标签。不同版本的镜像的不同之处仅仅是一个 90 MB 大小的 WAR
文件,他们所基于的主镜像都是相同的。如果使用虚拟机去维护这些不同的版本的话,还要消耗掉很多不同的磁盘去存储相同的系统,而使用 Docker
就只需要很小的磁盘空间。即便我们同时运行这个镜像的很多实例,我们也只需要一个基础的 JAVA / TOMCAT 镜像。
Docker 可以节约时间
很多年前我在为一个连锁餐厅开发软件时,仅仅是为了描述如何搭建环境都需要写一个 12 页的 Word 文档。例如本地 Oracle
数据库,特定版本的
JAVA,以及其他七七八八的系统工具和共享库、软件包。整个搭建过程浪费掉了我们团队每个人几乎一天的时间,如果用金钱衡量的话,花掉了我们上万美金的时间成本。虽然客户已经对这种事情习以为常,甚至认为这是引入新成员、让成员适应环境、让自己的员工适应我们的软件所必须的成本,但是相比较起来,我们宁愿把更多的时间花在为客户构建可以增进业务的功能上面。
如果当时有 Docker,那么构建环境就会像使用自动化搭建工具 Puppet / Chef / Salt / Ansible
一样简单,我们也可以把整个搭建时间周期从一天缩短为几分钟。但是和这些工具不同的地方在于,Docker
可以不仅仅可以搭建整个环境,还可以将整个环境保存成磁盘文件,然后复制到别的地方。需要从源码编译 Nodejs 吗?Docker
做得到。Docker 不仅仅可以构建一个 Nodejs 环境,还可以将整个环境做成镜像,然后保存到任何地方。当然,由于 Docker
是一个容器,所以不用担心容器内执行的东西会对宿主机产生任何的影响。
现在新加入我们团队的人只需要运行 docker-pose up
命令,便可以喝杯咖啡,然后开始工作了。
Docker 可以节省开销
当然,时间就是金钱。除了时间外,Docker 还可以节省在基础设施硬件上的开销。高德纳和麦肯锡的研究表明,数据中心的利用率在 6% -
12% 左右。不仅如此,如果采用虚拟机的话,你还需要被动地监控和设置每台虚拟机的 CPU 硬盘和内存的使用率,因为采用了静态分区(static
partitioning)所以资源并不能完全被利用。。而容器可以解决这个问题:容器可以在实例之间进行内存和磁盘共享。你可以在同一台主机上运行多个服务、可以不用去限制容器所消耗的资源、可以去限制资源、可以在不需要的时候停止容器,也不用担心启动已经停止的程序时会带来过多的资源消耗。凌晨三点的时候只有很少的人会去访问你的网站,同时你需要比较多的资源执行夜间的批处理任务,那么可以很简单的便实现资源的交换。
虚拟机所消耗的内存、硬盘、CPU 都是固定的,一般动态调整都需要重启虚拟机。而用 Docker 的话,你可以进行资源限制,得益于
CGroup,可以很方便动态调整资源限制,让然也可以不进行资源限制。Docker
容器内的应用对宿主机而言只是两个隔离的应用程序,并不是两个虚拟机,所以宿主机也可以自行去分配资源。
Docker 有一个健壮的镜像托管系统
前面提到过,这个托管系统就叫做 Docker Hub Registry。截止到 2015年4月29日,互联网上大约有 14000
个公共的 Docker,而大部分都被托管在 Docker Hub 上面。和 Github 已经很大程度上成为开源项目的代表一样,Docker
官方的 Docker Hub 则已经是公共 Docker 镜像的代表。这些镜像可以作为你应用和数据服务的基础。
也正是得益于此,你可以随意尝试最新的技术:说不定有些人就把图形化数据库的实例打包成了 Docker 镜像托管在上面。再例如
Gitlab,手工搭建 Gitlab 非常困难,译者不建议普通用户去手工搭建,而如果使用 Docker
Gitlab,这个镜像则会五秒内便搭建完成。再例如特定 Ruby 版本的 Rails 应用,再例如 Linux 上的 NET
应用,这些都可以使用简单的一条 Docker 命令搭建完成。
Docker 官方镜像都有 official 标签,安全性可以保证。但是第三方镜像的安全性无法保证,所以请谨慎下载第三方镜像。生产环境下可以只使用第三方提供的 Dockerfile 构建镜像。
Docker Github 介绍:5 秒内搞定一个 Gitlab
关于 Linux 上的 NET 应用和 Rails 应用,将会在以后的文章中做详细介绍。
Docker 可以避免产生 Bug
Spantree 一直是“固定基础设置”(immutable
infrastructure)的狂热爱好者。换句话说,除非有心脏出血这种漏洞,我们尽量不对系统做升级,也尽量不去改变系统的设置。当添加新服务器的时候,我们也会从头构建服务器的系统,然后直接将镜像导入,将服务器放入负载均衡的集群里,然后对要退休的服务器进行健康检查,检查完毕后移除集群。得益于
Docker 镜像可以很轻松的导入导出,我们可以最大程度地减少因为环境和版本问题导致的不兼容,即便有不兼容了也可以很轻松地回滚。当然,有了
Docker,我们在生产、测试和开发中的运行环境得到统一。以前在协同开发时,会因为每个人开发的电脑配置不同而导致“在我的电脑上是能运行的,你的怎么不行”的情况,而如今
Docker 已经帮我们解决了这个问题。
Docker 目前只能运行在 Linux 上
前面也提到过,Docker 使用的是经过长时间生产环境检验的技术,虽然这些技术已经都出现很长时间了,但是大部分技术都还是 Linux
独有的,例如 LXC 和 Cgroup。也就是说,截止到现在,Docker 容器内只能在 Linux 上运行 Linux
上的服务和应用。Microsoft 正在和 Docker 紧密合作,并且已经宣布了下一个版本的 Windows Server 将会支持
Docker 容器,并且命名为 Windows Docker,估计采用的技术应该是Hyper-V
Container,我们有望在未来的几年内看到这个版本。
Docker是一个为开发人员和系统管理员开发、迁移和运行应用程序的平台。应用程序通过Docker打包成DockerImage后,可以实现统一的方式来下载、启动、扩展、删除和迁移,这样方便了应用程序的部署和运维。本文将介绍如何在不同 *** 作系统平台上部署Docker环境的方法。信息Ubuntu:Docker刚推出的时候只支持Ubuntu,后来才一点点开始对其他平台的支持。所以在Ubuntu平台上部署Docker平台还是挺简单的。官方目前支持的版本有UbuntuTrusty1404(LTS)、UbuntuPrecise1204(LTS)、UbuntuSaucy1310。Docker要求64位的系统且内核版本至少为310(如果是Ubuntu1204LTS,则要求内核版本至少是313)。可以使用uname–r命令来确认当前系统的内核版本:$uname-r3110-15-generic可以使用以下命令来升级内核:$sudoapt-getupdate$sudoapt-getinstalllinux-image-generic-lts-trusty$sudoreboot之后就可以安装Docker了:$wget-qO-/boot2docker/osx-installer/releases/latest获得。安装完成后,Boot2Docker位于Applications文件夹。注:Boot2Docker目前只是作为开发工具发布,请不要将其应用在生产环境中。创建Boot2Docker虚拟机:$boot2dockerinit$boot2dockerstart$boot2dockershellinit显示或设置Docker客户端环境变量$boot2dockershellinit$eval"$(boot2dockershellinit)"最后验证安装是否成功:$dockerrunhello-worldWindows:Windows与MACOS相同,也需要安装Boot2Docker工具。安装文件可以在/boot2docker/windows-installer/releases/latest获得。Windows版的Boot2Docker在启动时会自动确认环境变量,因此可以直接验证安装是否成功:$dockerrunhello-world。
测试环境和生产环境能互相转换么大家做etl任务分测试环境和生产环境吗,各个环境之间怎么切换呢?
一般分 开发,测试,uat,生产环境。切换的话先导出资源库,在导入即可。
怎样利用镜像将生产环境复制到测试环境通常企业不会直接导数据,而是复制整个生产环境作为测试环境,这样可以保证测试环境的配置和正式系统的一样。
目前测试环境规划时,通常有三套:联调测试环境、功能测试环境、准发布环境。为了更接近用户的真实环境,比如可能会用一些真实的数据来测试软件,这时重点覆盖的用例应当是重要的业务流程,用户最常用的功能,本次新加的功能,对公司利益影响最大的功能等等
运行环境和测试环境运行环境就是 机子支持软件的条件 比如说有些老游戏不能在windows环境下运行,只能在DOS下运行,就是说该游戏运行环境是DOS
同样测试环境就是能够支持软件进行测试的条件
开发环境跟测试环境于个人来说,通常是一样的。应为通常你就用同一部电脑。
具体说 我开发一个网站
开发环境:windows
tomcat
jdk
·
·
·
docker swarm 有在生产环境中用的企业吗Docker Swarm 是官方发布的集群容器管理工具。它的特点是:比较轻量级,无缝支持标准的docker API。 深入浅出Swarm 一文很清晰地讲解了它的架构和命令。本文从零开始搭建并管理一个swarm集群。
准备工作
我们需要先安装 virtualBox 和 vagrant 。通过vagrant来驱动virtualBox搭建一个虚拟测试环境。首先在本地任意路径新建一个空文件夹比如 test ,运行以下命令:
virtual box host
mkdir test
cd test
vagrant init minimum/ubuntu-trusty64-docker
vi Vagrantfile
里面应该有一句 configvmbox = "minimum/ubuntu-trusty64-docker" ,在它的下面添加如下几行代码,相当于给它分配三台虚拟机,一台叫做 manager ,它的IP是 1921683317 ;另两台叫做 node1 和 node2 ,它们的IP是 1921683318 和1921683319 。
Vagrantfile
configvmdefine "manager" do | host |
hostvmhostname = "manager"
hostvmneork "private_neork", ip: "1921683317"
end
configvmdefine "node1" do | host |
hostvmhostname = "node1"
hostvmneork "private_neork", ip: "1921683318"
end
configvmdefine "node2" do | host |
hostvmhostname = "node2"
hostvmneork "private_neork", ip: "1921683319"
end
这个vagrant镜像已经在ubuntu的基础上帮我们安装了docker,用起来很方便。然后分别在三个终端运行以下命令启动并连接三台虚拟机。
virtual box host terminal 1
vagrant up
vagrant ssh manager
virtual box host terminal 2
vagrant ssh node1
virtual box host terminal 3
vagrant ssh node2
搭建环境
想要让swarm管理node,首先得让docker daemon支持TCP。在三台虚拟机上运行以下命令:
manager and node1 and node2
sudo sh -c 'echo DOCKER_OPTS=\"-H tcp:0000:2375 -H unix:/var/run/dockersock\" >> /etc/default/docker'
sudo rm /etc/docker/keyjson # 免得我们用vagrant生成的docker id都一样,删掉了重启docker服务会自动生成一个新的
sudo service docker restart
学环境监测这专业可以做什么首先,是可以进 的环境监测站做环境监测工作,其次可以进环境治理公司当技术员(可以是环境监测,也可以其他工作),还可以进仪器公司当仪器设计、仪器检验、仪器应用、仪器售后、仪器咨询、仪器销售,可以进化工厂当化验员等等。
搭建windinws测试环境和linux测试环境有什么区别没明白你想做什么,如果是应用程序测试环境,那安装linux系统,部署应用就行了,如果是测试数据库,就安装数据库软件
相关步骤说明如下
(1) 开发。根据需求开发应用程序。
(2) 编写Dockerfile文件,Dockerfile是由一系列命令和参数组成的脚本,用来构建Image。
(3) 创建自定义镜像,基于docker build 命令构建
(4) 定义docker-compse,用来定义和运行多个docker应用程序。
(5) 启动docker应用,docker run。
(6) 测试,基于容器进行厕所,随时部署或销毁。
(7) 部署或继续开发。
(1) FROM: 它妈是谁(基础镜像)
(2) RUN: 开始动起来(执行命令,可以多次)
(3) COPY: 复制文件目录
(4) ADD: COPY加强版,支持远程复制和解压
(5) WORKDIR: CD伪装者(设置当前工作目录)
(6) CMD: 执行配置命令,如果多个,仅仅执行最后一个
(7) ENTRYPOINT: 容器启动后执行
(8) ENV: 环境变量
(9) EXPOSE: 专业敲墙打洞(开放端口)
下载最近版的Docker for OS X Installer。 运行安装程序, 安装VirtualBox和Boot2Docker管理工具。 运行应用程序文件夹下的Boot2Docker应用: 或者手动初始化Boot2Docker,打开终端并运行: 1 2 3 $ boot2docker init $ boot2docker start $ export DOCKER_HOST=tcp://$(boot2docker ip 2>/dev/null):2375 一旦你初始化化好了一个虚拟机,你就能用boot2docker stop和boot2docker start来进行控制。 chasehong 翻译于 1年前 0人顶 顶 翻译的不错哦! 更新 下载最新版的Docker for OS X Installer 运行安装程序, 更新VirtualBox和Boot2Docker管理工具。 更新现有虚拟机,打开终端并运行: 1 2 3 $ boot2docker stop $ boot2docker download $ boot2docker start 运行Docker 在终端上跑一个“hello world” 的示例来测试Docker。启动虚拟机然后运行: 1 $ docker run ubuntu echo hello world 这样应该会下载ubuntu镜像并打印hello world。 容器端口跳转 最新版的boot2docker建立了一个仅有网络适配器的主机提供可以接入容器的端口。 如果你运行一个有公开端口的容器, 1 $ docker run --rm -i -t -p 80:80 nginx 然后你应该能用IP地址接入Nginx服务器: 1 $ boot2docker ip 通常,这个IP地址为19216859103,但是也可能被VirtualBox启用的DHCP修改。
本文主要针对docker来部署java程序的时候,常常会出现内存占有很大的问题,通过调整docker的配置来限制内存占用
测试环境下服务器的配置为24核64G内存,启动微服务,在没有进行内存限制的时候,我们通过 docker stats 命令查看一下微服务的内存占用,如下图
我们看一下Dockerfile文件的配置
对应的启动脚本 startsh 的配置如下:
我们再看一下docker-compose的配置
配置中都没有对docker内存以及jvm内存做任何限制,导致了我们docker容器启动,占用内存过大的问题
首先我们对java启动时jvm内存大小做个调整,增加jvm启动参数 -Xms1024M -Xmx1024M -Xmn256M -Xss256K
调整后的启动脚本 startsh 如下:
调整完jvm启动参数之后,重新启动容器,结果如下:
发现内存使用上已经根据我们调整的大小降了下来
到这里,问题基本解决,不过看到容器的内存限制还是62G,这样显然还是不合理的,我们也要对容器进行调整,调整方式有两种
直接指定容器最多使用 200M 物理内存和 200M swap。
其中mem_limit用于控制容器默认启动时会使用 1/16物理内存的现象,导致几个服就占满了全部内存。
v3版本中,配置如下:
注意 deploy 仅 docker deploy stack 生效
或使用 docker-compose --compatibility up 生效
配置完成之后,重启docker服务,如下图:
容器内存限制发生了变化,达到了我们的预期效果
1 JVM常用启动参数
2 如何限制docker容器的内存大小
3 在Docker Compose file 3下限制CPU与内存
就是在Docker容器中再次运行一个Docker服务
在一个容器中 *** 作Docker在CI工具中是很常见的, 如构建一个Docker镜像
但由于在容器中运行一个Docker服务会有各种问题, 如镜像文件存储, 嵌套的容器也并不容易维护, 后来便衍生出了另一种更实用的方案: 挂载主机上Docker服务的sock
这样将不会遇到嵌套副作用,并且将在多个调用之间共享构建缓存。
ps: 更多知识请阅读 docker 官方提及的这篇文章: do-not-use-docker-in-docker-for-ci
我接下来要写的也是如何使用它, 并记录我的使用场景
我有一个需求是这样的:
当某个镜像更新之后, 通知docker重新pull并部署 简单的来说就是当容器更新, 就自动运行
以实现更新部署
由于自己编写的程序也运行在Docker中, 而不是宿主机, 所有没办法直接执行以上命令, 这就需要Docker In Docker了
简单来说 你只需要这样:
然后 docker ps 就能看到 宿主机上 的所有容器
如我的就是
当然 这里的stackyaml文件需要在构建这个容器时添加进来 或者 挂载进来, 这肯定难不倒你
如果你要将这段CMD在你的程序中运行也十分简单:
写好程序之后你可以使用这个Dockfile构建你的镜像
而运行这个镜像的stackyaml文件需要配置挂载
你会看到我又挂载了docker文件夹, 这个无关紧要, 在后面的疑难杂症会说到这个问题
此参数是179版本之后新加的, 用于解决deploy不pull最新的镜像的问题 详情看这个ISSUE:
force docker deploy to pull new images
私有仓库必须登录才有访问权限, 所以需要在宿主机上先login, 登录成功后会发现在 ~/docker有新生成的 配置文件
, 其中存储了认证所需要的信息 但在Docker容器中拿不到这个信息所以就会报错
解决办法是将配置文件挂载进容器
问题描述:
网络结构如下:
客户端 -> 服务器上的Nginx容器 (反代)-> 应用程序
在Nginx中配置了
在应用程序中得到">
以上就是关于生产环境,测试环境中,Docker 可以做什么全部的内容,包括:生产环境,测试环境中,Docker 可以做什么、基于docker的持续开发流程、如何在mac上安装docker等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)