点击进入Docker官网
用我自己的理解,Docker就是一个USB鲸鱼吧,鲸鱼它也是官网的形象描述。为何称为USB呢,因为它有很好的移植性,类似usb一样,只要有驱动,任何一台电脑都能运行其中的文件,安装docker服务就好比是usb的驱动。
比如传统部署tomcat等Java项目时候,我们可能在本机运行正常,但是换了服务器上,死活运行报错,这排除其他配置文件和环境变量的问题,很大程度上也是服务器环境和本机环境差异的问题,这就导致在实际生产环境中,运维人员觉得服务器没有什么错误,开发又觉得本机运行完美,导致问题解决上浪费很多时间。
再比如在运维迁移项目的时候,新购入一台云服务器,需要安装各种tomcat、jdk、nginx,maven,mysql、ftp、svn等等服务器,不仅耗费时间,还需要按照各种公司参数进行服务器配置,而这些多余的定制化配置不仅仅是安装这么简单,如果几台服务器还好应对,若是大规模的迁移服务器的话,势必耗费巨大的运维人力资源成本不说,服务器上线后由于疏忽等问题,导致服务器运行和预期不一致。
首先,安装一台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/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["这里填写你的专属加速器地址"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
执行完以上操作后,就类似于修改maven仓库到阿里云一样,下载镜像速度会快很多,当然下载的仓库地址就变成了阿里云上的仓库资源,而不是官网docker了。
下面说些docker客户端常用的命令吧
参数 | 说明 |
---|---|
docker pull centos:7 | centos: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包导进去就行了。下面有两种方案可供选择
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的镜像,然后运行镜像即可,很显然第一种方法简单了许多
有的同学,有这样的需求,网上镜像仓库集成了很多应用了,比如nginx,mysql,java环境,tomcat等,确实像上面一样,拿来就能用了,部署时间最多1分钟吧,但是我不想用他们的版本,一是怕有后门,二是有些应用必须要特定的版本才能使用,那么怎么办呢。答案是可以的,而且也是非常的简单的。下面我来详细说下实现方法吧。
我们以最长用的java+tomcat环境来抛砖隐喻,教会大家如何部署定制化的镜像
下面是完整的java+tomcat项目部署代码,
'[root@localhost ~]#docker pull centos:latest
'[root@localhost ~]#vi Dockerfile
#From后面代表是依赖,centos等同于centos:latest,MAINTAINER没什么卵用,就是介绍下作者信息啥的
FROM centos
MAINTAINER xxx "[email protected]"
#安装JDK1.8_31 jdk是到官网下载对应的linux版本,然后导入到本地,以下命令都是针对镜像内部运行的,而不是宿主主机,因为From后面是依赖centos的,所以你此时可以把下面命令都当centos来理解,事实上这就是一个Mini的centos系统,内核依赖于宿主主机运行的,至于centos怎么虚拟成docker的,那暂时我也不懂了。。。
#以下命令很简答,大概就是先创建一个文件夹,然后复制本机的这个tar包到镜像对应的路径下,然后执行解压,解压完成后执行删除就是这么简单
RUN mkdir /usr/local/jdk
COPY jdk-8u31-linux-x64.tar.gz /usr/local/jdk
RUN 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/tomcat
COPY apache-tomcat-8.0.30.tar.gz /usr/local/tomcat
RUN 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_31
ENV TOMCAT_HOME /usr/local/tomcat/apache-tomcat-8.0.30
ENV PATH $PATH:$JAVA_HOME/bin:$TOMCAT_HOME/bin
#开启内部服务端口8080,如果需要其他的端口后面继续追加就可以了
EXPOSE 8080
#启动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比作集装箱,那么集装箱和集装箱之间是隔离的,而虚拟机就相当于一个码头,单独的,都是隔离的吧,但是码头肯定没有集装箱传输快,毕竟多了一个码头的调配,大概就是这样吧。。。
第一次写博客,希望大家多多包涵,如有错误,请理解下,大家共同进步。。。