Docker是用于开发、装载和运行应用的开放平台。Docker项目的目标是实现轻量的操作系统级虚拟化解决方案,它提供了一种在容器中安全隔离地运行应用程序的方式。可以在宿主机上运行多个容器。

Docker的基础是Linux容器(LXC)等技术。在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作Docker的容器就像操作一个快速轻量级的虚拟机一样简单。

一:Docker架构

Docker使用客户端-服务器架构。Docker client与Docker daemon进行交互,向其发送命令,由Docker daemon执行构建、运行容器等任务。

Docker client和Docker daemon可以运行在同一台主机上,也可以连接远端的Docker daemon。Docker client和Docker daemon之间通过socker或者RESTful API进行通信。架构如下:

用户通过Docker client与Docker daemon交互。当执行docker XXX命令时,相当于启动了一个client,该client将消息发送给daemon,由daemon执行具体的任务。

Docker中有三个基本概念:镜像(Image)、容器(Container)、仓库(Repository)。理解了这三个概念,就理解了 Docker 的整个生命周期。

1:镜像

Docker镜像是一个只读的模板,是一个静态的概念。例如:一个镜像可以包含一个完整的ubuntu操作系统环境,里面安装了Apache或用户需要的其它应用程序。

使用镜像来创建 Docker容器。Docker利用容器来运行应用程序。

2:容器

容器是从镜像创建的运行实例,是一个动态的概念。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。

可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

3:仓库

仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。用户也可以在本地网络内创建一个私有仓库。

Docker中的镜像是一个只读的模板,每个镜像都是由一系列的层组成。Docker使用统一文件系统(union file systems)来将这些层整合成独立的镜像。统一文件系统使得多个文件系统上的文件和目录,透明的叠加在一起,形成一个完整的文件系统。

Docker如此轻量级的原因就是因为分层的概念。当改变一个Docker镜像时,比如升级一个应用到新的版本,则只是构建了一个新的层,因此无需构建或替换整个镜像,只需要增加新的层就可以了。

容器中包含了操作系统环境、用户文件以及元数据。容器从镜像中创建,镜像是只读的,当运行容器时,Docker向镜像的顶部添加了一个可读写的层,从而可以运行应用程序了。

当执行下面的命令时:

$ docker run -i -t ubuntu /bin/bash

首先可执行程序docker启动一个Docker客户端,选项run用于启动一个新的容器。Docker客户端通知Docker daemon执行以下过程来运行容器:

1:使用ubuntu作为构建容器的镜像;

2:当容器加载后,在容器中执行/bin/bash命令,启动一个BASH  shell。

Docker daemon具体的执行步骤是:

1:检查镜像是否存在。首先检查本地是否具有ubuntu镜像,如果不存在,则从Docker Hub上查找并下载。如果本地已经有ubuntu镜像了,则使用它构建容器;

2:创建新容器;

3:分配一个文件系统,并mount一个可读写的层。容器就在该文件系统上构建,并在镜像上添加了一个可读写的新层。

4:分配一个网络接口。创建网络接口用于与宿主机通信。

5:分配一个IP地址。从池中寻找一个可用的IP地址并分配给网络接口。

6:运行指定的应用程序;

7:捕获应用程序的输出。连接并且记录标准输入、标准输出以及标准错误输出。

二:安装

运行docker,内核需要至少是3.10以上。

1:使用curl安装

$ curl -fsSL https://get.docker.com/ | sh

2:使用yum安装

$ yum update
$ tee /etc/yum.repos.d/docker.repo <<EOF
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF $ yum install docker-engine
$ service docker start

 

验证docker是否安装成功

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
535020c3e8ad: Pull complete
af340544ed62: Pull complete
Digest: sha256:a68868bfe696c00866942e8f5ca39e3e31b79c1e50feaee4ce5e28df2f051d5c
Status: Downloaded newer image for hello-world:latest Hello from Docker.
This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps:
1. The Docker Engine CLI client contacted the Docker Engine daemon.
2. The Docker Engine daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker Engine daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker Engine daemon streamed that output to the Docker Engine CLI client, which sent it
to your terminal. To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker Hub account:
https://hub.docker.com For more examples and ideas, visit:
https://docs.docker.com/userguide/

三:问题

1:运行容器时,下载image失败,需要设置代理:

$ mkdir /etc/systemd/system/docker.service.d
$ tee /etc/systemd/system/docker.service.d/http-proxy.conf << EOF
> [Service]
> Environment="HTTP_PROXY=http://192.168.20.22:1888" "NO_PROXY=localhost,127.0.0.1"
> EOF $ systemctl daemon-reload
$ systemctl restart docker

参考:https://docs.docker.com/engine/admin/systemd/#http-proxy

2:启动docker失败:

Error starting daemon: Error initializing network controller: Error creating default \"bridge\" network: Failed to setup IP tables, cannot acquire Interface address: Interface docker0 has no IPv4 addresses"

原因:可能是之前安装docker未卸载干净

解决:删除docker0网桥:

$ ifconfig docker0 down
$ brctl delbr docker0

https://docs.docker.com/engine/understanding-docker/

https://docs.docker.com/engine/installation/linux/rhel/

00docker安装和简介的更多相关文章

  1. InfluxDB学习之InfluxDB的安装和简介

    最近用到了 InfluxDB,在此记录下学习过程,同时也希望能够帮助到其他学习的同学. 本文主要介绍InfluxDB的功能特点以及influxDB的安装过程.更多InfluxDB详细教程请看:Infl ...

  2. 第二百九十一节,RabbitMQ多设备消息队列-安装与简介

    RabbitMQ多设备消息队列-安装与简介 RabbitMQ简介 解释RabbitMQ,就不得不提到AMQP(Advanced Message Queuing Protocol)协议. AMQP协议是 ...

  3. (转)阿里 RocketMQ 安装与简介

    原文:阿里 RocketMQ 安装与简介 一.简介 官方简介: l  RocketMQ是一款分布式.队列模型的消息中间件,具有以下特点: l  能够保证严格的消息顺序 l  提供丰富的消息拉取模式 l ...

  4. 尚硅谷Docker---docker安装及简介

    尚硅谷Docker---docker安装及简介 一.总结 一句话总结: docker就相当于是一个极微型的linux系统,独立 1.使用Docker的步骤? 1).安装Docker 2).去Docke ...

  5. 1.Cobaltstrike 安装与简介

    1.Cobaltstrike 安装与简介 一.简介 Cobalt Strike是一款美国Red Team开发的渗透测试神器,常被业界人内称为CS.自去年起, Cobaltstrike升级到3.0版本, ...

  6. Spark学习(一) -- Spark安装及简介

    标签(空格分隔): Spark 学习中的知识点:函数式编程.泛型编程.面向对象.并行编程. 任何工具的产生都会涉及这几个问题: 现实问题是什么? 理论模型的提出. 工程实现. 思考: 数据规模达到一台 ...

  7. 阿里 RocketMQ 安装与简介

    一.简介 官方简介: l  RocketMQ是一款分布式.队列模型的消息中间件,具有以下特点: l  能够保证严格的消息顺序 l  提供丰富的消息拉取模式 l  高效的订阅者水平扩展能力 l  实时的 ...

  8. flume1.5.2安装与简介

    关于flume的简介看参考:http://www.aboutyun.com/thread-7415-1-1.html 其实一张图就简单明了了 简单安装: 1.下载解压 ... 2.配置JDK,flum ...

  9. LR实战之Discuz开源论坛——安装及简介

    想了很久,也许是因为这段时间特别闲,从毕业到现在,我的测试职业生涯也近两年了,发现自己越来越喜欢测试领域,也越来越偏向测试开发了,作为一名专业的测试人员,不得不要学习性能测试,而使用LoadRunne ...

随机推荐

  1. ECMAScript 6 (浅显入门)

    1.let:ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. var命令会发生”变量提升“现象,即变量可以在声明之前使用,值为unde ...

  2. Chai.js断言库API中文文档

    基于chai.js官方API文档翻译.仅列出BDD风格的expect/should API.TDD风格的Assert API由于不打算使用,暂时不放,后续可能会更新. BDD expect和shoul ...

  3. 利用Nginx轻松实现Ajax的跨域请求(前后端分离开发调试必备神技)

    利用Nginx轻松实现浏览器中Ajax的跨域请求(前后端分离开发调试必备神技) 前言 为什么会出现跨域? 造成跨域问题的原因是因为浏览器受到同源策略的限制,也就是说js只能访问和操作自己域下的资源,不 ...

  4. git bash 常用操作文件命令行

    1, cd : change directory的简写,改变目录的意思,就是切换到哪个目录下, 如 cd e:\fff 切换 E 盘下面的fff 目录. 当我们用cd 进入文件夹时,我们可以使用 通配 ...

  5. warning: deprecated conversion from string constant to 'char*

    warning: deprecated conversion from string constant to 'char* #include<iostream> using namespa ...

  6. 直接在安装了redis的Linux机器上操作redis数据存储类型--List类型

    一.概述: 在Redis中,List类型是按照插入顺序排序的字符串链表.和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素.在插入时,如果该键并不存在,Redis ...

  7. php 获取一张图片所有点的颜色值

    image_all_rgb.php <?php //similar_text($numStr, $val, $pre); //计算两个字符串的相似度 //print_r($pre); $imgP ...

  8. Node.js调试技巧

    1. console.log 跟前端调试相同,通过一步步打印相关变量进行代码调试 2. 使用Node.js内置的调试器 通过node debug xxx.js来进行调试: [root@~/wade/n ...

  9. webpack学习之——Entry Points(入口起点)

    1.Entry property(entry属性) 1.1 Single Entry (Shorthand) Syntax(单个入口语法) 用法:entry: string | Array<st ...

  10. 深入剖析Redis RDN持久化机制

    rdb是redis保存内存数据到磁盘数据的其中一种方式(另一种是AOF).Rdb的主要原理就是在某个时间点把内存中的所有数据的快照保存一份到磁盘上.在条件达到时通过fork一个子进程把内存中的数据写到 ...