1. 程式人生 > >Docker 容器基礎篇簡介

Docker 容器基礎篇簡介

Docker 容器基礎篇

一、容器技術和Docker簡介

1、虛擬化:

  • 使用虛擬化的優點:
    • 1.資源池:一個物理的資源分配到了不同的虛擬機器裡
    • 2.很容易擴充套件:加物理機器或者加虛擬機器
    • 3.很容易雲化:亞馬遜AWS,阿里雲等
  • 虛擬化的侷限性:
    • 每一個虛擬機器都是一個完整的作業系統,要給其分配資源,當虛擬機器數量增多時,作業系統本身消耗的資源勢必增多

2、容器解決了什麼問題?

  • 解決了開發和運維之間的矛盾
  • 在開發和運維之間搭建了一個橋樑,是實現devops的最佳解決方案

3、什麼是容器?

  • 對軟體和其依賴的標準化打包
  • 應用之間相互隔離
  • 共享同一個OS kernel
  • 可以執行在很多主流作業系統上

4、什麼是Docker CE與EE?

  • 2017年的3月1號之後,Docker的版本命名開始發生變化,同時將CE版本和EE版本進行分開。
  • 區別如下:
    • Docker社群版(CE):
      • 為了開發人員或小團隊建立基於容器的應用,與團隊成員分享和自動化的開發管道。docker-ce提供了簡單的安裝和快速的安裝,以便可以立即開始開發。docker-ce整合和優化,基礎設施 (免費)
    • Docker企業版(EE):
      • 專為企業的發展和IT團隊建立誰。docker-ee為企業提供最安全的容器平臺,以應用為中心的平臺。(付費)

5、容器和虛擬機器的區別:

  • 容器是App層面的隔離

在這裡插入圖片描述

  • 虛擬化是物理資源層面的隔離:

在這裡插入圖片描述

  • 虛擬化 + 容器:

在這裡插入圖片描述

6、什麼是Docker?

  • Docker 使用 Google 公司推出的 Go 語言 進行開發實現,基於 Linux 核心的 cgroupnamespace,以及AUFS 類的
    Union FS
    等技術,對程序進行封裝隔離,屬於 作業系統層面的虛擬化技術
  • 由於隔離的程序獨立於宿主和其它的隔離的程序,因此也稱其為容器
  • Docker 在容器的基礎上,進行了進一步的封裝,從檔案系統、網路互聯到程序隔離等等,極大的簡化了容器的建立和維護。使得 Docker 技術比虛擬機器技術更為輕便、快捷。

7、為什麼要用Docker?

  • 作為一種新興的虛擬化方式,Docker 跟傳統的虛擬化方式相比具有眾多的優勢。

    1:更高效的利用系統資源:

    • 由於容器不需要進行硬體虛擬以及執行完整作業系統等額外開銷Docker 對系統資源的利用率更高。無論是應用執行速度、記憶體損耗或者檔案儲存速度,都要比傳統虛擬機器技術更高效。因此,相比虛擬機器技術,一個相同配置的主機,往往可以執行更多數量的應用。

    2:更快速的啟動時間:

    • 傳統的虛擬機器技術啟動應用服務往往需要數分鐘,而 Docker 容器應用,由於直接運行於宿主核心,無需啟動完整的作業系統,因此可以做到秒級、甚至毫秒級的啟動時間。大大的節約了開發、測試、部署的時間 。

    3:一致的執行環境:

    • 開發過程中一個常見的問題是環境一致性問題。由於開發環境、測試環境、生產環境不一致,導致有些 bug 並未在開發過程中被發現。而Docker 的映象提供了除核心外完整的執行時環境,確保了應用執行環境一致性,從而不會再出現 「這段程式碼在我機器上沒問題啊」 這類問題

    4:持續交付和部署:

    • 對開發和運維(DevOps)人員來說,最希望的就是一次建立或配置,可以在任意地方正常執行。
    • 使用Docker 可以通過定製應用映象來實現持續整合、持續交付、部署。
    • 開發人員可以通過 Dockerfile 來進行映象構建,並結合 持續整合(Continuous Integration) 系統進行整合測試,而運維人員則可以直接在生產環境中快速部署該映象,甚至結合 持續部署(Continuous Delivery/Deployment) 系統進行自動部署。
    • 而且使用 Dockerfile 使映象構建透明化,不僅僅開發團隊可以理解應用執行環境,也方便運維團隊理解應用執行所需條件,幫助更好的生產環境中部署該映象。

    5:更輕鬆的遷移:

    • 由於 Docker 確保了執行環境的一致性,使得應用的遷移更加容易。Docker 可以在很多平臺上執行,無論是物理機、虛擬機器、公有云、私有云,甚至是筆記本,其執行結果是一致的。因此使用者可以很輕易的將在一個平臺上執行的應用,遷移到另一個平臺上,而不用擔心執行環境的變化導致應用無法正常執行的情況。

    6:更輕鬆的維護和擴充套件:

    • Docker 使用的分層儲存以及映象的技術,使得應用重複部分的複用更為容易,也使得應用的維護更新更加簡單,基於基礎映象進一步擴充套件映象也變得非常簡單。此外,Docker 團隊同各個開源專案團隊一起維護了一大批高質量的 官方映象,既可以直接在生產環境使用,又可以作為基礎進一步定製,大大的降低了應用服務的映象製作成本。

    7:對比傳統虛擬機器總結:

    特性 容器 虛擬機器
    啟動 秒級 分鐘級
    硬碟使用 一般為 MB 一般為 GB
    效能 接近原生 弱於
    系統支援量 單機支援上千個容器 一般幾十個

二、Docker環境的各種搭建方法

安裝Docker:

系統要求:

  • Docker CE 支援 64 位版本 CentOS 7,並且要求核心版本不低於 3.10。 CentOS 7 滿足最低核心的要求,但由於核心版本比較低,部分功能(如 overlay2 儲存層驅動)無法使用,並且部分功能可能不太穩定。

  • 1.解除安裝舊版本:

    • 舊版本的 Docker 稱為 docker 或者 docker-engine,使用以下命令解除安裝舊版本:

      $ sudo yum remove docker \
                        docker-client \
                        docker-client-latest \
                        docker-common \
                        docker-latest \
                        docker-latest-logrotate \
                        docker-logrotate \
                        docker-selinux \
                        docker-engine-selinux \
                        docker-engine
      
  • 2.使用yum安裝:

    • 執行以下命令安裝依賴包:

      $ sudo yum install -y yum-utils \
                 device-mapper-persistent-data \
                 lvm2
      
    • 鑑於國內網路問題,強烈建議使用國內源,官方源請在註釋中檢視。

      執行下面的命令新增 yum 軟體源:

      $ sudo yum-config-manager \
          --add-repo \
          https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
      
      # 官方源
      # $ sudo yum-config-manager \
      #     --add-repo \
      #     https://download.docker.com/linux/centos/docker-ce.repo
      
    • 如果需要測試版本的 Docker CE 請使用以下命令(我沒有安裝):

      sudo yum-config-manager --enable docker-ce-test
      
    • 如果需要每日構建版本的 Docker CE 請使用以下命令(我沒有安裝):

      $ sudo yum-config-manager --enable docker-ce-nightly
      
  • 3.安裝 Docker CE:

    • 更新 yum 軟體源快取,並安裝 docker-ce
    $ sudo yum makecache fast
    $ sudo yum install docker-ce  # 執行的這條命令
    
  • 4.使用指令碼自動安裝:

    • 在測試或開發環境中 Docker 官方為了簡化安裝流程,提供了一套便捷的安裝指令碼,CentOS 系統上可以使用這套指令碼安裝

      $ curl -fsSL get.docker.com -o get-docker.sh
      $ sudo sh get-docker.sh --mirror Aliyun
      
      • 執行這個命令後,指令碼就會自動的將一切準備工作做好,並且把 Docker CE 的 Edge 版本安裝在系統中
  • 5.啟動Docker CE:

    $ sudo systemctl enable docker
    $ sudo systemctl start docker
    
  • 6.測試Docker是否安裝正確:

    $ docker run hello-world
    
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    d1725b59e92d: Pull complete
    Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
    Status: Downloaded newer image for hello-world:latest
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/get-started/
    
    • 若能正常輸出以上資訊,則說明安裝成功。

三、Docker的映象和容器

1、Docker的架構和底層技術:

1.1、Docker平臺(platform):

  • Docker 提供了一個開發,打包,執行app的平臺

  • 把app和底層infrastructure隔離開來

    • 如圖:

在這裡插入圖片描述

  • Docker Engine都有哪些東西呢 ?

    • 1.後臺程序(dockerd)

    • 2.REST API Server

    • 3.CLI介面(docker)

    • 如圖所示:

在這裡插入圖片描述

  • 檢視docker版本:

    $ sudo docker version
    
    Client:
     Version:           18.09.0
     API version:       1.39
     Go version:        go1.10.4
     Git commit:        4d60db4
     Built:             Wed Nov  7 00:48:22 2018
     OS/Arch:           linux/amd64
     Experimental:      false
    
    Server: Docker Engine - Community
     Engine:
      Version:          18.09.0
      API version:      1.39 (minimum version 1.12)
      Go version:       go1.10.4
      Git commit:       4d60db4
      Built:            Wed Nov  7 00:19:08 2018
      OS/Arch:          linux/amd64
      Experimental:     false
    
    
  • 檢視docker後臺程序:

    $ps -ef | grep docker
    
    root      20450      1  0 15:16 ?        00:00:20 /usr/bin/dockerd -H unix://
    root      20464  20450  0 15:16 ?        00:00:27 containerd --config /var/run/docker/containerd/containerd.toml --log-level info
    root      20845  18781  0 20:36 pts/2    00:00:00 grep --color=auto docker
    
    

1.2、Docker架構原理(Architecture):

  • 總體看一下docker的架構如圖所示:

在這裡插入圖片描述

  • Client裡面:是一些常用的命令
  • Docker_HOST:是docker啟動的機器
  • Registry:是一些映象儲存的伺服器

1.3、Docker 底層技術支援:

  • Namespaces:做隔離pid,net,ipc,mnt,uts
  • Control groups:做資源限制
  • Union file systems:Container和image的分層

2、Docker 映象(image)概述:

2.1、什麼是映象?

  • 我們都知道,作業系統分為核心和使用者空間。

  • 對於 Linux 而言,核心啟動後,會掛載 root 檔案系統為其提供使用者空間支援

    • 而 Docker 映象(Image),就相當於是一個root檔案系統
    • 比如官方映象 ubuntu:18.04 就包含了完整的一套 Ubuntu 18.04 最小系統的 root 檔案系統。
  • Docker 映象是一個特殊的檔案系統,除了提供容器執行時所需的程式、庫、資源、配置等檔案外,還包含了一些為執行時準備的一些配置引數(如匿名卷、環境變數、使用者等)。

    • **映象不包含任何動態資料,其內容在構建之後也不會被改變。 **
  • 檢視本地已經有的docker 映象命令:

    $ docker image ls
    
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB
    

2.2、分層儲存:

  • 因為映象包含作業系統完整的 root 檔案系統,其體積往往是龐大的,因此在 Docker 設計時,就充分利用 Union FS 的技術,將其設計為分層儲存的架構,映象並非是像一個 ISO 那樣的打包檔案,映象只是一個虛擬的概念,其實際體現並非由一個檔案組成,而是由一組檔案系統組成,或者說,由多層檔案系統聯合組成。
  • **映象構建時,會一層層構建,前一層是後一層的基礎 **
    • 每一層構建完就不會再發生改變,後一層上的任何改變只發生在自己這一層。
      • 比如,刪除前一層檔案的操作,實際不是真的刪除前一層的檔案,而是僅在當前層標記為該檔案已刪除。
      • 在最終容器執行的時候,雖然不會看到這個檔案,但是實際上該檔案會一直跟隨映象。
      • 因此,在構建映象的時候,需要額外小心,每一層儘量只包含該層需要新增的東西,任何額外的東西應該在該層構建結束前清理掉。
  • 分層儲存的特徵還使得映象的複用、定製變的更為容易。甚至可以用之前構建好的映象作為基礎層,然後進一步新增新的層,以定製自己所需的內容,構建新的映象。

2.3、建立一個Base Image:

  • docker 重啟命令:service docker restart

  • centos下安裝vim,因為vi的功能沒有vim豐富

    • 1.用yum查詢源中的VIM包,不知安裝哪個合適。

      yum search vim
      vim-X11.i386 : The VIM version of the vi editor for the X Window System.
      vim-common.i386 : The common files needed by any version of the VIM editor.
      vim-enhanced.i386 : A version of the VIM editor which includes recent enhancements.
      vim-minimal.i386 : A minimal version of the VIM editor
      
      
    • 2.到已安裝VIM的系統中檢視VIM屬於哪個軟體包

      which vim
      /usr/bin/vim
      rpm -qf /usr/bin/vim
      vim-enhanced-7.0.109-7.el5
      
    • 3、安裝VIM:

      yum install vim-enhanced
      
  • 安裝c語言的編輯器:

    • 首先建立了一個c語言編寫的模組

      • vim hello.c 裡面輸出內容如下:

        #include<stdio.h>
        
        int main()
        {
            printf("hello docker\n");
        }
        
    • 第一條命令:yum install gcc

    • 第二條命令:yum install glibc-static

    • 編譯C語言成二進位制檔案命令:gcc -static hello.c -o hello

      • 該目錄下會出現:

        總用量 844
        -rwxr-xr-x. 1 root root 856856 1216 21:43 hello
        -rw-r--r--. 1 root root     64 1216 21:43 hello.c
        
        [[email protected] hello-c]# ./hello   # 輸入./hello 
        hello docker
        
  • 建立一個Dockerfile

    • vim Dockerfile:

      FROM scratch
      ADD hello /
      CMD ["/hello"]
      
    • 把這個Dockerfile檔案進行映象:docker build -t lh9 .

      • -t(–tag):映象的名字及標籤,通常 name:tag 或者name格式,可以在一次構建中為一個映象設定多個標籤
      • lh9:是這次映象倉庫的名字(隨意起)
      • .:代表執行的是當前資料夾中的Dockerfile檔案
  • 檢視映象:docker image ls:

  • 可以簡寫為:docker images

    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    lh9                 latest              f519dcbd86cb        9 minutes ago       857kB  
    hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB
    
  • 檢視歷史映象時的操作:docker history f519dcbd86cb

    • f519dcbd86cb: 映象ID ,通過docker image ls 可以檢視到該IMAGE ID

      [[email protected] hello-c]# docker history f519dcbd86cb
      IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
      f519dcbd86cb  10 minutes ago  /bin/sh -c #(nop)  CMD ["/hello"]               0B                  
      14fd8dbe42ef  10 minutes ago /bin/sh -c #(nop) ADD file:59b137d2e449bd517…   857kB 
      

3、Docker容器(Container)概述:

  • 映象(Image)和容器(Container)的關係,就像是面向物件程式設計中的 例項 一樣,映象是靜態的定義,容器是映象執行時的實體。**容器可以被建立、啟動、停止、刪除、暫停等。 **
    • 簡單說,Container是通過Image建立
  • 容器的實質是程序,但與直接在宿主執行的程序不同,容器程序運行於屬於自己的獨立的 名稱空間
    • 因此容器可以擁有自己的 root 檔案系統、自己的網路配置、自己的程序空間,甚至自己的使用者 ID 空間
    • 容器內的程序是執行在一個隔離的環境裡,使用起來,就好像是在一個獨立於宿主的系統下操作一樣。
    • 這種特性使得容器封裝的應用比直接在宿主執行更加安全。也因為這種隔離的特性,很多人初學 Docker 時常常會混淆容器和虛擬機器。
  • 映象使用的是分層儲存,容器也是如此
    • 每一個容器執行時,是以映象為基礎層,在其上建立一個當前容器的儲存層,我們可以稱這個為容器執行時讀寫而準備的儲存層為容器儲存層
  • 容器儲存層的生存週期和容器一樣,容器消亡時,容器儲存層也隨之消亡。因此,任何保存於容器儲存層的資訊都會隨容器刪除而丟失。
  • 按照 Docker 最佳實踐的要求,容器不應該向其儲存層內寫入任何資料,容器儲存層要保持無狀態化。所有的檔案寫入操作,都應該使用 資料卷(Volume)、或者繫結宿主目錄,在這些位置的讀寫會跳過容器儲存層,直接對宿主(或網路儲存)發生讀寫,其效能和穩定性更高
  • 資料卷的生存週期獨立於容器,容器消亡,資料卷不會消亡。因此,使用資料卷後,容器刪除或者重新執行之後,資料卻不會丟失。

4、Docker 基本命令:

  • 檢視當前映象:docker image ls
    • 可以簡寫docker images
  • 刪除當前映象:docker image rm xxxxxID
    • 可以簡寫docker rmi xxxxxID
  • 檢視當前本地正在執行的容器:docker container ls
  • 檢視當前所有容器包括退出的:docker container ls -a
    • 以上兩個檢視命令可以簡寫為:docker ps -a
  • 刪除容器:docker container rm xxxxxID
    • 刪除容器可以簡寫:docker rm xxxxxID
  • 建立容器並執行:docker run REPOSITORY
    • 比如:docker run lh9(映象名)
  • 建立容器並在後臺執行:docker run -d REPOSITORY
  • 檢視所有容器的ID:docker container ls -aq
    • 此命令相當於:docker container ls -a | awk {'print$1'}
  • 批量刪除所有容器:docker rm $(docker container ls -aq)
  • 僅想清除容器是退出的:docker rm $(docker container ls -f "status=exited" -q)

5、構建Docker映象:

  • 把容器(container)commit成映象(image):docker container commit
    • 簡寫為:docker commit

5.1、建立映象方法一:

  • 通過用docker commit 基於容器建立一個映象:

    • 1.首先 檢視容器 docker container ls -a:

      CONTAINER ID  IMAGE  COMMAND   CREATED       STATUS       PORTS     NAMES
      
      fdbd66aa1ed9  lh9   "/hello"   2 minutes ago  Exited (13)         awesome_aryabhata
      caa7fca0483d  lh9   "/hello"   2 minutes ago  Exited (13)         vibrant_mendeleev
      
    • 2.基於容器建立一個映象:docker commit NAMES[容器的名字] IMAGENAME[映象的名字]

      • 執行命令:docker commit awesome_aryabhata test/lh9

      • 建立成功會提示:

        sha256:08984f0d6a0be8823f465d782de3fdcd6ec7494a956d5c7659964cb33e2fad72
        
    • 3.檢視當前映象:docker images

      REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
      test/hl9            latest              08984f0d6a0b        15 seconds ago      857kB
      lh9                 latest              906e443f5915        16 hours ago        857kB
      hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB
      
    • 4.test/lh9 就是上面基於容器創建出的映象。(不提倡這種方式)

  • 從Dockerfile檔案中:建立一個映象:docker image build

    • 簡寫為:docker build

5.2、建立映象方法二:

  • 通過使用Dockerfile來建立一個映象方法:

    • 1.首先建立一個資料夾

      mkdir  docker-vim
      
    • 2.進入docker-vim資料夾中,建立一個Dockerfile檔案:

      [[email protected] docker-centos-vim]# more Dockerfile 
      FROM centos:7.2.1511 (後面是7.2.1511 是我拉取centos映象的版本號)
      RUN yum install -y vim
      
    • 3.執行命令:docker build -t centos-vim[映象的名字] . [.點代表的是當前目錄]

6、Dockerfile 基本語法:

6.1、常用語法:

  • 1.FORM:在哪個Base Image 之上,構建自己的Image

    • FROM scratch :製作base image
    • FROM centos:使用 base image
    • FROM ubuntu:14.04 :使用 base image
    • 經量使用官方的image作為base image 為了安全
  • 2.LABEL:包含一些資訊

    • LABEL maintainer = '[email protected]' : 作者資訊
    • LABEL version = '1.0': 版本資訊
    • LABEL description = 'This is description':描述資訊
  • 3.RUN:執行命令

    Run yum update && yum install -y vim \
    	python-dev   # 反斜線換行 && 合併命令
    
    Run apt-get update && apt-get install -y perl \
    	pwgen --no-install-recommends && rm -rf \
    	/var/lib/apt/lists/*  # 注意清理cache
    
    Run /bin/bash -c 'source $HOME/.bashrc;echo
    $HOME'
    
    • 為了美觀,複雜的RUN 請用反斜槓換行,避免無用分層,合併多條命令成一行
  • 4.WORKDIR:進入目錄(相當於Linux系統中的cd 命令)

    WORKDIR /test  # 如果沒有就會自動建立test目錄
    WORKDIR demo
    RUN pwd  # 輸出結果是 /test/demo
    
    • 用WORKDIR,不要用RUN cd ,儘量使用絕對目錄
  • 5.ADD 和 COPY:把本地檔案新增到根目錄裡面:

    ADD hello /  # 把本地hello 檔案新增到/目錄中
    ADD	test.tar.gz/  # ADDCOPY區別,ADD 還可以解壓縮,把test.tar.gz 壓縮檔案解壓縮到/目錄中
    
    WORKDIR /root
    ADD hello test/   # /root/test/hello
    
    WORKDIR /root
    COPY hello test/
    
    • COPY優於ADD,ADD除了COPY還有額外功能(解壓):適用於新增本地的檔案
    • 新增遠端檔案/目錄請使用curl或者wget
  • 6.ENV:設定常量

    ENV MYSQL_VERSION 5.6 # 設定常量
    RUN age-get install -y mysql-server  = '${MYSQL_VERSION}'\
    	&& rm -rf /var/lib/apt/lists/*  # 引用常量
    
    • 儘量使用ENV增加可維護性
  • 7.EXPOSE:設定埠

  • 8.CMD:設定容器啟動後預設執行的命令和引數

    • 1:容器啟動時預設執行的命令

    • 2:如果docker run 指令了其他命令,CMD命令會被忽略

    • 3:如果定義了多個CMD,只有最後一行會執行

      FROM centos:7.2.1511
      ENV name Docker
      CMD echo "hello $name"
      CMD echo "hello lh9"  # 只會輸出這條資訊
      
  • 9.ENTRYPOINT:設定容器啟動時執行的命令

    • 1:讓容器以應用程式或者服務的形式執行
    • 2:不會被忽略,一定會執行

6.2、Shell 格式 和 Exec格式:

  • Shell格式:要執行的命令當作shell格式來執行

    RUN apt-get install -y vim
    CMD echo 'hello docker'
    ENTRYPOINT echo 'hello docker'
    
    • 建立一個Dockerfile 檔案:

      FROM centos:7.2.1511
      ENV name Docker
      ENTRYPOINT echo "hello $name"
      
      • 建立映象:docker build -t docker-shell[映象的名字] .
      • 建立容器:docker run docker-shell[映象的名字]
      • 輸出結果:hello docker
      • 總結:在使用shell格式寫Dockerfile檔案的時候,ENV變數 name 可以使用
  • Exec 格式:特定的格式指明要執行的命令,和命令所跟的引數

    RUN ['apt-get', 'install', '-y', 'vim']
    CMD ['/bin/echo', 'hello docker']
    ENTRYPOINT ['/bin/echo', 'hello docker']
    
    • 建立一個Dockerfile檔案:

      FROM centos:7.2.1511
      ENV name Docker
      ENTRYPOINT ["/bin/bash", "-c", "echo hello $name"]
      
      • 建立映象:docker build -t docker-exec .
      • 建立容器:docker run docker-exec
      • 輸出結果:hello Docker
      • 總結:在使用exec格式的時候,需要在/bin/bash,增加引數"-c" 使用要列印的變數名

6.3、獲取centos映象:

  • 第一步:獲取centos映象

    [[email protected]_0_13_centos ~]# docker pull centos #獲取centos映象 (centos:7.2後面可以指定版本號)
    
  • 第二步:確認映象是否成功

    [[email protected]_0_13_centos ~]# docker images #檢視所有映象
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    centos              latest              49f7960eb7e4        8 hours ago         200MB
    ubuntu              latest              452a96d81c30        5 weeks ago         79.6MB
    hello-world         latest              e38bc07ac18e        7 weeks ago         1.85kB
    
  • 第三步:執行centOS映象

    [[email protected]_0_13_centos ~]# docker run -d -i -t 49f7960eb7e4 /bin/bash #執行centos映象
    c8fd9560e87fef4a36e3d92856467f76a5924b39253bedc1ddf2530bc7b18f7e
    
  • 第四步:進入容器

    [[email protected]_0_13_centos ~]# docker attach c8fd9560e87f
    
  • 第五步:退出容器

    exit
    
  • 以上第三、四步可以簡寫為:

    docker run -it 49f7960eb7e4 /bin/bash
    

7、映象的釋出(Dockerhub):

  • 第一步:
  • 第二步:
    • docker login 登入dockerhub
  • 第三步:
    • docker push imagename[映象的名字]
  • 第四步:
    • 登入dockerhub 就能看到釋出的映象檔案
    • 通過docker pull 映象檔名就可以下載到本地

8、實踐操作Dockerfile:

8.1、方式一:建立普通的Dockerfile檔案

  • 建立flask(python框架)應用:
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
	return 'hello docker'

if __name__ == '__main__':
	app.run()
  • 建立Dockerfile檔案:
FROM python2.7  # base image 是python2.7 
LABEL maintainer="Lv [email protected]"  # 作者的資訊
RUN pip install flask  # 執行pip install 安裝命令
COPY app.py /app/   #  將本地的app.py拷貝到/app/ 目錄中
WORKDIR /app  # 進入/app 目錄中
EXPOSE 5000  # 啟動的埠
CMD ["python", "app.py"]  #  執行的命令是exec
  • 建立容器並後臺執行容器:
docker run -d  [imagename]

8.2、方式二:建立 ENTRYPOINT + CMD 用法的Dockerfile檔案:

  • 建立Dockerfile檔案:

    FROM daocloud.io/ubuntu:14.04  # base image加版本號
    RUN apt-get update && apt-get install