本篇文章将会讲解:docker是什么?docker的安装,建立一个docker镜像,运行咱们建立的docker镜像,发布本身的docker镜像至中央仓库。html
docker是什么?咱们在谷歌翻译中输入单词docker获得的解释是:码头工人,搬运工人。码头是什么样?咱们没去过,但也在电视上见过,那里有一个个蓝色的、形状大小都相同的集装箱。它们从轮船卸载到码头,也从码头装载到巨轮上而后运往远方。每一艘轮船不须要关系集装箱里边是什么,你只须要把东西放进集装箱。每一个集装箱里边的东西是不同的,摆放也是不同的,温度湿度可能都不同,可是在外面看起来他们是同样的标准。因为集装箱都是同样的标准,后面的运输、卸载、管理等等环节都是标准化的。因此集装箱发挥了巨大的力量,改变了整个运输产业,也改变了人们的生活。想象一下若是没有集装箱,那些货物都随意堆放,怎么装载?怎么运输?就比如咱们家里的东西不少,你找起来搬起来都不容易,若是整一个个小盒子装起来就整齐多了。nginx
而咱们软件的部署运维正须要这样的“集装箱模式”,在没有docker以前为了部署一个Java程序,咱们须要准备一个Linux服务器,而后在里边安装JDK配置环境变量,根据应用的须要可能还须要安装Tomcat,安装MySQL等。若是须要继续扩容,加3台服务器,你得重复这个步骤。何其繁琐,多么麻烦啊?而后,由于环境不统一的问题,配置的问题致使“这个代码在我电脑上运行是好的啊?怎么不是到那个服务器上就出问题了”……所以,docker来了,她是软件行业的集装箱,里边装载的是咱们的软件,咱们只须要将应用定义为一个Dockerfile建立成docker镜像,而后这个docker镜像就能够想Java中的jar包同样下载使用,这一切只须要运行几个简单的命令便可。程序员
docker的入门,咱们须要熟悉三个概念:Dockerfile , docker镜像,镜像仓库。这一点Java程序员能够类比为pom文件,jar包,maven仓库。spring
现在docker已经获得了很是普遍的使用,各类基础镜像都十分稳定能够直接使用,就像是各个编程语言的基础类库同样拿来即用。主流应用落地方案都有成熟的docker容器化方案参考,不用再犹豫和怀疑了,是时候把咱们的应用都弄到集装箱吧!咱们能够在脑海中想一想一下Docker那个Logo,一条蓝色的鲸鱼,驮着一个个规格同样的小箱子,整齐有序,乘风破浪。docker
docker的安装能够参照相关文档。以mac为例,打开浏览器搜索docker for mac
下载安装文件,而后安装便可,十分简单。若是安装的home brew的话就更简单了,直接运行以下命令便可:编程
brew cask install docker
windows电脑安装docker可能稍微麻烦点,若是你在你的电脑上安装完成以后,能够输入以下命令:windows
$ docker --version Docker version 19.03.5, build 633a0ea
能够看到安装成功了。浏览器
docker环境安装好以后,咱们能够来建立一个镜像。镜像的建立是由一个Dockerfile开始的,根据dockerfile文件能够打包出一个镜像。就相似于你根据Java项目的pom文件的定义能够打包出一个jar文件或者war文件。springboot
咱们来建立一个简单的镜像:里边运行一个ningx服务器,启动以后能够展现咱们定义的html内容。咱们来进行以下操做:服务器
$ mkdir docker-demo $ cd docker-demo $ echo '<h1>Hello world!!</h1>' > index.html $ touch Dockerfile
上面的几行命令咱们建立了一个目录,在目录中建立了一个简单的index.html,并建立了一个空的Dockerfile,咱们给Dockerfile中加入以下内容:
FROM nginx COPY index.html /usr/share/nginx/html
这是一个很是简单的dockerfile了,dockerfile都长这样,FROM
命令表示镜像来自于哪一个基础镜像。就比如Java 项目pom文件中写的spring-boot-stater的parent配置表示这个Java项目是基于springboot的那个版本。而第二行的COPY 命令则是将当前目录的index.html文件拷贝到镜像中/usr/share/nginx/html
目录,这样启动镜像以后就能够看到这个页面了。
下面咱们来建立这个镜像,执行以下命令:
$ docker build . -t my-frist-demo:v1.0 Sending build context to Docker daemon 5.12kB Step 1/2 : FROM nginx latest: Pulling from library/nginx 54fec2fa59d0: Already exists 4ede6f09aefe: Already exists f9dc69acb465: Already exists Digest: sha256:86ae264c3f4acb99b2dee4d0098c40cb8c46dcf9e1148f05d3a51c4df6758c12 Status: Downloaded newer image for nginx:latest ---> 602e111c06b6 Step 2/2 : COPY index.html /usr/share/nginx/html ---> 823957e13591 Successfully built 823957e13591 Successfully tagged my-frist-demo:v1.0
运行这个命令可能须要等待几秒钟,从结果中能够看出执行了两步,Step 1/2
和Step 2/2
。命令也很简单,docker build
表示要建立镜像,后面的.
指定了构建“上下文”的文件的位置。-t
指定了镜像的名字及标签,对应本例中名字就是my-frist-demo
标签是v1.0
。(若是你建立镜像失败了不要紧,继续往下看)
上面咱们建立了docker镜像,假设你也在本身电脑上建立成功了。下面咱们来启动看看效果。执行以下命令:
$ docker run -d -p 8080:80 hellodm/my-first-demo:v1.0 705a41b2ced173d8e06100274f36ccfb7b504a5a615dfd8c9214e951c198f922
参数中-d
表示后台运行,-p
指定了端口,这里的8080:80表示将镜像内部的nginx在80端口启动,本机可以使用8080端口访问。咱们能够在浏览器中输入http://localhost:8080/
,你能够看到久违的“Hello world!!”。或者你可直接在命令行验证:
$ curl 'http://localhost:8080/' <h1>Hello world! <h1>
如此,咱们的镜像便运行成功了。这个时候我看能够执行docker ps
命令查看镜像运行状态。若是想中止,执行docker stop 镜像ID
便可,这里的镜像ID,在执行docker ps
的结果中能够看到。
固然,若是你绝对建立镜像麻烦,或者你建立镜像失败了,能够直接拉去一个镜像来运行看效果,下面会说到。
当你建立一个镜像以后,能够给上传到中央仓库dockerhub,方便别人使用,就是相似于你开发了一个软件,能够将软件的exe
包或者dmg
包上传到应用市场给别人使用。作Java的同窗能够类比为你执行了maven deploy
将项目发布到maven仓库给别人使用。
发布镜像到dockerhub有以下三个步骤:
docker login docker.io
登陆你的帐号。docker push
上传你的镜像。以笔者上面说的为例,咱们本地打包的镜像为my-first-demo:v1.0,我注册的dockerhub的ID为hellodm
,这个hellodm
会成为我发布镜像的一个“前缀”。我在上传镜像的时候执行了以下操做:
$ docker tag my-first-demo:1.0 hellodm/my-first-demo:v1.0 $ docker login docker.io $ docker push hellodm/my-first-demo:v1.0
如今,我这个hellodm/my-first-demo:v1.0
镜像已经在dockerhub中了,你能够去搜索hellodm/my-first-demo
。加入根据上面的步骤你没能建立镜像并运行,如今你能够直接拉取个人镜像运行了,这个镜像就是上文建立的镜像。执行以下命令:
$ docker pull hellodm/my-first-demo:v1.0 v1.0: Pulling from hellodm/my-first-demo 54fec2fa59d0: Pull complete 4ede6f09aefe: Pull complete f9dc69acb465: Pull complete cef8b33bc718: Pull complete Digest: sha256:a175b7f9f74265e538015ba0eb6987dffcfc529426ce148667537960aa0fbdb8 Status: Downloaded newer image for hellodm/my-first-demo:v1.0 docker.io/hellodm/my-first-demo:v1.0
如此,能够看到拉取成功了,运行:
$ docker run -d -p 8080:80 hellodm/my-first-demo:v1.0 705a41b2ced173d8e06100274f36ccfb7b504a5a615dfd8c9214e951c198f922
跟以前同样,下面的一行字符串是docker镜像的ID,咱们能够这样看下效果:
$ curl 'http://localhost:8080/' <h1>Hello world! <h1>
也能够执行docker ps
查看运行状况,也能够执行docker stop 705a41b2ced173
中止镜像。
本文介绍了一下docker的概念,建立了一个docker镜像,并启动镜像看了看效果,而后发布镜像到dockerhub,又从dockerhub拉取镜像并运行。同时也了解了docker的几个经常使用命令。
因为本文标题是“Docker & k8s 系列”,所以后面会继续讲k8s的入门,应用部署到k8s,应用集群,蓝绿部署等。
Docker & k8s 系列二:本机k8s环境搭建
Docker & k8s 系列三:在k8s中部署单个服务实例
Docker & Kubenetes 系列四:集群,扩容,升级,回滚