1. 程式人生 > >Docker重要概念及基本操作

Docker重要概念及基本操作

一.Docker架構和底層技術簡介

1.Docker Platform

  • Docker提供了一個開發,打包,執行app的平臺
  • 把app和底層infrastructure(physical/virtual物理裝置和虛擬裝置)隔離開來

2.Docker Engine

  • 後臺程序(dockerd)
  • 提供REST API Server
  • CLI 介面(docker)

3.Docker Architecture(Docker整體架構)

在這裡插入圖片描述

  • Client(命令列中常用的命令)
  • DOCKER_HOST
    • image映象
    • containers容器
  • Registry(儲存映象的公共伺服器,用於images的儲存與獲取)

4.底層技術支援

  • Namespaces:做隔離pid,net,ipc,mnt,uts
  • Control groups:做資源限制(指定容器用多少記憶體)
  • Union file systems:Container和image的分層

5.實驗環境介紹

  • 使用已經搭建好的實驗環境【暫時還沒有釋出】
  • 執行vagrant up命令開啟centos7的虛擬機器,這個虛擬機器中已經安裝好docker了
  • 執行vagrant ssh
    登入centos虛擬機器中

二.Docker image概述(Image即映象)

1.什麼是Image

  • 檔案和meta data的集合(root filesystem)
  • 分層的,並且每一層都可以新增改變刪除檔案,成為一個新的image
  • 不同的image可以共享相同的layer
  • Image本身是read-only的
    在這裡插入圖片描述

2.例項瞭解Image

  • 執行docker image ls檢視本地的所有image

3.Image的獲取

  • 通過Dockerfile格式的檔案build出來對應的image(Build from Dockerfile)

  • 從Registry拉取Image(Pull from Registry)

    sudo docker pull ubuntu:14.04#從registry中拉取ubuntu14.04的image,不加版本號取的是最新版本
    #上述拉取的方式是從docker hub中取出的,https://hubs.docker.com
    
    • 上述拉取的方式是從docker hub中取出的,https://hubs.docker.com
    • 如果不攜帶版本號的拉取,拿到的是最新版本
    • 如果pull的內容帶對應路徑,如sudo docker pull binami/wordpress,該內容不是官方給提供的,其中binami為使用者名稱;若想取官方image則需要執行sudo docker pull wordpress

三.DIY一個Base Image

1.提升docker命令的執行許可權

#我們通常執行
#sudo docker image ls 檢視docker中的image
#執行 docker image ls 會提示許可權不足
#執行如下命令提升許可權
sudo groupadd docker
sudo gpasswd -a vagrant docker
sudo service docker restart#重啟docker服務
#使用vagrant ssh重新登入後,執行docker image ls可以直接檢視結果

2.使用官方hello-world的image

docker pull hello-world#從registry中獲得hello-world的baseimage,執行hello-world會建立一個容器
docker run hello-world#執行hello-world的container

3.通過c語言編寫hello world,將hello wrold編譯執行成二進位制的可執行檔案

  • 執行vim hello.c建立hello.c

  • 編寫hello.c

    #include<stdio.h>
    int main()
    {
        printf('hello docker\n')
    }
    
  • 編譯c語言檔案成二進位制檔案(編譯c語言使用gcc)

    #安裝gcc
    sudo yum install gcc
    #安裝glibc-static
    sudo yum install glibc-static
    #安裝後執行如下命令進行編譯c語言檔案
    gcc -static hello.c -o hello
    #此時我們將hello.c檔案編譯成名為hello的可執行檔案
    #可以使用./hello直接執行hello檔案
    
  • 編寫Dockerfile檔案

    FROM scratch #表示當前image是base image
    ADD hello / #將hello執行到根目錄中
    CMD [~/hello~]
    
  • 執行docker build -t jack/hello-world .構建Base image,最後的點表示在當前路徑找Dockerfile

  • 通過dockerfile將此可執行檔案打成docker image

  • 使用docker run jack/hello-world執行建立的container,會列印hello docker

四.初識container

1.什麼是Container

  • 通過Image建立(copy)
  • 在Image layer之上建立一個container layer(可讀寫)
  • 類比面向物件:類(Image)和例項(Container)
  • Image負責app的儲存和分發,Container負責執行app

2.container命令

  • docker container ls檢視當前正在執行的container
  • docker container ls -a檢視所有的container(當前正在執行的和退出的)
  • 如上述docker run jack/hello-world建立並執行container,執行後就會退出,故直接使用ls檢視不到
  • 若想建立後不退出則可以使用命令docker run -it centos,則會建立container並不會退出,直接使用ls可以檢視到對應的contianer,相當於在image上多了一個layer
  • 執行docker container rm ID號即可將對應退出的container刪除【使用docker rm ID號預設移除的就是container】
  • 執行docker image rm ID號即可移除image【使用docker rmi ID號移除Image】
  • 餘下命令及引數請查閱相關文件

五.構建自己的Docker映象

1.Docker命令

  • docker container commit Container名字 Image名字[簡寫:docker commit Container名字 Image名字]先基於某個image建立一個container,之後在container中做某些變化(如新增軟體),之後將其commit成一個新的image
  • docker image build[簡寫:docker build]通過Dockerfile建立一個image

2.Docker命令應用例項

  • 場景一:
    • 在image1中建立一個container,並安裝vim
    • 執行docker commit...將container變成image2【image2的大小比image1大,相當於填了一層並安裝了vim】
  • 場景二:
    • 在image1中建立一個Dockerfile,內容如下
      FROM centos #表示base image是centos
      RUN yum install -y vim #表示執行相關命令
      
    • 通過docker build -t Image名 .會建立臨時的container並安裝vim,安裝後會將container變成image並移除臨時的container