Docker & k8s 系列一:快速上手docker
本篇文章将会讲解: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/2和Step 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有如下三个步骤:
- 注册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 系列四:集群,扩容,升级,回滚

Docker & k8s 系列一:快速上手docker的更多相关文章
- docker实战系列之快速删除docker中的容器
1.停用全部运行中的容器 docker stop $(docker ps -q) 2.删除全部容器 docker rm $(docker ps -aq) 3.停用并删除容器 docker stop $ ...
- Docker & k8s 系列二:本机k8s环境搭建
本篇将会讲解k8s是什么?本机k8s环境搭建,部署一个pod并演示几个kubectl命令,k8s dashboard安装. k8s是什么 k8s是kubernetes的简写,它是一个全新的基于容器技术 ...
- Docker & k8s 系列三:在k8s中部署单个服务实例
本章将会讲解: pod的概念,以及如何向k8s中部署一个单体应用实例. 在上面的篇幅中,我们了解了docker,并制作.运行了docker镜像,然后将镜像发布至中央仓库了.然后又搭建了本机的k8s环境 ...
- 用Docker在一台笔记本电脑上搭建一个具有10个节点7种角色的Hadoop集群(上)-快速上手Docker
如果想在一台电脑上搭建一个多节点的Hadoop集群,传统的方式是使用多个虚拟机.但这种方式占用的资源比较多,一台笔记本能同时运行的虚拟机的数量是很有限的.这个时候我们可以使用Docker.Docker ...
- 30分钟快速上手Docker,看这篇就对了!
一.历史演化 1.演化史 2.物理机时代 2.1.图解 一个物理机上安装操作系统,然后直接运行我们的软件.也就是说你电脑上直接跑了一个软件,并没有开虚拟机什么的,资源极其浪费. 2.2.缺点 部署慢 ...
- Docker入门系列之二:Docker术语
原文作者:Jeff Hale 原文地址:https://towardsdatascience.com/learn-enough-docker-to-be-useful-1c40ea269fa8 翻译: ...
- Docker概念学习系列之为什么使用docker?(3)
不多说,直接上干货! 见[博主]撰写的https://mp.weixin.qq.com/s/FFSIOSecVdAr_aSDIFZwSA Docker容器虚拟化的优点: (1)环境隔离: 通过cgro ...
- 【转】.Net程序员玩转Android系列之三~快速上手
原文:http://www.cnblogs.com/HouZhiHouJueBlogs/p/3962122.html 快速环境搭建和Hello World 第一步:JAVA SDK(JDK)的安装: ...
- Docker学习系列(三)Docker搭建gitlab的两种方式
一.直接下载docker-ce 1.拉取gitlab/gitlab-ce Randy:~ Randy$ docker pull gitlab/gitlab-ce Using default tag: ...
随机推荐
- redis: Set集合类型(五)
Set里面的值是不能重复的 Set设置值(头部):sadd myset hello Set获取值:smembers myset 检查Set是否包含某个元素:sismember myset hello ...
- Redis 5.0.9 安装
目录 系统环境 系统版本 内核版本 安装步骤 安装 gcc 依赖 下载 Redis 解压 Redis 切换到 redis 解压目录下,执行编译 指定目录安装 启动 Redis 服务 最后 系统环境 系 ...
- Java标识符中常见的命名规则
标识符:就是给类,接口,方法,变量等起名字.组成规则:A:英文字母大小写B:数字字符C:$和_注意事项:A:不能以数字开头B:不能使Java中的关键字C:Java语言严格区分大小写常见的命名规则:见名 ...
- 在Eclipse上实现简单的JDBC增删查改操作
在Javaweb的学习里,学到了如何完成简单的增删查改操作,在这里撰写一篇文章以便自己整理回忆. 首先要建立一些包和导入一些文件.建一些类.具体框架如图 编写Product类 public clas ...
- 易学又实用的新特性:for...of
今天带来的知识点既简单又使用,是不是感觉非常的棒啊,OK,不多说了,咱们开始往下看. for...of 是什么 for...of 一种用于遍历数据结构的方法.它可遍历的对象包括数组,对象,字符串,se ...
- (转)对 Linux 专家非常有用的 20 个命令
谢谢你你给了我们在这篇文章前两个部分的喜欢,美言和支持.在第一部分文章中我们讨论了那些都只是切换到 Linux 和linux新手所需的必要知识的用户的命令. 对 Linux 新手非常有用的 20 个命 ...
- PIL库的学习总结及生成GIF
一.PIL库的概述 PIL(Python Image Library)库是Python语言的第三方库,需要通过pip工具安装. 打开cmd,输入 pip install pillow PIL库支持图像 ...
- 一款被大厂选用的 Hexo 博客主题
首先这是一篇自吹自擂的文章,主题是由多位非前端程序员共同开发,目前经过一年半的迭代已经到达 v1.8.0 版本,并且获得大量认可,甚至某大厂员工已经选用作为内部博客,因此我决定写这篇文章向更多人安利它 ...
- 计算4的n次幂html代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Simple Math Problems
整理下<算法笔记>,方便查看. 一.最大公约数&最小公倍数 欧几里得定理:设a,b均为正整数,那么gcd(a,b)=gcd(b,a%b). 若,定理就先交换a和b. 注意:0和任意 ...