Docker 之初次體驗

一、Docker 簡介

 lxc linux container,openvz

 容器中各虛擬機只有一個內核,而是多個用戶空間

 在庫中完成虛擬化,比如wine 或者在windows中運行bash

 在應用程序的運行級別提供虛擬化,比如jvm 

 pstree , pid 為1 的進程  這個進程是直接和內核來打交道的

 容器之間,和虛擬機之間隔離的技術

 容器之間的隔離相對比較困難

 NameSpace,(名稱空間)

  內核級別,環境隔離

  PID NameSpace: 用于隔離pid號的 Linux 2.6.24  PID隔離;

  Network NameSpace : Linux 2.6.29 網絡名稱空間的隔離  網絡設備、網絡棧、端口等網絡設備隔離;

  User NameSpace: Linux 用戶空間的隔離  Linux 3.8 甚至 3.10之后 用戶和用戶組資源隔離;

  IPC NameSpace: 進程間通信技術  Linux 2.6.19  signal 信號量、消息隊列和共享內存的隔離;

  UTS NameSpace: Linux 2.6.19 , 主機名和域名的隔離;

  Mount NameSpace: Linux 2.4.19 掛載點(文件系統 )隔離;

 API:clone()實現線程系統調用,用來創建新線程;

  setns()設定一個新的屬性,將某(進程|或設備)加入到新的NameSpace中去的;

  unshare()非共享機制,脫離NameSpace,而關聯至新NameSpace;

 將NameSpace隔離開來沒有問題,而問題在于,惡意用戶強行調用資源,一個用戶完全可以將系統資源耗盡,cpu占用至100%;

 因此帶來了另一種機制的出現;

 CGroup: Linux Control Group,控制組 Linux 2.6.24被收入進內核

  內核級別,限制、控制與一個進程組群的資源;

  資源:CPU,內存,IO 級別來進行定義

  google工程師:2006開始此技術,命令為進程容器而后命令為CGroup

  功能:

   Resource limitation:資源限制;

   Prioritization:優先級控制;

   Accounting:審計和統計,主要為計費;

   Contorl:掛起進程,恢復進程;

 CGroup 基于單根倒樹狀結構來實現

 在CentOS7 中可以用mount 命令來查看其資源組的隔離技術已經被使用

 /sys/fs/cgroup

 mount

 lssubsys -m 

 CGroup的子系統:

  blkio:設定塊設備的IO限制,而設定的子系統;

  cpu:設定CPU的限制;

  cpuacct:報告cgroup中所使用的CPU資源;

  cpuset:為cgroup中的任務分配 CPU和內存資源 ;

  memory:設定內存的使用限制;

  devices:控制cgroup中的任務對設備的訪問能務;

  freezer: 掛起和恢復cgroup中的任務;      

  net_cls:(classid) ,使用等級級別標識符來標記網絡數據包;

  tc: 流量整形命令 ;

  perf_event:對用戶空間中任務,對用戶空間產生的進程進行分類;

  使用后使cgrup中的任務可以進行統一的性能測試;  

  hugetlb:轉換后元緩沖區,對HugeTLB子系統進行限制;

 CGroup中的術語:

  task(任務):進程或線程;

  cgroup:一個獨立的資源控制單位,可以包含一個或多個子系統;

  subsystem:子系統,

  hierarchy:層級

 AUFS:UnionFS:

  UnionFS:把不同的物理位置的目錄合并到同一個目錄中。

  Another UFS,Alternative UFS,Adanced UFS 幾乎完全重寫了unix FS 

  命令 #tc  # lssubsys -m

 Device mapper:

  linux 2.6內核引入的最重要的技術之一,用于在內核中支持邏輯卷管理的通用設備映射技術;

   Mapped Device

   Mapping Table

   Target Device

  在內核空間只能開啟一個端,但是可以映射至其它的用戶空間

 Device mapper:

  Linux2.6 內核引入的最重要的技術之一,用于在內核 中支持邏輯卷管理的通用設備映射機制;

  Mapped Device

  Mapping Table

  Target Device

 Docker

  2013,GO,Apache 2.0,dotCloud

  C/S:

   Docker Client:發起docker相關的請求

   Docker Server:窗口運行的節點;

   Containers 容器

   images  docker映像文件 –> 存于倉庫之中

   啟動docker容器需要加載鏡像文件 –> docker倉庫上的鏡像加載進來

   docker允許我們創建私有倉庫

  比較難的,如何創建映像文件

  dockerfile:

   namespace cgroup

   解決方案

   lxc,openvz

   lxc,linux container

   libcontainer

   Host OS –> hypervisor –> Guest OS

 Host OS –> hpervisor –> user space(n個)

 核心組件:

  docker client:docker的客戶端工具,是用戶使用docker的主要接口,docker client 與docker daemon通信并將結果返回給用戶

  docker deamon:運行于宿主機上,Docker守護進程 ,用戶可通過docker client其交互

  image:鏡像文件是只讀的;用來創建container,一個鏡像可以運行多個container;鏡像文件可以通過Dockerfile文件來創建,可以從docker hub/registry下載;

  repository

   公共倉庫:Docker hub/registry

   私有倉庫:docker registry

  倉庫可以存有:nginx image httpd image tomcat image

  docker container: docker的運行實例,容器是一個隔離環境;

  另外兩個重要組件:

   docker link: 各docker容器這間能夠通信

   docker volume:

二、Docker YUM源的安裝配置

 安裝使用docker 通過使用epel源來實現, CentOS7 自帶的就有了 

 dockerfile 
 自定義的docker 源 
 [root@node1 ~]# vim /etc/yum.repos.d/docker.repo 
 [dockerrepo]
 name=Docker Repository
 baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
 gpgcheck=1
 gpgkey=https://yum.dockerproject.org/gpg
 
  [jin]
  name=renjin2
  baseurl=https://mirrors.aliyun.com/centos/7/os/x86_64/
  gpgcheck=0
  enabled=1
  [extra]
  name=renjin3
  baseurl=https://mirrors.aliyun.com/centos/7/extras/x86_64/
  gpgcheck=0
  enabled=1
  [epel]
  name=renji4
  baseurl=https://mirrors.aliyun.com/epel/7Server/x86_64/
  gpgcheck=0
  enabled=1

 或者可以使用自帶的源 https://mirrors.aliyun.com/centos/7.2.1511/extras/x86_64
 查看docker版本的詳細信息

 [root@node1 ~]# yum info docker-engine
 Loaded plugins: fastestmirror, langpacks
 Loading mirror speeds from cached hostfile
 Installed Packages
 Name        : docker-engine
 Arch        : x86_64
 Version     : 17.04.0.ce
 Release     : 1.el7.centos
 Size        : 63 M
 Repo        : installed
 From repo   : dockerrepo
 Summary     : The open-source application container engine
 URL         : https://dockerproject.org
 License     : ASL 2.0
 Description : Docker is an open source project to build, ship and run any application as a
    : lightweight container.
    : 
    : Docker containers are both hardware-agnostic and platform-agnostic. This means
    : they can run anywhere, from your laptop to the largest EC2 compute instance and
    : everything in between - and they don't require you to use a particular
    : language, framework or packaging system. That makes them great building blocks
    : for deploying and scaling web apps, databases, and backend services without
    : depending on a particular stack or provider.
 
  [root@node1 ~]# yum -y install docker-engine
  [root@node1 ~]# systemctl start docker.service 

三、Dcoker 的簡單測試及使用

  [root@node1 ~]# docker images 
  REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
  [root@node1 ~]# docker search centos
  NAME                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
  centos                                 The official build of CentOS.                   3239      [OK]       
  jdeathe/centos-ssh                     CentOS-6 6.8 x86_64 / CentOS-7 7.3.1611 x8...   63                   [OK]
  jdeathe/centos-ssh-apache-php          CentOS-6 6.8 x86_64 - Apache / PHP-FPM / P...   25                   [OK]
  consol/centos-xfce-vnc                 Centos container with "headless" VNC sessi...   24                   [OK]
  nimmis/java-centos                     This is docker images of CentOS 7 with dif...   24                   [OK]
  gluster/gluster-centos                 Official GlusterFS Image [ CentOS-7 +  Glu...   18                   [OK]
  million12/centos-supervisor            Base CentOS-7 with supervisord launcher, h...   15                   [OK]
  torusware/speedus-centos               Always updated official CentOS docker imag...   8                    [OK]
  egyptianbman/docker-centos-nginx-php   A simple and highly configurable docker co...   6                    [OK]
  nathonfowlie/centos-jre                Latest CentOS image with the JRE pre-insta...   5                    [OK]
  centos/mariadb55-centos7                                                               4                    [OK]
  centos/redis                           Redis built for CentOS                          2                    [OK]
  harisekhon/centos-java                 Java on CentOS (OpenJDK, tags jre/jdk7-8)       2                    [OK]
  harisekhon/centos-scala                Scala + CentOS (OpenJDK tags 2.10-jre7 - 2...   2                    [OK]
  blacklabelops/centos                   CentOS Base Image! Built and Updates Daily!     1                    [OK]
  darksheer/centos                       Base Centos Image -- Updated hourly             1                    [OK]
  freenas/centos                         Simple CentOS Linux interactive container       1                    [OK]
  timhughes/centos                       Centos with systemd installed and running       1                    [OK]
  januswel/centos                        yum update-ed CentOS image                      0                    [OK]
  kz8s/centos                            Official CentOS plus epel-release               0                    [OK]
  grayzone/centos                        auto build for centos.                          0                    [OK]
  repositoryjp/centos                    Docker Image for CentOS.                        0                    [OK]
  otagoweb/centos                        Apache (with PHP7), built on CentOS 7           0                    [OK]
  vcatechnology/centos                   A CentOS Image which is updated daily           0                    [OK]
  grossws/centos                         CentOS 6 and 7 base images with gosu and l...   0                    [OK]
  
  之所以能搜索出來,是因為別人給我們做了公開的使用 
  [root@node1 ~]# docker search busybox
  NAME                            DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
  busybox                         Busybox base image.                             973       [OK]       
  progrium/busybox                                                                65                   [OK]
  radial/busyboxplus              Full-chain, Internet enabled, busybox made...   12                   [OK]
  container4armhf/armhf-busybox   Automated build of Busybox for armhf devic...   6                    [OK]
  odise/busybox-python                                                            4                    [OK]
  multiarch/busybox               multiarch ports of ubuntu-debootstrap           2                    [OK]
  azukiapp/busybox                This image is meant to be used as the base...   2                    [OK]
  ofayau/busybox-jvm              Prepare busybox to install a 32 bits JVM.       2                    [OK]
  zanner/busybox                  https://github.com/sergej-kucharev/zanner-...   1                    [OK]
  ofayau/busybox-libc32           Busybox with 32 bits (and 64 bits) libs         1                    [OK]
  elektritter/busybox-teamspeak   Leightweight teamspeak3 container based on...   1                    [OK]
  getblank/busybox                Docker container busybox for Blank              1                    [OK]
  prom/busybox                    Prometheus Busybox Docker base images           1                    [OK]
  skomma/busybox-data             Docker image suitable for data volume cont...   1                    [OK]
  odise/busybox-curl                                                              1                    [OK]
  jahroots/busybox                Busybox containers                              0                    [OK]
  ggtools/busybox-ubuntu          Busybox ubuntu version with extra goodies       0                    [OK]
  cucy/busybox                    aouto  build busybox                            0                    [OK]
  freenas/busybox                 Simple Busybox interactive Linux container      0                    [OK]
  sdurrheimer/prom-busybox        Moved to https://hub.docker.com/r/prom/bus...   0                    [OK]
  jiangshouzhuang/busybox         busybox                                         0                    [OK]
  padcom/busybox-java             Oracle Java on BusyBox                          0                    [OK]
  futurenda/busybox               Mini busybox                                    0                    [OK]
  hongtao12310/busybox            for busybox image based on the gcr.io/goog...   0                    [OK]
  ddn0/busybox                    fork of official busybox                        0                    [OK]
  [root@node1 ~]# docker pull buxybox
  [root@node1 ~]# docker pull busybox
  Using default tag: latest
  latest: Pulling from library/busybox
  7520415ce762: Pull complete 
  Digest: sha256:32f093055929dbc23dec4d03e09dfe971f5973a9ca5cf059cbfb644c206aa83f 校驗碼 
  Status: Downloaded newer image for busybox:latest
 [root@node1 ~]# docker pull hub.magedu.com:5000/busybox ##指定到哪臺服務器上獲取busybox [root@node1 ~]# docker images 
  REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
  busybox             latest              00f017a8c2a6        3 weeks ago         1.11MB

  [root@node1 ~]# docker run -it busybox:latest /bin/sh ##啟動一臺虛擬機的實例 
  / # ls
  bin   dev   etc   home  proc  root  sys   tmp   usr   var
  [root@node1 ~]# docker ps ##查看正在運行的主機
  CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
  7090d8fd9861        busybox:latest      "/bin/sh"           2 minutes ago       Up 2 minutes                            boring_archimedes

四、 docker的常用命令總結

  環境信息相關:
   info 
   version 
  [root@node1 ~]# docker info ##查看docker的環境信息
  [root@node1 ~]# docker version ##查看docker的版本號 

 系統維護相關:
  images
  inspect
  build 創建映像文件
  commint 基于運行中的容器創建映像文件
  pause/unpause
  ps
  rm
  rmi
  run
  start/stop/restart
  top
  kill
  …

 日志信息相關:
  events
  history
  logs
 Docer hub服務相關
  login
  logout
  pull
  push
  search

 基本操作:

  獲取映像:pull 
  啟動容器:run 
  [root@node1 ~]# docker ps 
  CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
  7090d8fd9861        busybox:latest      "/bin/sh"           17 minutes ago      Up 17 minutes                           boring_archimedes
  [root@node1 ~]# docker kill 7090d8fd9861
  7090d8fd9861
  [root@node1 ~]# docker ps #結束一個docker進程 
  CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
  [root@node1 ~]# docker ps  -a #但不會刪除容器
  CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
  7090d8fd9861        busybox:latest      "/bin/sh"           20 minutes ago      Exited (137) 3 minutes ago                       boring_archimedes
  [root@node1 ~]# docker rm 7090d8fd9861 #此時會刪除container
  7090d8fd9861
  [root@node1 ~]# docker ps  -a 
  CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
  [root@node1 ~]# docker ps 
  CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
  2bca1aa3d38d        busybox:latest      "/bin/sh"           4 minutes ago       Up 4 minutes                            naughty_goldberg
 [root@node1 ~]# docker
  docker                  docker-containerd-ctr   dockerd                 docker-proxy
  docker-containerd       docker-containerd-shim  docker-init             docker-runc
 [root@node1 ~]# docker commit 2bca1aa3d38d centos:newuser
  sha256:08d1d05a6e490c31b0e4e3ffb9532a25bb3d9e8f588b30990338f1ae64b34286
 [root@node1 ~]# docker
  docker                  docker-containerd-ctr   dockerd                 docker-proxy
  docker-containerd       docker-containerd-shim  docker-init             docker-runc
 [root@node1 ~]# docker images
  REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
  centos              newuser             08d1d05a6e49        9 seconds ago       1.11MB
  busybox             latest              00f017a8c2a6        3 weeks ago         1.11MB
 [root@node1 ~]# docker run -it --rm centos:newuser /bin/sh
  / # 
 [root@node1 ~]# docker kill fee1da85d418
  fee1da85d418
 [root@node1 ~]# docker ps -a 
  CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
linux Kernel --> libcontainer --> (execdriver、networkdriver)--> Docker Daemon (GraphDB) --> API server --> 用戶

在docker 之外有個重要存儲還需要GraphDB GraphDB也稱為圖式數據庫

Docker應用:

  鏡像:包含了啟動Docker容器所需要的文件系統層給及其內容;

  基于UninFS采用分層結構實現;

   bootfs,rootfs

  registry:用于保存鏡像的元數據,保存docker鏡像層次結構和元數據;

  reposistory:由具有某個功能的鏡像的所有相關版本構建成的集合;

  index:管理用戶的賬號、訪問權限、鏡像及鏡像標簽等等相關的;

  graph:從registry中下載的Docker鏡像需要保存在本地,此功能即由graph完成;

   /var/lib/docker/graph;

  與鏡像相關的命令:

   docker images  列出本地的鏡像

   docker search   搜索

   docker pull  下載鏡像

   docker push   上傳鏡像

   docker login   登錄

   docker logout  登出

  創建鏡像:commint,build

  刪除本地鏡像: rmi

 容器:也可以想象成一個虛擬機

  獨立運行的一個或一組應用,以及它們運行的環境

 命令:

  run,kill,stop,start,restart ,log,export,import

 啟動方法:

  通過鏡像創建一個新的容器: run

  啟動一個處于停止狀態的容器: start

  容器本來就是應用的,當應用結束時,程序也會結束的;

 [root@node1 ~]# docker run busybox:latest /bin/echo "hello world"
  hello world
 
 [root@node1 ~]# docker run -it --name=busybox busybox:latest /bin/sh
 [root@node1 ~]# docker stop busybox ##正常停止一個容器,相當于正常關機

  busybox
 run命令:
  –name= Assign a name to the container
  -i,–interactive=false Keep STDIN open even if not attached
  it,-tty=false Alocate a pseudo-TTY
  –net=default Set the Network for the container

  步驟:

   檢查本地是否存在指定的鏡像,不存在則從registry下載;

   利用鏡像啟動容器

   分配一個文件系統,并且在只讀的鏡像層之外,掛載一個可讀寫層;

   從宿主機配置的網橋口中,橋接一個虛擬接口給此容器;

   從地址池中分配一個地址容器;

   執行用戶指定的應用程序;

   程序執行完成后,容器即終止;

   logs命令:獲取一個容器的日志,獲取其輸出信息;

   對于交互式模式啟動的容器,終止可以使用exit 命令或ctrl+d組合鍵;

   attach  附加至一個運行中的容器;

 [root@node1 ~]# docker start 31a67d66b2c2
 [root@node1 ~]# docker attach busybox
 [root@node1 ~]# docker run busybox:latest /bin/echo "hello world"
 [root@node1 ~]# docker ps -a 
  CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
  d35a2673722e        busybox:latest      "/bin/echo 'hello ..."   13 seconds ago      Exited (0) 12 seconds 
 [root@node1 ~]# docker start d35a2673722e  
  d35a2673722e
 [root@node1 ~]# docker logs  cabd0e52f8f8 ##可以查看執行命令后的輸出信息
  hello world
  hello world
  hello world
 / # exit 終止當前容器  或者ctrl +d 
 attach 
 [root@node1 ~]# docker start -i busybox  ##啟動一個交互式一個接口
 [root@node1 ~]# docker start busybox 
 [root@node1 ~]# docker attach busybox   ##附加至一個運行中的容器;
 / # 

 Docker Hub:

 registry有兩種;

 docker hub:

 private registry

 # docker login

 # docker push busybox:latest

 [root@node2 yum.repos.d]# yum -y install docker-registry
 上條命令實質上安裝的是另外的一個包
 [root@node2 yum.repos.d]# yum -y installdocker-distribution-2.6.0-1.el7.x86_64
 [root@node1 yum.repos.d]# systemctl start docker-distribution.service 
 [root@node1 yum.repos.d]# ss -tnl | grep 5000
 LISTEN     0      128         :::5000                    :::* 
 [root@node1 yum.repos.d]# docker images 
 REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
 centos              newuser             08d1d05a6e49        2 weeks ago         1.11MB
 centos              latest              98d35105a391        5 weeks ago         192MB
 busybox             latest              00f017a8c2a6        6 weeks ago         1.11MB
 [root@node1 yum.repos.d]# 
 [root@node1 yum.repos.d]# docker tag 08d1d05a6e49  192.168.99.15:5000/centos:1.2.1 給一個鏡像打標簽 
 [root@node1 yum.repos.d]# docker push 192.168.99.15:5000/centos:1.2.1 


原創文章,作者:kang,如若轉載,請注明出處:http://www.www58058.com/79168

(2)
kangkang
上一篇 2017-02-24
下一篇 2017-02-24

相關推薦

  • 第四周 文件操作

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限 [root@localhost ~]# cp -a /etc/skel /home/tuser1 [root@localhost ~]# chmod -R go= /home/tuser1 [root@localhost ~]…

    Linux干貨 2017-12-24
  • 軟件包管理和磁盤管理

    軟件運行和編譯 ABI :Application Binary Interface 應用程序二進制接口     Windows和Linux不兼容      PE格式   ELF格式 庫級別的虛擬化:       Linu…

    2017-04-24
  • 02葵花寶典之bash特性及文件入門

    文件管理 目錄 命令替換 命令執行狀態 元數據 時間戳

    2018-03-11
  • Python基礎語法習題

    1、~12為什么是-13?解1:12 二進制:0000 1100補碼: 0000 1100按位取反 :1111 0011求這個原碼,即負數求補碼的逆過程:先減1,再取反 (符號位不變)-1 1111 0010取反 1111 1101 還原成十進制-13 2、10^9等于?10^-9等于?解:(1)10^910的二進制:0000 10109的二進制: 0000…

    Linux干貨 2018-03-24
  • 網絡管理之配置文件及一些命令的應用

    IP配置、信息、相關命令    IP地址     它們可唯一標識 IP 網絡中的每臺設備     每臺主機(計算機、網絡設備、外圍設備)必須具有唯一的地址     IP 地址由兩部分組成:   &nb…

    Linux干貨 2016-09-22
  • http協議基礎(一)

    web服務:      Apache      Nginx      LVS      http協議 網站運維:      web站點      游戲網站web服務 高性能,高可用…

    Linux干貨 2017-04-18
欧美性久久久久