zoukankan      html  css  js  c++  java
  • 学习 Docker


    Docker简介

    一种虚拟容器技术。

    • 一种虚拟化分方案;
    • 操作系统级别的虚拟化;
    • 只能运行相同或相似内核的操作系统;
    • 依赖与linux内核特性:Namespace和Cgroups(Control Group)

    虚拟机技术和容器技术最大的区别就是对资源的占用。

    Docker目标

    • 提供简单轻量的建模方式
    • 职责的逻辑分离
    • 快速高效的开发生命周期
    • 鼓励使用面向服务的架构

    Docker使用场景

    • 使用Docker容器开发、测试、部署服务
    • 创建隔离的运行环境
    • 搭建测试环境
    • 构建多用户的平台即服务(PaaS)基础设施
    • 提供软件即服务(SaaS)应用程序
    • 高性能、超大规模的宿主机部署

    Docker的基本组成

    • Docker Client 客户端
    • Docker Daemon 守护进程
    • Docker Image 镜像
    • Docker Container 容器
    • Docker Registry 仓库

    Docker Client 客户端

    • C/S架构
    • 本地/远程调用

    Docker客户端向服务器端发出请求,也就是守护进程。守护进程处理完所有工作将结果返回给客户端。Docker客户端对服务器端的访问既可以在本地也可以在远程。

    客户端访问守护进程

    Docker Image 镜像

    • 容器的基石
    • 层叠的只读文件系统

    Docker镜像是容器的基石,保存了启动容器的条件,容器基于镜像启动和运行。 Docker镜像是一个层叠的只读文件系统,他的最底端是一个引导文件系统及bootfs。 Docker用户几乎永远都不会和引导文件系统有交互,实际上当一个容器启动后,bootfs会被移到内存中,引导文件将被卸载。

    Docker镜像的第二层是rootfs(root文件系统),位于引导文件系统之上,可以有多种操作系统。 在传统的linux系统中root文件系统最先会以只读的方式加载,当引导和启动完成后他才会被切换成读写模式。 但是在Docker里,root文件系统永远只能是只读,并且Docker会用联合加载系统在rootfs之上加载更多的只读文件系统。 联合加载只得是一次加载多个文件系统。但是在外面开来只有一个文件系统。联合加载会将各层文件系统加载到一起, 这样最终的文件系统会包含所有的文件及目录。Docker将这样的文件系统称为镜像。 一个镜像可以放到另一个镜像顶部,位于下面的镜像称为父镜像。以此类推,直到镜像栈的最底部。最底部的镜像称为基础镜像。 也就是bootfs文件系统。

    Docker Container 容器

    • 容器通过镜像来启动
    • 启动和执行阶段
    • 写时复制(copy on write)

    learn_docker_img_006

    一个容器中可以运行用户的一个或多个进程。当一个容器启动时,Docker会在镜像的最顶层增加一个读写文件系统,我们在Docker中运行的程序就是在这个层运行并执行的。第一次启动Docker时,读写层是空的,当文件发生变化后都会应用到这一层。比如修改一个文件,先将该文件从只读层复制到读写层,然后隐藏只读层,这就是Docker的写时复制。

    当创建一个容器时,Docker会创建一个镜像栈,在栈的最顶层增加读写层,这个读写层和下面的镜像层以及一些配置数据就构成了一个容器。 容器的这个特点及镜像分层,可以让我们快速的构建镜像,并运行包含我们自己的应用程序和服务的容器。

    Docker Registry 仓库

    • 共有
      • Docker Hub
    • 私有

    Docker用仓库来保存用户构建的镜像。

    learn_docker_img_002

    从上图可以看出,Docker客户端调用守护进程从而操作Docker的容器,而容器是通过镜像来创建的,而镜像又保存在仓库中。


    Docker容器的相关技术

    Docker依赖的Linux内核特性

    • Namespaces 命名空间
    • Control groups(cgroups)控制组

    Namespaces 命名空间

    • PID(Process ID) 进程隔离
    • NET(Network) 管理网络接口
    • IPC(Inter Process Communication) 管理跨进程通信的访问
    • MNT(Mount) 管理挂载点
    • UTS(Unix Timeshring System) 隔离内核和版本标识

    编程语言中命名空间实现封装,即代码隔离。 操作系统中命名空间实现系统资源的隔离,进程、网络、文件系统...

    各种隔离的资源时如何管理起来的,这就用到了Cgroups。

    Control groups(cgroups)控制组

    • 资源限制
    • 优先级设定
    • 资源计量
    • 资源控制

    Docker容器的能力

    • 文件系统隔离:每个容器都有自己的root文件系统
    • 进程隔离:每个容器都运行在自己的进程环境中
    • 网络隔离:容器间的虚拟网络接口和IP地址都是分开的
    • 资源隔离和分组:使用Cgroups将CPU和内存等资源独立分配给每个Docker容器

    在 Ubuntu 中安装 Docker

    安装前的检查

    • 内核版本

        $ uname -a
      
    • 检查Device Mapper

        $ ls -l /sys/class/misc/device-mapper
      

    Ubuntu中安装Docker的方式

    • 安装Ubuntu维护的版本

        $ sudo apt-get install -y docker.io
        $ source /etc/bash_completion.d/docker.io
      
    • 安装Docker维护的版本

      1. 检查APT对HTTPS的支持,查看/usr/lib/apt/methods/https文件是否存在。如果不存在,运行安装命令。

          $ apt-get update
          $ apt-get install -y apt-transport-https
        
      2. 添加Docker的APT仓库

          $ echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list
        
      3. 添加仓库的key

          $ apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
        
      4. 安装

          $ apt-get update
          $ apt-get install -y lxc-docker
        
    • 安装Docker维护的版本(简易步骤,使用Docker提供的sh脚本)

        $ sudo apt-get install -y curl
        $ curl -sSL https://get.docker.io/ubuntu/ | sudo sh
      

      启动docker若出现下面错误:

        FATA[0000] Error loading docker apparmor profile: fork/exec /sbin/apparmor_parser: no such file or directory ()
      

      请安装apparmor软件即可

        $ sudo apt-get install apparmor
      

    使用非root用户运行Docker

    一般安装完Docker运行时需要加sudo来操作,其实可以增加用户归属的用户组来实现不用root权限运行Docker。

    1. 添加名字为docker的用户组

       $ sudo groupadd docker
      
    2. 将当前用户添加到当前用户组中

        $ sudo gpasswd -a ${user} dokcer
      
    3. 重新启动docker服务

        $ sudo service docker restart
      

    针对当前用户不会立马生效,需要注销后重新登录以获取用户组权限。


    在 Windows 中安装 Docker

    使用虚拟机实现,守护进程在虚拟机中。

    learn_docker_img_003


    在 OS X 中安装 Docker

    learn_docker_img_004

    在OS X 上Docker的运行环境

    在OS X上安装Docker前我们先看一下Docker的运行要求.

    • Linux容器技术
    • 操作系统级别的虚拟化
    • 依赖于linux内核的Namespaces和Cgroups

    Boot2Docker

    OS X的内核是Unix,而且一般root用户苹果是不给用户的。所以要运行Docker在OS X上和在Windows上一样,需要借助虚拟机来实现。

    • 轻量级的Linux发行版,为Docker定制
    • Virtualbox VM
    • Docker客户端
    • 管理工具

    安装前的检查

    • 系统要求:OS X 10.6 "Snow Leopard"以上版本

    安装步骤

    • 访问github上的Boot2Docker

        https://github.com/boot2docker/boot2docker
      
    • 下载Boot2Docker-1.7.0.pkg
    • 安装Boot2Docker-1.7.0.pkg

    Boot2Docker的启动过程

    • 打开命令行窗口
    • 创建 $HOME/.boot2docker/目录
    • 创建VirtualBox ISO
    • 启动虚拟机并运行Docker守护进程

    Boot2Docker的启动命令

    • $ mkdir -p ~/.boot2docker
    • $ if [ ! -f ~/.boot2docker/boot2docker.iso ]; then cp /usr/local/share/boot2docker/boot2docker.iso ~/.boot2docker/ ; fi
    • $ /usr/local/bin/boot2docker init
    • $ /usr/local/bin/boot2docker up
    • $ /usr/local/bin/boot2docker shellinit
    • $ docker version

    learn_docker_img_005

    验证Boot2Docker及Docker安装成功

    • 运行命令 $ docker run ubuntu echo hello world 如果打印如下日志,说明安装成功

        bash-3.2$ docker run ubuntu echo hello world
        Unable to find image 'ubuntu:latest' locally
        latest: Pulling from ubuntu
        428b411c28f0: Pull complete 
        435050075b3f: Pull complete 
        9fd3c8c9af32: Pull complete 
        6d4946999d4f: Already exists 
        ubuntu:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
        Digest: sha256:45e42b43f2ff4850dcf52960ee89c21cda79ec657302d36faaaa07d880215dd9
        Status: Downloaded newer image for ubuntu:latest
        hello world
        bash-3.2$ 

    参考:

    mac安装docker指南: http://docs.docker.com/installation/mac/#command-line-docker-with-boot2docker

    极客学院视频: http://www.jikexueyuan.com/path/docker/

    doker入门指南: http://my.oschina.net/dlpinghailinfeng/blog/384803

    pdf文件下载地址: http://pan.baidu.com/s/1c1corG8

  • 相关阅读:
    debug 调试Windows service服务调试
    Windows Service 创建 发布
    SQL Server 触发器
    c# core api 配置redis
    Core Api 搭建Swagger
    c# core api 自定义特性
    本地iis配置;,NET系统本地发布发布 通过配置路由器可以实现公网访问
    c# 线程的几种实现方式
    c# Thread.Sleep();
    2019创建 core api 加配置swagger
  • 原文地址:https://www.cnblogs.com/qyf404/p/4620397.html
Copyright © 2011-2022 走看看