初探Docker

本文旨在让大家了解什么是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

[[email protected] 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


[[email protected] /]# zip //先运行zip,发现是没有安装的

bash: zip: command not found

[[email protected] /]# yum install zip //安装zip

[[email protected] /]# 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


[[email protected] 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


[[email protected] 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


[[email protected] 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


[[email protected] image]# sudo docker run -t -i o2team-test:2 /bin/bash

[[email protected] /]# 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 <[email protected]>

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


[[email protected] 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


[[email protected] o2team-test]# docker tag test:1 a569171010/test:1

[[email protected] 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/

时间: 2024-10-11 01:08:00

初探Docker的相关文章

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

1.Docker Server简介 Docker架构中,Docker Server是Docker Daemon的重要组成部分.Docker Server最主要的功能是:接受用户通过Docker Client发送的请求,并按照相应的路由规则实现路由分发. 同时,Docker Server具备十分优秀的用户友好性,多种通信协议的支持大大降低Docker用户使用Docker的门槛.除此之外,Docker Server设计实现了详尽清晰的API接口,以供Docker用户选择使用.通信安全方面,Docke

docker 目录

编辑本目录 一.初探docker   编辑二.容器   编辑 三.数据管理  编辑 四.网络基础配置  编辑 五.使用Dockerfile创建镜像  编辑 原文地址:https://www.cnblogs.com/yaya625202/p/10251759.html

Flynn初探:基于Docker的PaaS平台

Flynn是一个开源的PaaS平台,可自动构建部署任何应用到Docker容器集群上运行,其功能特性与组件设计大量参考了传统的PaaS平台Heroku.本文旨在从使用动机.基本对象.层次架构.功能组件.基本工作流这几个方面对Flynn做总体的介绍. 为什么需要Flynn 为了便于理解Flynn的作用与功能,让我们先来看看应用程序从开发到构建再到部署再到运行分别需要经历的几个实体状态: 更具体一点,以一个Java程序为例来描述: 源代码:包括*.java.log4j.properties.pom.x

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

目录 Docker的使用初探(一):常用指令说明 为什么要用Docker Docker的安装与简单使用 国内镜像加速 常用指令 Docker的使用初探(一):常用指令说明 前几个星期实践的了,再不记录一下真的就忘干净了 Docker即容器技术,具体的介绍已经有很多,不打算赘述了,说一些优点 为什么要用Docker 对我个人来说,最大的优点就是在一台电脑上可以部署不同的环境而不用担心它们产生冲突,最常见的冲突就是端口占用,使用Docker技术可以很方便地规避这一问题,而且便于管理,我不用在本地处理

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

目录 Docker的使用初探(二):Docker与.NET Core的结合 添加Dockefile 1. 在创建项目时添加 2. 手动添加 3. 容器业务流程协调控制程序支持 Dockefile语法 Docker项目调试 仅添加文件的方式 容器业务流程协调控制程序支持 Docker的使用初探(二):Docker与.NET Core的结合 在二者的结合上,微软官方给予了很大的支持,从官方发布的一些文章和VS 2017在建立.NET Core项目时自带的Docker选项都可以看出来,这也与Core的

Docker Hub 使用初探

Docker Hub 使用初探 —— 魏刘宏 2019.10.26 容器的话题越来越热,今天我也来试试容器的使用,我们以 Docker Hub 为例. Docker Hub 官网为 https://hub.docker.com/ ,主要用于托管容器镜像,我们以 Linux 系统 centos 为例: 详细页面给出了拉取的命令,不带标签默认拉取最新的: 点击 View Available Tags 可查看所有标签,其中标签 7 应该就是标签 centos7 的简写: 我们在 Docker Hub

[docker]swarm初探

Docker新发布了swarm,machine,compose. 这里主要对swarm进行说明. 之前,用户需要对各个docker engine进行操作(发送rest消息或者执行docker命令). swarm则将一组docker enginge作为一个集群进行管理,并提供过了lablel,schedule,filter的能力. swarm保持了对docker原有API的兼容,我们可以像使用单一个docker engine一样管理一个docker engine集群. swarm还可以对集群中的节

Docker初探

近期虚拟化领域Docker炒的沸沸扬扬,一时间不晓得它究竟是个什么鬼~ 查阅许久.略微明确了点: 1,Docker是一种应用虚拟化技术,它是基于Linux内核提供的LXC技术实现的,而传统的虚拟化技术是基于CPU虚拟化的(当然,还有KVM等应用软件虚拟化,这里不讨论). CPU虚拟化是硬件提供的一种功能,在RING0下引入了RING-1. 因此它对于主流OS都是透明的.而Docker是基于Linux内核的LXC技术,这也注定了它上面仅仅能跑Linux的虚拟机,并且跑在上面的虚拟机看到的内核都是宿

[Docker][ansible-playbook]3 持续集成环境初探

预计阅读时间: 20分钟 本期解决痛点如下:1. 代码版本的多样性,编译环境的多样性如何解决?答案是使用docker,将不同的编译环境images统统打包到私有仓库上,根据需求进行下载,从宿主机上挂载volume到docker container上进行编译等操作2. 打包编译好的各个模块组件如何部署到不同的服务器上?答案是使用ansible-playbook,根据yml脚本进行部署,其服务器部署ip由统一的inventory配置文件控制(默认路径在 /etc/ansible/hosts) Tal