转载请注明出处:http://blog.csdn.net/gamer_gyt

博主微博:http://weibo.com/234654758

Github:https://github.com/thinkgamer


Docker江湖


写在前边的话




    在之前便想学习Docker技术了,可是一直没有机会,近期在做elk的一个项目,须要在一个不能连接外网的机器上安装各种环境,本来想一步步下载rpm包,进行安装,然而事实证明我太单纯,各种依赖包。搞的我头大,然后便想到了docker。一个能够装载环境和便于移植的小船。

环境介绍


本地 win10

VMware 虚拟机 安装的redhat 7.1 server版(模拟server环境)

redhat 7.1(server)上部署docker

在linux部署


安装的方法有非常多种。能够选择rpm包安装。也能够使用二进制包安装,不同的os 在线安装的方式也有所不同,我这是是基于redhat7.1进行安装的,其它的一些安装方式能够參考官网(https://docs.docker.com/

    我这里採用的是安装二进制包的形式:

1、内核版本号要求

查看内核版本号

[redhat@localhost ~]$ uname -r

3.10.0-229.el7.x86_64

官方建议不低于3.10.0

2、下载二进制包并解压

https://get.docker.com/builds/Linux/x86_64/docker-latest.tgz

tar -xvzf docker-latest.tar

3、载入到全局变量

mv docker/* /usr/bin/

4、关闭防火墙

避免一些不必要的麻烦

systemctl status firewalld (redhat查看防火墙状态)

systemctl stop firewalld (redhat临时关闭防火墙)

systemctl disable firewalld (redhat永久关闭防火墙)

systemctl enable firewalld (redhat打开防火墙)

5、启动服务

sudo dockerd &

6、測试

sudo docker run hello-world

会弹出来一系列看似正常的东东,然后就ok了

闲谈Docker


1、Docker是什么

Docker是一个诞生于2013年的开源项目,基于Go语言实现,遵从apache2.0协议。目标是实现轻量级的操作系统虚拟化解决方式,其基础是Linux容器(LXC)等技术。

    在LXC的基础上Docker进行了进一步的封装。让用户不须要去关心容器的管理,使得操作更为简便。用户操作Docker的容器就像操作一个高速轻量级的虚拟机一样简单。

    以下的图片比較了Docker和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化。直接复用本地主机的操作系统。而传统方式则是在硬件层面实现。

推荐一篇docker架构的文章,个人感觉不错:

    http://www.infoq.com/cn/articles/docker-source-code-analysis-part1/

2、为什么要使用Docker

1)、启动在秒级实现

Docker容器的启动能够在秒级实现,占用的资源也较少。其次对系统的资源利用率高,传统虚拟机方式执行10个不同的应用就要起10个虚拟机,而Docker仅仅要启动10个隔离的应用就可以。这些都决定的Docker容器的启动速度

2)、更高速的交付和部署

开发人员能够使用一个标准的镜像来构建一套开发容器,开发完毕之后。运维人员能够直接使用这个容器来部署代码。Docker能够高速创建容器,高速迭代应用程序。并让整个过程全程可见,使团队中的其它成员更easy理解应用程序是怎样创建和工作的。

Docker容器非常轻非常快!

容器的启动时间是秒级的,大量地节约开发、測试、部署的时间。

3)、更高效的虚拟化

Docker 容器的执行不须要额外的hypervisor支持,它是内核级的虚拟化。因此能够实现更高的性能和效率。

4)、更轻松的迁移和扩展

Docker 容器差点儿能够在随意的平台上执行,包含物理机、虚拟机、公有云、私有 云、个人电脑、server等。这种兼容性能够让用户把一个应用程序从一个平台直接迁移到另外一个。

5)、更简单的管理

使用Docker,仅仅须要小小的改动,就能够替代以往大量的更新工作。全部的改动都以增量的方式被分发和更新,从而实现自己主动化而且高效的管理。

6)、对照传统虚拟机总结

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为MB 一般为GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个

3、Docker的三个基本概念

  • 镜像(Image)

    Docker 镜像(Image)就是一个仅仅读的模板。

    比如:一个镜像能够包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户须要的其它应用程序。

    镜像能够用来创建 Docker 容器。

    Docker 提供了一个非常easy的机制来创建镜像或者更新现有的镜像。用户甚至能够 直接从其它人那里下载一个已经做好的镜像来直接使用。

  • 容器(Container)

    Docker 利用容器(Container)来执行应用。

    容器是从镜像创建的执行实例。

    它能够被启动、開始、停止、删除。每一个容器都是 相互隔离的、保证安全的平台。

    能够把容器看做是一个简易版的 Linux 环境(包含root用户权限、进程空间、用户 空间和网络空间等)和执行在当中的应用程序。

    *注:镜像是仅仅读的,容器在启动的时候创建一层可写层作为最上层。

  • 仓库(Repository)

    仓库(Repository)是集中存放镜像文件的场所。有时候会把仓库和仓库注冊服务 器(Registry)混为一谈,并不严格区分。实际上,仓库注冊server上往往存放着 多个仓库,每一个仓库中又包含了多个镜像。每一个镜像有不同的标签(tag)。

    仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

    最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。

    国内的公开仓库包含 时速云 、网易云 等。能够提供大陆用户更稳定高速的訪问。

    当然,用户也能够在本地网络内创建一个私有仓库(參考本文“私有仓库”部分)。

    当用户创建了自己的镜像之后就能够使用 push 命令将它上传到公有或者私有仓 库,这样下次在另外一台机器上使用这个镜像时候,仅仅须要从仓库上 pull 下来 就能够了。

    *注:Docker 仓库的概念跟 Git 相似,注冊server能够理解为 GitHub 这种托管服 务。

docker的基本操作


执行sudo docker –help(-h)能够看到docker所支持的命令,同一时候有其相应的解释

attach:       进入到正在执行的容器
build: 从Dockerfile构建镜像
commit: 容器更改之后创建新镜像
cp: 在容器和本地之间复制文件和文件夹
create: 创建一个新的容器
diff: 检查容器文件系统上的更改
events: 从server上获取实时事件
exec: 在正在执行的容器中执行命令
export: 将容器的文件系统导出为tar存档
history: 显示镜像的历史记录
images: 列出镜像
import: 从tar包导入创建新的文件系统镜像
info: 显示系统范围的信息
inspect: 返回容器,映像或任务的低级信息
kill: 杀死一个或者多个正在执行的容器
load: 载入一个打包好的镜像
login: 登录到docker的服务
logout: 退出docker服务
logs: 获取容器的日志
network: 管理docker的网络
node: 管理docker swarm节点
pause: 暂停一个或多个容器中的进程
port: 列出端口映射或者容器的特定映射
ps: 列出正在执行的容器(ps -a 列出正在执行和已经停止的容器)
pull: 从注冊表中载入一个镜像
push: 将镜像提交到注冊表中
rename: 重命名容器
restart: 又一次启动容器
rm: 删除一个或者多个容器
rmi: 删除一个或者多个容器
run: 在容器中执行命令
save: 将镜像保存成tar文件
search: 在docker 仓库中搜索镜像
service: 管理镜像服务
start: 启动一个或者多个已经停止的容器
stats: 显示容器资源使用的实时信息流
stop: 停止一个或者多个正在执行的容器
swarm: 管理docker swarm
tag: 将镜像保存在仓库中。也能够作为重命名使用
top: 显示容器的执行进程
unpause: 取消暂停一个或多个容器中的全部进程
update: 更新一个或者多个容器的配置
version: 显示docker版本号信息
volume: 管理docker卷
wait: 堵塞知道容器停止,然后打印推出代码

这里我们要注意几点问题:

1:start 和run的差别

run是依据现存的镜像启动一个新的容器。而start是開始一个停止的容器。即退出时是使用exit或者stop的

2:commit和save

这个意思就是每次对容器做一些改动之后。我们须要先提交到本地库。然后save成tar包以供其它使用,若不进行commit直接save的话,正在对容器所做的改变则不能save下来

3:export和save的差别

两者都是导出镜像为tar形式。可是export导出的文件要比save保存的小,原因是export导出的会丢失一些log信息和镜像的层信息,详细可參考:

http://www.server110.com/docker/201411/11213.html

Docker应用实例

1:docker部署ELK

需求分析:

将ELK封装在Docker中便于封装成成型的产品进行出售和转移

PS:因为Docker容器登录之后,进入的是root用户,而ELK不同意在root用户执行,所以这里我们新建了elk用户作为ELK的执行用户

1):执行一个ubuntu的容器

sudo docker pull ubuntu

sudo docker run -i -t ubuntu

以下是在docker容器中执行

2):创建elk用户的文件夹(root用户下进行)

mkdir /home/elk

3):新建elk用户和elk用户组

groupadd elk

useradd elk -g elk

4):给elk用户赋予password

passwd elk

5):安装ELK stack

參考:http://blog.csdn.net/gamer_gyt/article/details/52654263


2:docker部署rails服务环境

需求分析:

在一台联网的机器上安装docker,并在当中部署好rails服务环境,保存成tar,并load进另外一台没有网络的环境

PS:docker容器内执行一个操作系统,好多依赖的包都会缺少,这一点要注意

1):接着1中进行

2):安装git

apt-get install git

3):安装rbenv,并增加到环境变量

git clone https://github.com/rbenv/rbenv.git ~/.rbenv

echo ‘export PATH=”HOME/.rbenv/bin:PATH”’ >> ~/.bashrc

再把 eval “$(rbenv init -)” 写入.bashrc

使环境变量生效:

Source .bashrc

初始化

~/.rbenv/bin/rbenv init

type rbenv

4):安装ruby-build

git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

測试是否成功

rbenv install

5):安wget

apt-get install wget

6):安装其它一些依赖

apt-get install -y build-essential nodejs

apt-get install bzip2 libssl-dev libreadline-dev zlib1g-dev

7):安装ruby

rbenv install -l (查看支持安装的版本号)

rbenv install 2.3.0(以2.3.0为例)

此时应该是没有问题的,假设还有问题的话具详细情况定

8):安装rails

gem install rails

9):打包

提交到本地库

sudo docker commit containerID new_image_name

保存成tar包

sudo dockek save -o *.tar new_image_name

10):在断网的server执行

拷贝tar包到该server

sudo scp ubuntu_rails **.tar ip:/home/master

载入镜像

sudo docker load –input *.tar


3、ELK在Docker中的端口映射

需求分析:

elk部署之后,端口的訪问仅限于执行ELK的Docker容器,所以要建立端口映射将端口暴露给外部以供訪问

1):启动docker 指定端口,注意不能使部署docker的server和docker内所映射的端口一致

Es:9201-9200 kibana:5600-5601

sudo docker run -t -i -d -p 9201:9200 -p 5600:5601 ubuntu/rails:elk_ok(ubuntu/rails:elk_ok镜像)

然后进入容器启动镜像

2):因为我的是在虚拟机中部署的docker和elk服务,在本地window上并不能直接訪问web端口。可是这里我们能够加一个映射

netsh interface portproxy add v4tov4 listenport=9200 connectaddress=192.168.197.128 connectport=9201

netsh interface portproxy add v4tov4 listenport=5601 connectaddress=192.168.197.128 connectport=5600

这里之所以是9201和5600是因为我在linuxserver和docker容器的端口映射时将9200映射为9201。将5601映射为5600

3):本地indows就能够了

4):截图为证






END

【Docker江湖】之docker部署与理解的更多相关文章

  1. 升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署

    概述 容器,顾名思义是用来存放并容纳东西的器皿: 而容器技术伴着Docker的兴起也渐渐的映入大家的眼帘,它是一个抽象的概念,同时也是默默存在世上多年的技术,不仅能使应用程序间完全的隔离,而且还能在共 ...

  2. Docker网络解决方案 - Calico部署记录

    简单来说,实现docker跨主机容器间通信,常用的第三方网络方案是Flannel,Weave,Calico:Flannel会为每个host分配一个subnet,容器从这个subnet中分配ip,这些i ...

  3. docker - 从安装到部署一个web应用(go、java)

    一:安装docker 1.https://docs.docker.com/engine/installation/binaries/ 下载docker最新版二进制tar.gz linux下: wget ...

  4. Docker环境的持续部署优化实践

    最近两周优化了我们持续部署的程序,收效显著,记录下来分享给大家 背景介绍 那年公司快速成长,频繁上线新项目,每上线一个项目,就需要新申请一批机器,初始化,部署依赖的服务环境,一个脚本行天下 那年项目发 ...

  5. Docker swarm结合Openresty部署rabbitmq集群

    Docker swarm结合Openresty部署rabbitmq集群 大家好,年底了,年味儿越来越浓了.2019年的寒冬被定义为未来10年中最好的一年,对于这一说法悲观的人和乐观的人的理解是不一样的 ...

  6. Asp.Net Core 使用Docker进行容器化部署(一)

    前几篇文章介绍了Liunx下的环境搭建,今天来分享一下.Net Core在Liunx上的部署. 我采用的方案是使用Dokcer作为运行虚拟机,Nginx作为Http服务器来进行反向代理,你可以理解为D ...

  7. Linux上安装Docker,并成功部署NET Core 2.0

    概述 容器,顾名思义是用来存放并容纳东西的器皿: 而容器技术伴着Docker的兴起也渐渐的映入大家的眼帘,它是一个抽象的概念,同时也是默默存在世上多年的技术,不仅能使应用程序间完全的隔离,而且还能在共 ...

  8. 服务发现之consul理论整理_结合Docker+nginx+Tomcat简单部署案例

    目录 一.理论概述 服务发现的概念简述 consul简述 二.部署docker+consul+Nginx案例 环境 部署 三.测试 四.总结 一.理论概述 服务发现的概念简述 在以前使用的是,N台机器 ...

  9. Docker 容器简介与部署

    关于Docker容器技术 参考文献:<docker 从入门到精通> Docker容器简介 Docker的构想是要实现 "Build,Ship and Run Any App,An ...

随机推荐

  1. 百度FIS入门

    1.fis作为nodejs的模块来管理的,所以首先得安装nodejs,看我前面的安装nodejs的文章. 2.官方的案例下载包https://github.com/hefangshi/fis-quic ...

  2. spring整合各大ORM框架的原理图

  3. hdu1232 畅通工程

    畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  4. WTL汉化版2013.10.15

    汉化内容: 2013.10.15 版本:当前可下载Trunk最新版,wtl-code-467-trunk.zip 汉化内容: 1.应用向导的部分汉化,考虑到部分词汇的表述问题,只汉化无影响部分 2.资 ...

  5. 2017第45周一java多线程创建方法

    1. 从JDK1.5开始,Java提供了3种方式来创建,启动多线程: Ø 继承Thread类来创建线程类,重写run()方法作为线程执行体. Ø 实现Runnable接口来创建线程类,重写run()方 ...

  6. 学JAVA二十一天,自定义数组

    今天就说一下自定义数组,至于要怎么用,我也不知道,反正逼格挺高的. 闲话不多说,开始: 首先,自定义数组首先要创建一个类,用来做自定义数组的类型. public class User{ private ...

  7. nginx配置url重写

    url重写是指通过配置conf文件,以让网站的url中达到某种状态时则定向/跳转到某个规则,比如常见的伪静态.301重定向.浏览器定向等 rewrite 语法 在配置文件的server块中写,如: s ...

  8. WorldWind源码剖析系列:影像存储类ImageStore、Nlt影像存储类NltImageStore和WMS影像存储类WmsImageStore

    影像存储类ImageStore 影像存储类ImageStore提供了计算本地影像路径和远程影像影像URL访问的各种接口,是WmsImageStore类和NltImageStore类的基类.当划分完层次 ...

  9. C陷阱与缺陷的学习笔记

    1用单引号括起的字符实际代表一个整数,整数值对应于该字符在编译器中采用的字符集对应的序列值:双引号括起的字符串,代表的是一个指向无名数组起始字符的指针,该数组被双引号之间的字符和‘\0’初始化.对于' ...

  10. element-ui : &lt;el-table&gt; 按钮点击操作阻止@row-click

    描述:<el-table> 点击行时,会跳转到一个详细信息页面, 但是同时这一行也有编辑和删除按钮. 问题: 在点击按钮时,@row-click事件也被触发了,而我并不想触发 row-cl ...