本文旨在让大家了解什么是Docker,并带领大家体验Docker使用的整个流程。

开启Docker学习之旅前,我们简单描述几个场景,应该很多人都有碰到过:

小凹同学开发了一个web应用,服务器环境是: centos 7 + nginx + node4.6 + mongodb3.2.3 最近要上线了。

【场景1】:刚好公司有一台服务器可以用,但是服务器上有一些其他服务,而且已经装了node3.31mongodb2.3,小凹蒙了,到底是直接升级环境呢?还是改一个适配低版本的应用呢?

【场景2】:终于花了很久时间部署上了,慢慢的项目需求越来越多,小凹的同事小凸也准备一起迭代这个项目,小凸又要重新配置一遍应用环境到本地做测试,随着越来越多的同事参与进来,每个人都要配置一遍本地测试环境,重复工作,时间又白白浪费掉。

【场景3】:随着项目越做越大,现有服务器配置和带宽已经不能满足了,小凹需要把这个项目迁移出去并做水平扩展,然后又得重复配置环境到多台服务器,而且这些服务器有可能还是会重复前面的场景1。

【场景4】:运维要清理一些服务器,整理出来,把没有完全利用的服务器,分给新的项目用,要罗列出来每台服务器的服务,然后删除掉不需要的,这时候发现完全无从下手。

上面的场景经常发生,也许就发生在你我身边,而且无比头疼,但对Docker来说解决这些问题都易如反掌,下面我们就一步步来了解并使用Docker。

什么是Docker?

Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metalOpenStack 集群和其他的基础应用平台。

官方的描述是:Build, Ship, and Run Any App, Anywhere 在任何地方部署,传输,运行任何应用。

其实很像虚拟机,但是跟虚拟机比起来 更灵活,速度更快,CPU/内存消耗更低,关键是更方便管理。

上图就是一张Docker层级图, 最下面是核心系统,文件系统等构成Dokcer底层,上面的是镜像(image),分为基础镜像和普通镜像,所有镜像可以直接启动生成一个实例(container),container我们可以理解为一个可以直接运行的虚拟机了。

其中基础image 启动后生成container,然后添加一些应用如 apacheemacs,可以通过提交操作直接生成普通的image。 我们可以共享这个image到任何地方,并启动它。

使用Docker

1.安装

Docker 可以安装在 LinuxMac OSWindows 上,详细安装步骤可以参考 官方安装文档 。

注:本文就不一一举例所有的安装方法,就以操作系统 centos 为例。

由于docker 只支持 centos6以上,64位的版本操作系统,所以安装前可以用以下命令查看服务器系统。

1
2
3
4
$ getconf LONG_BIT //查看操作系统是多少位
> 64
$ cat /etc/redhat-release //查看操作系统版本
> CentOS Linux release 7.0.1406 (Core)

上面是我使用的机器 centos7 64位系统,我就以这个为例讲下面的使用步骤。

1
2
$ curl -fsSL https://get.docker.com/ | sh //安装
$ docker version // 查看是否安装成功

如果 安装失败 可以尝试使用阿里云的代理安装。

1
$ curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -

其他更详细的阿里云Docker代理加速器文档,可以点击这里

安装成功后启动Docker,并设置开机启动。

1
2
$ sudo service docker start //开启Docker 服务
$ sudo chkconfig docker on //开机启动

获取基础镜像

注:假定我需要部署一个基于centos的应用,当然也可以换成别的,比如:Redis 或者 Ubuntu,可以是任何镜像来当做基础镜像,跟本机原有系统无关,只与所要部署的应用有关。

首先搜索需要获取的 镜像,这是官方Docker Hub提供的镜像资源。

比如,我选择获取 centos最新版本

1
$ docker pull centos //获取centos最近版本的镜像

使用命令 docker images 就能查到刚才获取的 centos 的镜像,如上图。

配置新的镜像

注:为了方便演示,假定我们的服务只需要安装一个zipcentos系统。

将上面获取的 centos 镜像,启动生成container,并在container中安装zip。

1
[root@AY130809220512304015Z image]# docker run -t -i centos /bin/bash

docker run 启动容器,-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用; -i:以交互模式运行容器,通常与 -t 同时使用;centos 为镜像名, 镜像名通常以 镜像名:版本 来使用,因为centos没有版本所以省略, 后面 /bin/bash 是启动container后运行的程序。

1
2
3
4
5
6
7
[root@e44ea4258885 /]# zip //先运行zip,发现是没有安装的
bash: zip: command not found
[root@90934d1f4225 /]# yum install zip //安装zip
[root@90934d1f4225 /]# zip //查看zip,安装成功
Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
Zip 3.0 (July 5th 2008). Usage:
...

使用container命令行安装zip成功。

1
[root@90934d1f4225 /]# exit

退出容器命令行,因为不是后台运行,所以退出后,container也随即关闭了。-d 可以让container在后台运行,并可以随时通过docker attach 命令进入容器,具体例子可以看这里,因为不是本文重点就不展开说明了。

docker ps 命令可以查看当前启动的 container, -a 启动和没启动的都会展示。

1
2
3
[root@AY130809220512304015Z image]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8f08b2b67380 centos "/bin/bash" 21 minutes ago Exited (0) 20 minutes ago lonely_euler

有一个id为 8f08b2b67380的container,这个就是我们刚才安装了zip,并退出的container。

1
2
[root@AY130809220512304015Z image]# docker commit -m "Added zip install" 8f08b2b67380 test:1
sha256:8f1d192a4ea2a80801e33cd5fadb5f37180bb718f729f77a404a347b977d753c

docker commit 将container提交生成image, -m:为描述, 后面紧接着的是container的id, test:1 是提交的镜像名称和版本。

1
2
3
4
[root@AY130809220512304015Z image]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test 1 8f1d192a4ea2 About a minute ago 266.7 MB
centos latest 0f0be3675ebb 7 days ago 196.6 MB

再查看的时候已经多了一个image了,这个image就是我们安装了zip的image,到此我们已经生成一个新的image。

我们可以直接通过这个新的镜像启动容器,还是前面介绍过的命令docker run 并测试下zip,如下:

1
2
3
4
5
[root@AY130809220512304015Z image]# sudo docker run -t -i o2team-test:2 /bin/bash
[root@2f1f28be351c /]# zip
Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
Zip 3.0 (July 5th 2008). Usage:
...

好了这个镜像已经制作完成,当然实际情况下,安装的肯定不仅仅只有zip这么简单。

但是在一个团队里,仅仅给我们image,我们可能不知道这个镜像到底做了什么,所以还有一种方法使用 配置文件Dockerfile,build出来一个镜像,这样更易于团队协作,下面我将介绍一下这种方式。

通过Dockerfile 配置新的image

开始之前顺便介绍删除image和container的命令,它们分别是docker rmi 删除image 和 docker rm 删除container,后面都是跟对应的id或者名称,为了后面的操作我们这里通过命令 docker rmi 8f1d192a4ea2 删除掉刚才建的image。

注:如果发现删不掉image,可能被某些容器引用了,可以通过上面介绍的docker ps -a查看container,并用 docker rm删除掉这个container

接着我们创建Dockerfile

1
2
3
$ mkdir o2team
$ cd o2team
$ touch Dockerfile

下面是 Dockerfile 中的内容

1
2
3
4
5
# Dockerfile for o2team
# http://aotu.io/
FROM centos
MAINTAINER lizhi <fanlizhi@jd.com>
RUN yum -y install zip

#为注释,FROM centos 为基础镜像来源,MAINTAINER为作者信息, RUN 则为 运行某些 命令,编辑完成后保存,然后我们就可以直接构建我们新的image,Dockerfile详细使用文档可以参看这里

1
[root@AY130809220512304015Z o2team-test]# docker build -t test:1 .

docker build就是通过Dockfile来创建一个新的Image,其中 -t:为新image的名字这里命名为test:1, "." 则会在当前的目录下找 Dockerfile 文件,当然这里也可以指定路径。

1
2
3
4
[root@AY130809220512304015Z o2team-test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test 1 8975f3fb142e 8 seconds ago 266.7 MB
centos latest 0f0be3675ebb 9 days ago 196.6 MB

就这样,通过docker images也能生成一个新的镜像了,这种用Dockerfile的方式更加适合团队使用,环境配置更清晰。

到这里,我们只需要管理我们的镜像就好了,比如同步镜像给其他人,或者其他机器。

其实docker就给我们提供了这样一整套的解决方案,我们可以把我们的镜像提交到 Docker Hub,类似 github一样的远程仓库,当我们需要的时候只需要 pull下来启动就好了。

提交

我们就把这个test镜像提交到Docker Hub

首先我们得先注册:https://hub.docker.com/

注册成功后就可以docker login登录了

1
2
3
4
5
[root@AY130809220512304015Z o2team-test]# docker login
> Username: a569171010
> Password: xxx
> Email: fanlizhi@jd.com
Login Succeeded

填完登录后就可以push了,注意这里push之前得确保名称是 youruser/xxx 比如我的用户名是 a569171010 所以我需要将刚才的image 重命名成 a569171010/test:1,这里可以用docker tag命令重命名。

1
2
[root@AY130809220512304015Z o2team-test]# docker tag test:1 a569171010/test:1
[root@AY130809220512304015Z o2team-test]# docker push a569171010/test:1

然后就发布出去了,在 Docker Hub 上就可以看到下面多了这一条记录,当我们要获取的时候就直接 docker pull a569171010/test就可以了,因为是公用库所以任何人都可以获取并使用。

我们已经基本熟悉,了解了整个Docker使用的流程,回过头来看看开始我们抛出的那几个曾经很棘手的问题,是不是都能迎刃而解呢?因为image的可移植和隔离性,我们不仅可以轻松迁移扩展,还能轻松了解现在机器上各个服务运行情况。

下图为Docker整个使用流程:

本文参考资料

Docker 官方文档 Docker 中文指南 dockone.io 国内比较活跃的Docker论坛 Docker 入门介绍 Docker github 阿里镜像使用文档 维基百科

还想了解的

这篇文章只是带领大家了解Docker的整个使用流程和体验,关于其他的一些细节问题比如:后台运行container,各container之间的通讯,端口映射,文件共享等都没有涉及到,最近docker1.1.0发布又有很多新的特性和性能优化,如果有兴趣的同学可以参考这些:

利用Docker构建开发环境 Docker-从入门到实践 Docker-学习资料 Docker 1.1.0新特性

感谢您的阅读,本文由 凹凸实验室 版权所有。如若转载,请注明出处:凹凸实验室(https://aotu.io/notes/2016/02/27/docker/

初探Docker的更多相关文章

  1. 初探Docker CentOS 7.9 2009 Mini 操作系统环境初始化 和Docker初始化

    初探docker 什么是docker?docker就是一种虚拟化技术,将一个服务虚拟化成一个拥有操作系统内核作为基石的快速使用服务.不用担心环境不同服务效果 不同. docker 官网可以从中央仓库中 ...

  2. Docker源码分析(五):Docker Server的创建

    1.Docker Server简介 Docker架构中,Docker Server是Docker Daemon的重要组成部分.Docker Server最主要的功能是:接受用户通过Docker Cli ...

  3. 服务器部署docker lnmp环境

    一.安装dockerDocker要求运行在Centos 7上,要求系统为64位,系统内核版本3.10以上 1.uname -an 查看当前系统版本 2.yum -y install docker 下载 ...

  4. Docker | 专栏文章整理🎉🎉

    Docker Docker系列文章基本已经更新完毕,这是我从去年的学习笔记中整理出来的. 笔记稍微有点杂乱.随意,把它们整理成文章花费了不少力气.整理的过程也是我的一个再次学习的过程,同时也是为了方便 ...

  5. [经验交流] Apache Mesos Docker集群初探

    前言 因工作需要,我对基于Apache Mesos 的 Docker 集群作了一点研究,并搭建了一套环境,以下是资料分享. 1. Apache Mesos概述 Apache Mesos是一款开源群集管 ...

  6. Docker的使用初探(二):Docker与.NET Core的结合

    目录 Docker的使用初探(二):Docker与.NET Core的结合 添加Dockefile 1. 在创建项目时添加 2. 手动添加 3. 容器业务流程协调控制程序支持 Dockefile语法 ...

  7. Docker的使用初探(一):常用指令说明

    目录 Docker的使用初探(一):常用指令说明 为什么要用Docker Docker的安装与简单使用 国内镜像加速 常用指令 Docker的使用初探(一):常用指令说明 前几个星期实践的了,再不记录 ...

  8. Docker Hub 使用初探

    Docker Hub 使用初探 —— 魏刘宏 2019.10.26 容器的话题越来越热,今天我也来试试容器的使用,我们以 Docker Hub 为例. Docker Hub 官网为 https://h ...

  9. docker 初探之简单安装 ----Windows10

    报错一 $ docker run hello-world Unable to find image 'hello-world:latest' locally Pulling repository do ...

随机推荐

  1. struts2 结果页面配置

    <result>标签: * 属性: * name:逻辑视图的名称 * type:结果页面类型. * dispatcher         :转发.默认值. * redirect       ...

  2. ios UIWindow 错误使用导致无法接收motionEnded(摇一摇)函数

    今天遇到一个问题,第一次运行程序时,- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event函数无法调用,第二次就好了 ...

  3. C++ 使用SQLite

    1.SQLite是一个完全独立的.不需要服务器.不要任何配置.支持SQL的.开源的文件数据库引擎.源代码和支持可以登录:http://www.sqlite.org/   1.1.下载sqlite3.d ...

  4. java web 学习 --第五天(Java三级考试)

    第四天的学习内容:http://www.cnblogs.com/tobecrazy/p/3454860.html Response对象 response对象主要是向客户端浏览器发送二进制数据,如输出C ...

  5. Effective C++ -----条款04:确定对象被使用前已被初始化

    为内置型对象进行手工初始化,因为C++不保证初始化它们. 构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作.初值列列出的成员变量,其排列次序应该和它们在class中的声明次序相同. 为免 ...

  6. poj 1102.LC-Display 解题报告

    题目链接:http://poj.org/problem?id=1102 题目意思:就是根据给出的格式 s 和 数字 n,输出数值 n 的 LCD 显示.数值 n 的每个数字要占据 s + 2 列 和 ...

  7. 【编程题目】查找最小的 k 个元素

    5.查找最小的 k 个元素(数组)题目:输入 n 个整数,输出其中最小的 k 个.例如输入 1,2,3,4,5,6,7 和 8 这 8 个数字,则最小的 4 个数字为 1,2,3 和 4. 算法里面学 ...

  8. cell分割线宽度不满屏处理

    if ([cell respondsToSelector:@selector(setSeparatorInset:)]) { [cell setSeparatorInset:UIEdgeInsetsZ ...

  9. 字符匹配算法之Boyer-Moore算法

    Boyer-Moore算法的精华是从后向前,取好后缀与坏后缀中的最大移动位移动搜索词,以达到最快速检索的效果. 详情参考:http://www.ruanyifeng.com/blog/2013/05/ ...

  10. LoadRunner 思考时间与事务响应时间的区别与关系

    LoadRunner 思考时间与事务响应时间的区别与关系   思考时间lr_think_time 就是一个事务要开始时思考的时间;比如 你要点击一个 登录按钮 我们都要点击这个按钮要先思考下 就是人为 ...