本篇文章将会讲解:docker是什么?docker的安装,创建一个docker镜像,运行我们创建的docker镜像,发布自己的docker镜像至中央仓库。

Docker是什么

docker是什么?我们在谷歌翻译中输入单词docker得到的解释是:码头工人,搬运工人。码头是什么样?我们没去过,但也在电视上见过,那里有一个个蓝色的、形状大小都相同的集装箱。它们从轮船卸载到码头,也从码头装载到巨轮上然后运往远方。每一艘轮船不需要关系集装箱里边是什么,你只需要把东西放进集装箱。每个集装箱里边的东西是不一样的,摆放也是不一样的,温度湿度可能都不一样,但是在外面看起来他们是一样的标准。由于集装箱都是一样的标准,后面的运输、卸载、管理等等环节都是标准化的。所以集装箱发挥了巨大的力量,改变了整个运输产业,也改变了人们的生活。想象一下如果没有集装箱,那些货物都随意堆放,怎么装载?怎么运输?就好比我们家里的东西很多,你找起来搬起来都不容易,如果整一个个小盒子装起来就整齐多了。

而我们软件的部署运维正需要这样的“集装箱模式”,在没有docker之前为了部署一个Java程序,我们需要准备一个Linux服务器,然后在里边安装JDK配置环境变量,根据应用的需要可能还需要安装Tomcat,安装MySQL等。如果需要继续扩容,加3台服务器,你得重复这个步骤。何其繁琐,多么麻烦啊?然后,因为环境不统一的问题,配置的问题导致“这个代码在我电脑上运行是好的啊?怎么不是到那个服务器上就出问题了”……因此,docker来了,她是软件行业的集装箱,里边装载的是我们的软件,我们只需要将应用定义为一个Dockerfile创建成docker镜像,然后这个docker镜像就可以想Java中的jar包一样下载使用,这一切只需要运行几个简单的命令即可。

docker的入门,我们需要熟悉三个概念:Dockerfile , docker镜像,镜像仓库。这一点Java程序员可以类比为pom文件,jar包,maven仓库。

如今docker已经得到了非常广泛的使用,各种基础镜像都十分稳定可以直接使用,就像是各个编程语言的基础类库一样拿来即用。主流应用落地方案都有成熟的docker容器化方案参考,不用再犹豫和怀疑了,是时候把我们的应用都弄到集装箱吧!我们可以在脑海中想想一下Docker那个Logo,一条蓝色的鲸鱼,驮着一个个规格一样的小箱子,整齐有序,乘风破浪。

Docker的安装

docker的安装可以参照相关文档。以mac为例,打开浏览器搜索docker for mac 下载安装文件,然后安装即可,十分简单。如果安装的home brew的话就更简单了,直接运行如下命令即可:

brew cask install docker

windows电脑安装docker可能稍微麻烦点,如果你在你的电脑上安装完成之后,可以输入如下命令:

$ docker --version
Docker version 19.03.5, build 633a0ea

可以看到安装成功了。

Docker镜像创建

docker环境安装好之后,我们可以来创建一个镜像。镜像的创建是由一个Dockerfile开始的,根据dockerfile文件可以打包出一个镜像。就类似于你根据Java项目的pom文件的定义可以打包出一个jar文件或者war文件。

我们来创建一个简单的镜像:里边运行一个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/2Step 2/2。命令也很简单,docker build 表示要创建镜像,后面的.指定了构建“上下文”的文件的位置。-t指定了镜像的名字及标签,对应本例中名字就是my-frist-demo标签是v1.0。(如果你创建镜像失败了没关系,继续往下看)

Docker镜像的启动

上面我们创建了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的结果中可以看到。

当然,如果你绝对创建镜像麻烦,或者你创建镜像失败了,可以直接拉去一个镜像来运行看效果,下面会说到。

Docker镜像发布

当你创建一个镜像之后,可以给上传到中央仓库dockerhub,方便别人使用,就是类似于你开发了一个软件,可以将软件的exe包或者dmg包上传到应用市场给别人使用。做Java的同学可以类比为你执行了maven deploy将项目发布到maven仓库给别人使用。

发布镜像到dockerhub有如下三个步骤:

  1. 注册dockerhub账号。
  2. 在命令行执行docker login docker.io登录你的账号。
  3. 执行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 系列四:集群,扩容,升级,回滚

Docker & k8s 系列一:快速上手docker的更多相关文章

  1. docker实战系列之快速删除docker中的容器

    1.停用全部运行中的容器 docker stop $(docker ps -q) 2.删除全部容器 docker rm $(docker ps -aq) 3.停用并删除容器 docker stop $ ...

  2. Docker & k8s 系列二:本机k8s环境搭建

    本篇将会讲解k8s是什么?本机k8s环境搭建,部署一个pod并演示几个kubectl命令,k8s dashboard安装. k8s是什么 k8s是kubernetes的简写,它是一个全新的基于容器技术 ...

  3. Docker & k8s 系列三:在k8s中部署单个服务实例

    本章将会讲解: pod的概念,以及如何向k8s中部署一个单体应用实例. 在上面的篇幅中,我们了解了docker,并制作.运行了docker镜像,然后将镜像发布至中央仓库了.然后又搭建了本机的k8s环境 ...

  4. 用Docker在一台笔记本电脑上搭建一个具有10个节点7种角色的Hadoop集群(上)-快速上手Docker

    如果想在一台电脑上搭建一个多节点的Hadoop集群,传统的方式是使用多个虚拟机.但这种方式占用的资源比较多,一台笔记本能同时运行的虚拟机的数量是很有限的.这个时候我们可以使用Docker.Docker ...

  5. 30分钟快速上手Docker,看这篇就对了!

    一.历史演化 1.演化史 2.物理机时代 2.1.图解 一个物理机上安装操作系统,然后直接运行我们的软件.也就是说你电脑上直接跑了一个软件,并没有开虚拟机什么的,资源极其浪费. 2.2.缺点 部署慢 ...

  6. Docker入门系列之二:Docker术语

    原文作者:Jeff Hale 原文地址:https://towardsdatascience.com/learn-enough-docker-to-be-useful-1c40ea269fa8 翻译: ...

  7. Docker概念学习系列之为什么使用docker?(3)

    不多说,直接上干货! 见[博主]撰写的https://mp.weixin.qq.com/s/FFSIOSecVdAr_aSDIFZwSA Docker容器虚拟化的优点: (1)环境隔离: 通过cgro ...

  8. 【转】.Net程序员玩转Android系列之三~快速上手

    原文:http://www.cnblogs.com/HouZhiHouJueBlogs/p/3962122.html 快速环境搭建和Hello World 第一步:JAVA SDK(JDK)的安装: ...

  9. Docker学习系列(三)Docker搭建gitlab的两种方式

    一.直接下载docker-ce 1.拉取gitlab/gitlab-ce Randy:~ Randy$ docker pull gitlab/gitlab-ce Using default tag: ...

随机推荐

  1. django-admin和manage.py用法

    官网文档地址:django-admin和manage.py 金句: 所有的天赋,都来自于你对你喜欢的某种事物的模仿与学习,否则你就不会有这种天赋. 开篇话: 我们在Django开发过程中,命令行执行最 ...

  2. 还学的动吗? 盘点下Vue.js 3.0.0 那些让人激动的功能

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://blog.bitsrc.io/vuejs-3-0-0-beta-features- ...

  3. 笔记-VUE滚动加载更多数据

    来源:https://blog.csdn.net/qq_17281881/article/details/87342403 VUE滚动加载更多数据 data() { return { loading: ...

  4. php里的闭包函数

    一个匿名函数内要获取外部的变量必须要使用use: $message = 'hello'; $example = function() use ($message){ var_dump($message ...

  5. bootstrop设置背景图片自适应屏幕

    如果不用bootstrop框架,想让背景图片自适应窗口大小,可以这样做: <style type="text/css"> html{height: %;} body.a ...

  6. 动静结合?Ruby 和 Java 的基础语法比较(入门篇)

    前言 这篇文章示例代码比较多, Java 程序员可以看到一些 Ruby 相关语法和使用,Ruby 程序员可以看看 Java 的基本语法和使用方法,本文比较长,将近万字左右,预计需要十几分钟,如果有耐心 ...

  7. 如何高效使用vim

    Vim 是一款文本编辑器,被称为编辑器之神,非常适合在shell 中编辑代码,熟练的使用Vim,可以让你高效的编写代码. Vim 是Vi 的增强版,所有的类Unix 系统,都自带这两个工具,这两个工具 ...

  8. Vue 结合 echarts 原生 html5 实现拖拽排版报表系统

    前言 不知道各位 coder 有没有碰到过许多重复的业务需求,比如排版相类似的报表,只不过是顺序稍微换了一下,就是一个新的页面,虽然基于模板思想来写的话也能减少不少代码,但是相对的不那么方便,笔者最近 ...

  9. 在服务器本地监控服务端口命令之ss

    在服务器本地监控服务端口命令之ss 当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢.可能你不会有 切身的感受,但当 ...

  10. 最大公约数gcd、最小公倍数lcm

    最大公约数(辗转相除法) 循环: int gcd(int a,int b) { int r; ) { r=b%a; b=a; a=r; } return b; } 递归: int gcd(int a, ...