一.docker简介:

docker是容器技术的一个代表,而容器技术是将程序打包和隔离的一种技术,其实它并不是一个新技术,之前在linux内核中早已存在,真正被大众所用所了解是因为docker的出现。docker之所以流行起来,是因为解决了一些计算机领域的痛点,它解决了软件包装的问题,保证开发与运维及测试环境的一致。docker可以将任何应用以轻量级容器的形式来打包,迁移发布和运行。可以简单的认为是一个轻量级的虚拟机,但是也不算是虚拟机。

  2013年docker开源,它跨平台,支持windows,Mac,Linux系统。Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎.

  docker官网:https://www.docker.com/

  docker的github托管地址:https://github.com/docker

  docker官方文档:https://docs.docker.com/get-started/

  

二. Docker思想:

    1.集装箱

     docker的logo是一个鲸鱼上面装着很多集装箱,想象下在没有集装箱之前,运输货物非常零散,没有规矩,运输过程中说不定有些东西会掉了,优良集装箱,所有货物就被密封在集装箱中,集装箱很大也不容易丢失,这样就保证了我们货物的安全原样的送到目的地。那么我们可以把货物想象成我们的程序,假如能把一台机器上的程序部署到新的一台机器上,那么会拷贝过去,但是这过程中有可能会因为人为的疏忽少拷贝了一些配置文件或者相关文件,导致在另一台机器上程序启动不起来。有了docker的集装箱就是帮我们解决这样的问题,它会保证我们的程序不管在哪运行不会缺少应有的东西。

    2.标准化

    可以从三个方面解释标准化,1.运输方式的标准化。2.存储方式标准化。3.Api接口标准化。

    3.隔离

     docker是一种轻量级容器,它有自己的一套内部环境,比如cpu,内存,磁盘等,可以隔离外面主机。docker使用了LXC技术来实现这种独立的环境,LXC又名Linux container,是一种虚拟化的解决方案,这种是内核级的虚拟化,这是一种轻量级的容器虚拟化,可以实现docker环境的快速建立,销毁。

三.docker能解决哪些问题

    1.解决环境不一致:

      经常遇到开发在本地运行没错,测试那边运行同一个程序出现问题。出现这种问题一般都是运行环境不一致导致的。一个应用程序运行需要一系列的依赖,如操作系统,web服务器,相关的配置文件,对应的编程语言的代码及相应程序解释器等等,如果其中一个变了程序就有可能失败,比如程序调用了一些系统命令,但是换个环境没有这些命令,那么就会导致程序启动失败,程序的版本也会导致程序的错误,如php7和php5.3语法就有些不一样。

    而docker就会把所有所需要的配置文件,程序代码等所需要的一切环境打包到一个集装箱中,相当于把开发环境打了一个包,这个包环境和开发的本地的环境一摸一样,这样就保证了运行环境的一致性,这个包就可以被测试引用到他本地运行,所以docker就是解决环境不一致的问题。

    2.程序隔离

      Linux是多用户系统,上面可以运行多种程序和服务,当其中一个程序或服务运行出现故障时候,消耗很多cpu,或者大量IO操作,占用大量内存,会牵连服务器上的其他运行中的软件,而docker可以避免这种情况出现。因为docker本身就是一个个独立隔离的环境,在docker启动的时候就会被限定使用多大的内存及其他资源使用限度,所以docker环境里的程序出现问题也会只是影响这个docker里的程序,不会影响其他服务和程序。

    3.资源快速扩张和弹性伸缩

      现在电商系统经常会有秒杀活动,还有双十一,618这样特别的促销活动。每当这样的节日来临时候,电商系统都会面临大量的访问,所以需要更多的软硬件资源去应对这样大量的访问量,而平时却不需要这么多的服务器,不如也会造成极大的浪费,所以在节假日来临前扩充可以应对节日所需要的服务器数量,节日之后在将这些多余的服务器下线,但是这会给运维带来非常大的工作量,因为运维需要分别给每台机器搭建环境配置所需要点一切软件,并且还得调试,这是一个非常繁琐的过程。但是docker让这些事变得简单,只需要通过docker管理软件点击鼠标配置下,就会立马从10台服务器变成100台或者更多。

 四.docker核心技术

    docker里面有三个核心的词汇镜像,仓库,容器,镜像是上面例子中的集装箱,仓库是存放镜像的地方,容器是运行程序的地方。docker运行一个程序的过程就是去仓库把镜像拉到本地,然后用docker命令在本地把docker运行起来。

    1.镜像(image):从本质上来说镜像就是一系列的文件,可以包括应用程序的文件,也可以包括运行环境的文件,这些镜像文件用一种特殊的文件格式来保存。linux有种存储技术叫做联合文件系统(Union File System),这是一种分层的文件系统,可以将不同的文件目录挂载在同一个虚拟文件系统下。怎么理解呢,下面有个例子。

songguojundeMBP:~ songguojun$ ls dir1    //在dir1目录下看到下面三个目录
Desktop Downloads Movies
songguojundeMBP:~ songguojun$ ls dir2 //在dir2目录下看到下面另外三个目录
code Documents Library
songguojundeMBP:~ songguojun$ ls dir //联合文件系统中,在dir目录下看到下面六个目录,也就是上面两个目录共同的目录文件集合
Desktop Downloads Movies code Documents Library

    其实就是联合在不同磁盘上的不同的文件系统到一个公共目录下。通过联合文件系统可以实现文件的分层,docker镜像就是利用这种分层的概念来实现镜像存储。下面这张图就是镜像存储格式。

    

    在Docker镜像分为基础镜像和父镜像,没有父镜像的镜像被称为基础镜像。用户是基于基础镜像来制作各种不同的应用镜像。这些应用镜像共享同一个基础镜像层,提高了存储效率。

    2.容器(container)

      容器的本质就是一个运行在服务器上的进程,docker镜像中的每一层文件都是只读的,只有最上面一层上可写的,这一层就是容器,容器这一层是可写的,当容器对下一层的镜像去写东西,会将下一层的镜像中要修改的文件拷贝一份到最上层容器中,然后在对它修改,修改之后当程序读取这个最新的文件,因为程序读取会从最顶层开始查找。由于镜像是不可以修改的,所以同一个容器可以生成多个容器独立运行,它们之间没有任何干扰。

    镜像和容器区别:

      镜像其实是有多个只读层,它们重叠在一起,除了最上面一层可写其它都是只读模板,而容器就是镜像的一个运行实例。一个镜像可以创建很多容器。用编程语言来举例,镜像相当于类,而容器相当于类的一个实例。

    3.仓库(repository)

      仓库就是存放镜像的地方,可以使用docker pull命令从docker hub拉取我们需要的镜像,进行操作。docker有官方等其他公司提供的镜像中心,也支持搭建自己私有的镜像中心。

      常用仓库地址列表:

        hub.docker.com (docker官方仓库)

        c.163.com(网易蜂巢)

        hub.docker.com 里面常用镜像列表

        

五.Docker 架构

  

                docker架构图(生命周期图)

1.DOCKER_HOST:docker操作宿主机,上面运行了Docker daemon核心程序,负责各种docker操作,比如下载docker镜像或者运行一个容器。

2.Client:客户端用命令和Docker daemon交互,比如pull,build ,run等,交给Docker daemon来操作,和远端镜像仓库交互。

3.Registry:公司的sass服务,是存放 Docker 镜像的仓库,Docker daemon可以和Registry交互。

docker工作流程:

  通过docker build将镜像打包出来,在通过docker push将镜像推送到镜像仓库中。

通过docker run向Docker Daemon发出指令运行镜像。

  

 六.docker的安装

  安装docker先看下centos版本

[root@localhost ~]# uname -r
3.10.-514.21..el7.x86_64

  第一个命令,下载

wget -qO- https://get.docker.com/ | sh

   下载完后,docker默认情况是允许root去运行,所有建议添加一个用户到docker组

  先查看用户组

cat /etc/group

  我们添加一个用户

[root@localhost docker]# usermod -aG docker songguojun

  #groups 查看当前登录用户的组内成员

  查看加入情况

cat /etc/group

  查看docker是否安装成功

docker info

  如果出现下面命令

  说明docker服务没有启动

  我们启动下

service docker start

  在执行 docker info

  docker安装成功

  我们可以直接输入docker命令 查看docker命令的选项

  我们看到里面有个run参数,意思是在一个新容器中执行命令,可以单独查看这个参数意思

[root@localhost ~]# docker run --help

Usage:    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Run a command in a new container

Options:
--add-host list Add a custom host-to-IP mapping (host:ip)
-a, --attach list Attach to STDIN, STDOUT or STDERR
--blkio-weight uint16 Block IO (relative weight), between and , or to disable (default )
--blkio-weight-device list Block IO weight (relative device weight) (default [])
--cap-add list Add Linux capabilities
--cap-drop list Drop Linux capabilities
--cgroup-parent string Optional parent cgroup for the container
--cidfile string Write the container ID to the file
--cpu-period int Limit CPU CFS (Completely Fair Scheduler) period
--cpu-quota int Limit CPU CFS (Completely Fair Scheduler) quota
--cpu-rt-period int Limit CPU real-time period in microseconds

docker window安装:https://docs.docker.com/docker-for-windows/install/

    Mac安装:https://docs.docker.com/docker-for-mac/install/

    更多安装参考: http://www.docker.org.cn/book/install/supported-platform-17.html

七.docker的初使用

  我们先输入以下命令

songguojundeMBP:java songguojun$ docker run centos echo  hello docker   #这个命令作用是用docker运行centos镜像 并输出hello docker字符串
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos                      #在docker运行镜像前会查看本地环境是否有这个要运行等镜像 这里就是查看centos这个镜像,发现没有就从远端读取开始下载
8ba884070f61: Pull complete
Digest: sha256:b5e66c4651870a1ad435cd75922fe2cb943c9e973a9673822d1414824a1d0475
Status: Downloaded newer image for centos:latest              #镜像下载成功
hello docker                                    #输出字符串

查看本地有哪些镜像

songguojundeMBP: songguojun$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 9f38484d220f months ago 202MB

运行nginx服务

songguojundeMBP: songguojun$ docker run -p : -d daocloud.io/nginx    #-d参数代表守护进程
Unable to find image 'daocloud.io/nginx:latest' locally
latest: Pulling from nginx
743f2d6c1f65: Pull complete
6bfc4ec4420a: Pull complete
688a776db95f: Pull complete
Digest: sha256:e770165fef9e36b990882a4083d8ccf5e29e469a8609bb6b2e3b47d9510e2c8d
Status: Downloaded newer image for daocloud.io/nginx:latest
720bfbd6d9beaaea8b7bb9506c6e45345a4dcd29e6486a4798b4aa31488fba13

上面开启了本地nginx服务,我们在浏览器上输入http://localhost:8080/

查看当前运行的容器

songguojundeMBP: songguojun$ docker ps      #显示当前正在运行的容器   docker ps -a 列出所有的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
720bfbd6d9be daocloud.io/nginx "nginx -g 'daemon of…" seconds ago Up seconds 0.0.0.0:->/tcp quirky_blackwell

CONTAINER ID:容器id

PORTS:端口映射关系

修改nginx默认首页

songguojundeMBP:tmp songguojun$ cat index.html
<html>
<h1>hello docker</h1>
</html>
songguojundeMBP:tmp songguojun$ docker cp index.html 720bfbd6d9be://usr/share/nginx/html

再次查看

不过这个修改只是暂时的,当再次重启容器时候,之前的修改都会消失。

停止docker容器

songguojundeMBP:tmp songguojun$ docker stop 720bfbd6d9be
720bfbd6d9be

再次设置

[songguojundeMBP:tmp songguojun$ docker run -p : -d daocloud.io/nginx      # -d表示守护进程
3a69a07abb20cd12b238063ca8aaa6aa07d592266eb0e93d93ea9a0c15853375
[songguojundeMBP:tmp songguojun$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3a69a07abb20 daocloud.io/nginx "nginx -g 'daemon of…" seconds ago Up seconds 0.0.0.0:->/tcp festive_khorana
[songguojundeMBP:tmp songguojun$ docker cp index.html 3a69a07abb20://usr/share/nginx/html
[songguojundeMBP:tmp songguojun$ docker commit -m 'fun' 3a69a07abb20 nginx-newimage     保存image
sha256:8c9627568f55f12c1fe8b561253ef89bdc58b6511f513b3de2759122dc4e6203 新产生的image的id
[songguojundeMBP:tmp songguojun$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx-newimage latest 8c9627568f55 seconds ago 109MB 这个是上面新产生的image
daocloud.io/nginx latest 53f3fd8007f7 weeks ago 109MB
centos latest 9f38484d220f months ago 202MB

启动容器并进入该容器中

songguojundeMBP:docker songguojun$ docker run -i -t centos /bin/bash   #启动一个centos容器及启动容器时候到命令 /bin/bash
[root@5ce0363609a4 /]# ls #当前centos容器环境 说明已经进入了 5ce0363609a4是容器的名字
anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

八.docker加速

 因为我们下载镜像默认都是从国外的https://hub.docker.com这个网站上下,比较慢。我们可以使用阿里云的docker镜像站点来加速镜像的下载,或者别的镜像加速也可以。

  根据你的系统来配置加速地址,当然先注册下

根据说明分为安装Docker Toolbox的用户和安装了Docker for Mac的用户。

1.安装Docker Toolbox的用户这里需要用到Docker machine这个工具,Docker machine 是docker官方提供的docker管理工具,它的命令行工具就是docker-machine。

看下我本机docker-machine版本

songguojundeMBP:local songguojun$ docker-machine version
docker-machine version 0.16., build cce350d7

2.安装了Docker for Mac的用户的

点击 Apply & Restart按钮,Docker会自己重启并应用配置的镜像加速器。如果是centos系统就service docker restart重启docker。

然后通过docker info命令查看是否配置成功。

九.为什么docker启动速度很快

启动一个docker容器速度很快,秒级别的,而启动一个虚拟机可能慢的需要一分钟,为什么他们两之间速度差别这么大。

  1.docker的抽象层比虚拟机更少,由于一个虚拟机是软件加上硬件是一个完整的系统,而docker不需要Hypervisor实现硬件资源的虚拟化,运行在docker的容器上的程序直接使用的就是实际物理机的硬件资源,因此在内存和cpu上的利用率docker会有明显的优势。

  2.docker利用的是宿主机的内核,而不需要Guest Os。因此当新建一个容器时候,docker不需要像虚拟机一样重新加载一个完整的操作系统内核,可以避免寻址,引导来加载操作系统这个比较费时的过程。而docker则直接利用宿主机的操作系统省略了这个过程,所以docker速度很快。

【docker】docker安装和使用的更多相关文章

  1. docker——容器安装tomcat

    写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...

  2. docker 启动安装等命令

    确认是否安装url whereis curl 启动docker服务: sudo service docker start sudo service docker stop 安装curl sudo ap ...

  3. Docker探索系列1之docker入门安装与操作

    preface docker这种时髦的技术我接触的比较晚,如果不是公司在使用这项技术,估计还得会更晚接触.好了,说下我司现在docker使用的情况.docker在我司是用来跑web服务的,里面的web ...

  4. DOCKER windows安装

    DOCKER windows安装 1.下载程序包 2. 设置环境变量 3. 启动DOCKERT 4. 分析start.sh 5. 利用SSH工具管理 6. 下载镜像 6.1 下载地址 6.2 用FTP ...

  5. 在docker里面安装部署应用

    最近一直在做docker的安装打包工作,学到不少东西,在博客里记一下. 环境centos6 ,docker 基础镜象centos6 1.创建本地基础镜象,安装基础命令包 (1)Dockerfile,D ...

  6. Docker Centos安装Redis以及问题处理

    之前一篇文章 Redis安装及主从配置 介绍了redis的安装配置,另一篇文件介绍了 Docker Centos安装Openssh .今天将两篇文件结合一下——在Docker Centos环境下搭建r ...

  7. Docker Centos安装Mysql5.6

    之前一篇随笔<Docker Centos安装Openssh> 写的是如何在基础的centos镜像中搭建ssh服务,在此基础上再搭建其他服务.本文继续介绍在centos_ssh基础上搭建my ...

  8. Docker的安装及简单使用

    1.  Docker的安装 (这里的“安装docker”其实就是安装Docker Engine) $ sudo apt-get intasll docker.io note: apt-get是ubun ...

  9. docker 下 安装rancher 笔记

    sudo yum update 更新系统环境 curl -sSL https://get.docker.com/ | sh 安装最新docker版本 systemctl start docker.se ...

  10. docker 的安装

    官方站点上有各种环境下的 安装指南,这里主要介绍下Ubuntu和CentOS系列的安装. Ubuntu 系列安装 Docker 通过系统自带包安装 Ubuntu 14.04 版本号系统中已经自带了 D ...

随机推荐

  1. excel vba 不可查看

    打击共享工作簿 去掉[允许多用户同事编辑,同事允许工作簿合并]

  2. 生成短链接的URL

    假设你想做一个像微博短链接那样的短链接服务,短链接服务生成的URL都非常短例如: http://t.cn/E70Piib, 我们应该都能想到链接中的E70Piib对应的就是存储长链接地址的数据记录的I ...

  3. js-cookie和session

    ###1.cookie 含义: 存储在访问者的计算机中的变量,即存储在客户端 创建一个cookie /* getCookie方法判断document.cookie对象中是否存有cookie,若有则判断 ...

  4. 并发包 concurrent(一) Atomic

    1:基础概念 悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁.传 ...

  5. apache benchmark 的简单安装与测试

    1. 下载apache benchmark Copy From https://blog.csdn.net/fyqaccpt96/article/details/43272001 yum instal ...

  6. Oracle列转行函数LISTAGG()

    --Oracle列转行函数LISTAGG() with tb_temp as( select 'China' 国家,'Wuhan' 城市 from dual union all select 'Chi ...

  7. vue的地图插件amap

    https://www.jianshu.com/p/0011996b81e2(amap) npm install vue-amap --save

  8. CLOUD添加自定义基础数据

    1.打开bos平台,文件-新建-复制-基础资料 2.新建目标对象 3.发布 4.开始新增对象 5.明细维护,完成 6.添加成功

  9. win10远程桌面连接提示身份验证错误,要求的函数不受支持的解决方案

    转自https://www.baidu.com/link?url=67JXh4h79mN47mEenuH_ElGkSh9_GdOiY-Xp9Ihw0_mQIZHrPx-HxY3EIm_nTZKPoRZ ...

  10. 相识mongodb

    1.下载完安装包,并解压下载地址:https://www.mongodb.org/dl/linux/x86_64或者可以直接wget http://fastdl.mongodb.org/linux/m ...