docker 使用详解

Docker入门(程序员和运维必备)

首先来简单说下什么是Docker

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

点击进入Docker官网

用我自己的理解,Docker就是一个USB鲸鱼吧,鲸鱼它也是官网的形象描述。为何称为USB呢,因为它有很好的移植性,类似usb一样,只要有驱动,任何一台电脑都能运行其中的文件,安装docker服务就好比是usb的驱动。

比如传统部署tomcat等Java项目时候,我们可能在本机运行正常,但是换了服务器上,死活运行报错,这排除其他配置文件和环境变量的问题,很大程度上也是服务器环境和本机环境差异的问题,这就导致在实际生产环境中,运维人员觉得服务器没有什么错误,开发又觉得本机运行完美,导致问题解决上浪费很多时间。

再比如在运维迁移项目的时候,新购入一台云服务器,需要安装各种tomcat、jdk、nginx,maven,mysql、ftp、svn等等服务器,不仅耗费时间,还需要按照各种公司参数进行服务器配置,而这些多余的定制化配置不仅仅是安装这么简单,如果几台服务器还好应对,若是大规模的迁移服务器的话,势必耗费巨大的运维人力资源成本不说,服务器上线后由于疏忽等问题,导致服务器运行和预期不一致。

废话不多说,直奔主题,对docker还不慎了解的同学,可以百度恶补。

Docker安装(Centos7.3服务器)

Docker常用命令

Docker使用指南

定制属于自己的Docker镜像

首先,安装一台linux服务器,我这里用的是阿里云的centos7.3系统,到官方下载最新版的docker安装包。 

注意从2017年5月后,docker更新成CE版本和EE版本,CE就是社区版,免费的意思,EE版就是企业级,收费的。至于这两款有什么大的区别,可自行百度查看,毕竟这不是今天我们的重点。。。

我这里采用的是Centos的CE版本的rpm版,还可使用yum软件库等安装方式,都很简单只有一条命令。

官网的下载地址 

https://download.docker.com/linux/centos/7/x86_64/stable/Packages/ 

下载完成后,导入到centos文件夹中,然后使用

' [root@localhost ~]#yum install docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm

'[root@localhost ~]#systemctl start docker' [root@localhost ~]#docker version

正常安装完成应该和我这个一样 

这时我们就可以使用docker,是不是非常的简单呢

默认安装完成后,我们使用的是docker官方的镜像仓库,这里我们改成阿里云的,方便我们下载其他人的docker速度比较快。 

当然你可以使用网易蜂巢等第三方镜像加速的服务

阿里云docker仓库 https://dev.aliyun.com/search.html

进去注册帐号后,点击自己的管理中心

sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{"registry-mirrors": ["这里填写你的专属加速器地址"]}EOFsudo systemctl daemon-reloadsudo systemctl restart docker

执行完以上操作后,就类似于修改maven仓库到阿里云一样,下载镜像速度会快很多,当然下载的仓库地址就变成了阿里云上的仓库资源,而不是官网docker了。

下面说些docker客户端常用的命令吧

参数说明

docker pull centos:7centos:7代表的是相对于上面设置好的仓库地址的镜像名,一般都是唯一的,如果没有自定义仓库的名称,默认是从官网下载的。centos代表镜像名字,7就代表的是版本,默认是latest版本,就是最新版

docker images查看当前本机存在的所有镜像,查看下图,其中第一列就是代表镜像的名字,TAG代表版本号,Image ID就是当前镜像编号,相对于本机的

参数说明

docker rmi Image ID删除对应id的镜像,注意删除的时候必须保证这个镜像下的容器不在运行中

docker rm CONTAINER ID删除对应id的容器id

docker -d -p 80:8080 镜像的名称-d代表的是后台执行,-p代表本机端口映射,你可以把docker看成是一个网卡交换机,它可以映射本机的所有端口到达指定镜像的端口

docker ps查看当前正在运行的镜像,如图倒数第一个NAMES是镜像的名字,这个是系统随机生成的,第一个代表是容器的ID,后面参数大家一看便知含义

参数说明

docker exec -it CONTAINER ID /bin/bash进入docker容器的命令,以伪控制台的方式进入

docker cp 本地的路径 CONTAINER ID:容器内的路径可以复制文件到容器中去,注意是容器,不要和镜像搞混淆

docker build -t name:版本号 .这个是构建版本自定义镜像使用的,注意是镜像,不是容器,不要搞混淆这两个概念,-t代表的是后面加上自定义的镜像名字还有版本号,要是不加的话,默认都是none:none的。 .代表的是当前的路径下,是从此命令要保证当前目录中有Dockerfile这个文件才行

docker stop CONTAINER ID停止当前容器,如果CONTAINER ID头几个字母不重复,name直接输入头几个数字字母也可是实现停止CONTAINER ID的功能。比如开头是1234123dsdewfaf,那么输入12,同样和输入一大串一样的效果的

docker export 镜像名称 -o 导出的名字.tar这个可以将当前查询到的镜像导出成一个文件方便迁移,这也是docker的核心所在,只需要将一个环境配置好,导出去,拿到其他任意一台机器上,复制过去直接运行就和当前主机运行一样的效果

docker load 镜像名字.tar这个就是上面导出的镜像,这样倒进来即可使用了

docker rename 容器的名字这个是上面提到的重命名随机生成的容器名字,这样方便自己查看当前都运行了哪些容器

docker restart 容器名字或者【容器名字】可以重启stop容器的镜像

更多的docker的命令,请使用docker –help来尝试,虽说是英文的,但是这些都很简单,英语二级水平应该看都没啥问题。上面说了这么多常用的命令,头可能有点大,第一次接触,那么简单了解下就好,没有必要刻意的记忆,下面来说怎么使用吧,使用过程中,遇到什么问题了,再翻看上面的使用方法就明白多了。

我们进行简单的tomcat练习,'[root@localhost ~]#docker pull registry.cn-hangzhou.aliyuncs.com/cnnic-tomcat/tomcat

'[root@localhost ~]# docker run -d -p 80:8080 registry.cn-hangzhou.aliyuncs.com/cnnic-tomcat/tomcat'[root@localhost ~]#docker ps'短短以上三条命令,我们就部署好了tomcat,现在打开centos服务器的地址到ie浏览器上面,即可出现tomcat的默认主要

上面对于每个人来说都非常的简单,我来重点说下怎么部署自己的项目,由于tomcat里面都是集成java的,所以我们只需要将war包导进去就行了。下面有两种方案可供选择

[root@localhost ~]#docker cp xxx.war 容器的id:容器中的路径

新建一个DockerFile文件,然后输入以下三条命令

FROM registry.cn-hangzhou.aliyuncs.com/cnnic-tomcat/tomcat ADD ./XXX.war usr/local/tomcat/webapps/ (前面代表是本地的war包路径,后面代表的是镜像中的webapps路径) CMD ["./usr/local/tomcat/bin/catalina.sh","run"]

[root@localhost ~]#docker build -t xxx:xx .

以上会重新打包生成名字为xxx,版本号为xx的镜像,然后运行镜像即可,很显然第一种方法简单了许多

最后我们来介绍docker如何构建自己的镜像

有的同学,有这样的需求,网上镜像仓库集成了很多应用了,比如nginx,mysql,java环境,tomcat等,确实像上面一样,拿来就能用了,部署时间最多1分钟吧,但是我不想用他们的版本,一是怕有后门,二是有些应用必须要特定的版本才能使用,那么怎么办呢。答案是可以的,而且也是非常的简单的。下面我来详细说下实现方法吧。 

我们以最长用的java+tomcat环境来抛砖隐喻,教会大家如何部署定制化的镜像

部署centos镜像部署centos镜像安装自定义版本服务器安装自定义版本服务器必须要有centos等64位linux环境依赖,才能安装java+tomcat,这里我们引入官方的centos7镜像

下面是完整的java+tomcat项目部署代码,'[root@localhost ~]#docker pull centos:latest

'[root@localhost ~]#vi Dockerfile#From后面代表是依赖,centos等同于centos:latest,MAINTAINER没什么卵用,就是介绍下作者信息啥的FROM centosMAINTAINER xxx"xxx@qq.com"#安装JDK1.8_31 jdk是到官网下载对应的linux版本,然后导入到本地,以下命令都是针对镜像内部运行的,而不是宿主主机,因为From后面是依赖centos的,所以你此时可以把下面命令都当centos来理解,事实上这就是一个Mini的centos系统,内核依赖于宿主主机运行的,至于centos怎么虚拟成docker的,那暂时我也不懂了。。。#以下命令很简答,大概就是先创建一个文件夹,然后复制本机的这个tar包到镜像对应的路径下,然后执行解压,解压完成后执行删除就是这么简单RUN mkdir /usr/local/jdkCOPY jdk-8u31-linux-x64.tar.gz /usr/local/jdkRUN tar xzf /usr/local/jdk/jdk-8u31-linux-x64.tar.gz -C /usr/local/jdk && rm -rf /usr/local/jdk/jdk-8u31-linux-x64.tar.gz#安装tomcat8.0.30,道理和上面的一样样的RUN mkdir /usr/local/tomcatCOPY apache-tomcat-8.0.30.tar.gz /usr/local/tomcatRUN tar xzf /usr/local/tomcat/apache-tomcat-8.0.30.tar.gz -C /usr/local/tomcat && rm -rf /usr/local/tomcat/apache-tomcat-8.0.30.tar.gz#设置景象中系统的环境变量,有时候我们见其他镜像网站启动mysql等服务器,可以传入参数,实际上就是设置以下变量来实现的,这次是入门的,所以还暂时用不上,先不过多介绍吧ENV JAVA_HOME /usr/local/jdk/jdk1.8.0_31ENV TOMCAT_HOME /usr/local/tomcat/apache-tomcat-8.0.30ENV PATH $PATH:$JAVA_HOME/bin:$TOMCAT_HOME/bin#开启内部服务端口8080,如果需要其他的端口后面继续追加就可以了EXPOSE8080#启动tomcat服务器,这一步前面的CMD命令也可不要,上面也说过了,如果你是用第二种方式来创建自定义镜像的,也可以在那里加入以下命令的。如果不知道我说的第二种方式是啥,没关系,直接把下面命令复制进去就行了。。。CMD ["./usr/local/tomcat/apache-tomcat-8.0.30/bin/catalina.sh","run"] && tail -f /usr/local/tomcat/apache-tomcat-8.0.30/logs/catalina.out 输入:wq保存下Dockerfile'[root@localhost ~]#docker build -t xxx:xx .

OK就这样就部署完了tomcat和jdk环境了,写到这里写的够多了觉得。

小结:通过以上的tomcat+java环境的自定义配置,我们知道了大致部署自定义环境的步骤。 

首先,你要From 一个linux64位的系统,不过再问我说这个linux64位系统为啥一定要pull进来,因为这个我真的不知道怎么制作一个linux64位的docker镜像,这个你也不要纠结什么,毕竟你用的所有软件都是依赖于linux系统的吧。。 

From了之后,接下来设置安装各种定制化服务器的步骤,无非就是你要想好怎么写linux命令,注意这里并不是什么脚本shell或者python,而是实时在在的linux命令集合的,你要设想成我怎么设计才能让这一句句命令直接把配置文件等信息都改好,这也是和现在传统部署的区别,传统部署的话,你可以随心所欲的进入ini、conf等配置文件或者文件夹下进行随意修改,而此时你需要都想好让命令全部帮你改好。。。

当然如果实在是程序员的话,不是专业的运维人士,对于专注写linux命令不行。还有一种简单的办法,你先把需要定制化版本的服务器都装好,然后启动起来容器,直接通过exec这个命令进入容器,一个个的改,改好后你把容器直接导出来,然后这样也可以。。。ps:你一定要记得在安装容器时候装上vi等命令,否则,会提示这个不存在的哇。。。。

啰嗦了这么久,这个入门的也该结束啦。最后来一个大的PS总结吧。。。

互联网IT方面其实没有什么技术含量,毕竟大多数的IT和程序员,都是活在应用层的,所以任何东西,刚开始第一次掌握都会遇到无数的坑,笔者第一次docker入门也遇到了一些坑和挫折的,虽说上手真的很简单,1小时足矣,不能再多了,但是真的深入到一个细节上,搞成你想的那样,肯定是得自己花时间研究了,而一旦你搞过一遍了,就觉得这玩意真的也没啥高深的。。。这也是为何很多程序员头3年水平飞速提升的原因吧。 

其实互联网7成的人才,无非是在模仿别人的使用方法而已,这次做了一个项目,下次学习了一个新技术,只要是用别人的,而不是开发底层的,大家都差不太多,最终都可以完美掌握的。所以自信起来迎接每一天吧。。。扯得远了

最后说两个问题

1.我用了docker部署后,原有应用的window.reload方法失效了 

2.由于笔者的公司还没有开始使用docker而是传统的装机装机的模式,所以对于性能的调优上,本人也不是很懂。。据网上查资料来说,docker是直接对接内核实现的,比传统的虚拟机优势在于不用通过虚拟层对硬件的控制,所以性能上比虚拟机好,这也是为何docker最近一两年火起来的原因吧。docker其实不大适合多人共同使用一台机器,而是适合当前应用都是属于一个的,比如公司的所有项目服务器都是属于公司的,这样就可以用这个。如果做虚拟化公司,那么可能没有传统的虚拟机隔离性好点吧。如果把docker比作集装箱,那么集装箱和集装箱之间是隔离的,而虚拟机就相当于一个码头,单独的,都是隔离的吧,但是码头肯定没有集装箱传输快,毕竟多了一个码头的调配,大概就是这样吧。。。 

第一次写博客,希望大家多多包涵,如有错误,请理解下,大家共同进步。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335