转载请注明出处:
博主微博: Github:Docker江湖
写在前边的话
环境介绍
本地 win10
VMware 虚拟机 安装的redhat 7.1 server版(模拟server环境) redhat 7.1(server)上部署docker
在linux部署
安装的方法有非常多种。能够选择rpm包安装。也能够使用二进制包安装,不同的os 在线安装的方式也有所不同,我这是是基于redhat7.1进行安装的,其它的一些安装方式能够參考官网()
我这里採用的是安装二进制包的形式:1、内核版本号要求
查看内核版本号
[redhat@localhost ~]$ uname -r
3.10.0-229.el7.x86_64
官方建议不低于3.10.0
2、下载二进制包并解压
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架构的文章,个人感觉不错:
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 容器。容器(Container)
Docker 利用容器(Container)来执行应用。
它能够被启动、開始、停止、删除。每一个容器都是 相互隔离的、保证安全的平台。
能够把容器看做是一个简易版的 Linux 环境(包含root用户权限、进程空间、用户 空间和网络空间等)和执行在当中的应用程序。仓库(Repository)
仓库(Repository)是集中存放镜像文件的场所。有时候会把仓库和仓库注冊服务 器(Registry)混为一谈,并不严格区分。实际上,仓库注冊server上往往存放着 多个仓库,每一个仓库中又包含了多个镜像。每一个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。 最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 国内的公开仓库包含 时速云 、网易云 等。能够提供大陆用户更稳定高速的訪问。 当然,用户也能够在本地网络内创建一个私有仓库(參考本文“私有仓库”部分)。
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 swarmtag: 将镜像保存在仓库中。也能够作为重命名使用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信息和镜像的层信息,详细可參考: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
參考:
2:docker部署rails服务环境
需求分析:
在一台联网的机器上安装docker,并在当中部署好rails服务环境,保存成tar,并load进另外一台没有网络的环境
PS:docker容器内执行一个操作系统,好多依赖的包都会缺少,这一点要注意
1):接着1中进行2):安装git
apt-get install git
3):安装rbenv,并增加到环境变量
git clone ~/.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 ~/.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包到该serversudo 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