Home

cuipf blog

06 Jun 2017

Docker 介绍

docker概述

Docker是一个能够把开发的应用程序自动部署到容器的开源引擎; 由Docker公司(前dotcloud公司)团队编写, 基于Apache2.0开源授权协议发行。 Docker有哪些优势呢?

  • docker在虚拟化的容器执行环境中增加一个应用程序部署引擎;该引擎能够提供一个轻量,快速的环境能够运行开发者的程序;
  • 更加高效的利用系统资源;由于容器不需要进行硬件虚拟化和运行完整的操作系统等额外的开销;
  • 更快的启动速度;由于直接运行在宿主的内核,所以可以做到秒启动,大大的节约了开发,测试,部署的时间;
  • 一直的开发环境;由于开发,测试,生产环境不一致导致bug在我们工作中经常遇到; docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境的一致性;
  • 更加轻松的迁移;Docker可以在多个平台运行(物理机,虚拟机,公有云,私有云等等)并保证运行结果一致;
  • 更加轻松的维护与扩展;Docker使用的是分层存储和镜像技术,使得重复的部分复用更加简单,使得应用维护更新更加简单,基于基础镜像的扩展镜像也变得非常简单;

docker核心组件

  • Docker客户端和服务端
  • Docker镜像
  • Registry
  • Docker容器

Docker客户端和服务器

首先,你需要知道Docker也是一个客户-服务器(C/S)架构的程序。Docker客户端只需要向Docker服务器或守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker提供了一个命令行工具docker以及一整套RESTful API。Docker守护进程和客户端可以运行在同一台宿主机上也可以分别运行在不同的宿主机上。

Docker镜像

我们都知道操作系统分为内核和用户空间。对于Linux而言,内核启动后,会挂载root文件系统为其提供用户空间支持。而Docker镜像(image),就相当于一个root的文件系统。镜像是构建Docker的基石,所有的用户都是基于镜像来运行自己的容器的。

Registry

Docker使用Registry来保存用户构建的镜像,这样我们就可以在其他服务器上使用该镜像,Registry更像是一个集中存储和分发的服务;Registry分为公共和私有两种;

  • 公共Registry

    最常用的公开服务器就是官网的Docker Hub,这也是默认的Registry,并拥有大量的高质量的官方镜像。但是国内访问会有点慢,我这里使用的是[阿里云加速器](https://cr.console.aliyun.com);

  • 私有Registry

    当然也可以设置自己的私有Registry,官网提供的Docker Registry镜像可以作为私有的Registry服务,开源的Docker Registry镜像只提供了Docker Registry API的服务端实现,足以支持docker命令,不影响使用;

关于Docker Registry还有几点需要说明:

  • 每一个Docker Registry包含多个仓库(Registry);每个仓库可以包含多个标签(tag),每一个标签对应一个镜像;
  • 通常一个仓库包含同一个软件的不同版本的镜像,而标签就经常对应于软件的不同版本;可以通过<仓库名>:<标签>的格式来指定具体是这个软件的那个版本(如: Centos:5.6);如果缺省标签,将以latest作为默认的标签(Centos:latest);
  • 仓库经常以两段式路径形式出现,如:jwilder/nginx-proxy,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名;

Docker容器

  • 镜像(Image) 和容器(Container) 的关系,就像是面向对象程序设计中的实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等;
  • 容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间;
  • 容器拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。
  • 容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。

docker使用场景

docker安装

windows下安装

windows安装非常简单;

如果windows上装有VMware这些虚拟机,建议直接使用Docker Toolbox方式,因为Docker for windows使用了Hyper-v虚拟技术,而VMware又必须在Hyper-v关闭的条件下运行,再加上行hyper-v使用体验很糟糕,所以无论那种系统都建立使用Docker Toolbox方式;

使用Docker ToolBox安装Docker

docker toolbox是一个工具集,打开ToolBox的安装目录你会发现主要包含以下几个重要部分:

  • docker;docker客户端,用来运行docker引擎创建镜像和容器
  • docker-machine;可以让你在windows的命令行中运行docker引擎命令
  • docker-compose;用来运行docker-compose命令
  • Kitematic;这是Docker的GUI版,完全自动化了Docker安装和设置过程,并提供了一个直观的图形用户接口(GUI);
  • docker-quickstart-terminal;这是一个已经配置好Docker的命令行环境
  • Oracle VM Virtualbox;虚拟机

此时,如果你运行了docker-quickstart-terminal,会在Virtualbox中创建一个名为default的虚拟机,第一次运行会有点慢; 关于docker-machine命令介绍,可以在Windows PowerShell中运行:

  1. docker-machine ls 查看当前docker虚拟机的状态;
  2. docker-machine create –driver=virtualbox default 创建名字为default虚拟机;
  3. docker-machine env default 查看虚拟机default的环境变量;
  4. **docker-machine env default Invoke-Expression** 建立PowerShell和虚拟机里Docker的连接;

通过上面几条命令基本上Windows上docker环境就创建好了,但如果直接使用Docker hub的话,下载镜像会非常的慢,建议修改;修改加速器方式如下:

  1. docker-machine ssh default 登陆default虚拟机;
  2. 修改/var/lib/boot2docker/profile文件;
    sudo sed -i "s|EXTRA_ARGS='|EXTRA_ARGS='--registry-mirror=加速地址 |g" /var/lib/boot2docker/profile
    
  3. exit退出,然后docker-machine restart default重启;

如果没有其他错误出现,基本上windows上的docker就可以用了;

Centos下安装

执行安装脚本

Centos下安装docker比较简单,官网为了简化Docker的安装提供了安装脚本,直接执行脚本即可;

curl -sSL https://get.docker.com/ | sh

相应的阿里加速器也提供了相应的脚本:

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

添加yum源

修改配置文件/etc/yum.repos.d/docker-main.repo

[docker-main-repo]
name=Docker main Repository
baseurl=http://mirrors.aliyun.com/docker-engine/yum/repo/main/centos/7
enabled=1
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/docker-engine/yum/gpg

如果使用的上面安装脚本,这里脚本已经帮你修改完成,无需再修改;

安装与启动docker-engine

//安装
sudo yum update
sudo yum install docker-engine

//启动
sudo systemctl enable docker
sudo systemctl start docker

添加docker用户组

  • 建立docker组:sudo groupadd docker
  • 将当前用户加入docker组:sudo usermod -aG docker $USER

修改内核参数

如果遇到如下警告:

WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled

在/etc/sysctl.conf中添加如下两行即可:

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

加速器修改

编辑/etc/systemd/system/multi-user.target.wants/docker.service文件,修改文件中ExecStart=这一行,这行尾添加加速地址--registry-mirror=<加速地址>; 然后重新加载配置并且重新启动

sudo systemctl daemon-reload
sudo systemctl restart docker

经过上面几部,centos上docker安装完成,可以使用命令docker info查看是否安装成功;

Docker命令

关于docker命令的使用可以通过docker –help查看帮助;简单介绍几个用的较多的命令:

  • **docker pull <仓库名>:<版本> **;获取镜像;不加版本默认为latest版;下载过程中我们可以清楚看到镜像是由多层存储所构成。下载也是一层层的去下载;并且会给去每一层ID的前12位;
  • docker run 运行容器; 后面经常添加的参数:
    1. -it -i表示交互式操作; -t表示终端,如果我们想要进入bash执行一些命令并查看返回结果就可以使用这个;
    2. --rm 容器退出之后,立即删除;
    3. --name 添加运行容器的名字,如不添加系统会给你随机自动分配一个;
    4. -d 容器后台运行;
    5. --restart=always 表示自动重启该容器;
  • docker images 查看已经下载镜像的列表;支持添加-f过滤;
  • docker ps 查看系统运行镜像的详细信息;-a查看全部镜像信息;
  • docker logs 查看容器的日志;
      //web为容器名
      docker logs web             //显示容器web的日志
      docker logs --tail 10 web   //显示容器web的最后10条日志;
      docker logs -tf web         //显示容器web的最新日志并添加时间戳;
    
  • docker attach 附着到正在运行的容器上;后面可以添加容器名字或者容器ID;
  • docker top 查看容器内的进程;
  • docker exec 在容器内部运行进程;
      docker exec -d web touch /ect/config.conf  //-d 表示在后台运行一个进程 后面添加容器名字,添加运行指令;
      docker exec -i -t web /bin/bash            // 打开shell交互
    
  • docker start/stop/restart/ 容器的启动/停止/重启;
  • docker inspect 获取容器更加详细的信息;
  • docker rm 删除容器;
      docker rm `docker ps -a -q` //删除全部容器
    
  • docker search 搜索可用容器,后加容器名字;

cuipf

scribble