docker 容器的啟動方式


1.Docker

  優勢:

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

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

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

    .持續交付和部署:

Docker是build once,run everywhere. 使用Docker 可以通過定制應用鏡像來實現持續集成、持續交付、部署。開發人員可以通過Dockerfile 來進行鏡像構建,並結合持續集成(Continuous Integration) 系統進行集成測試,而運維人員則可以直接在生產環境中快速部署該鏡像,甚至結合持續部署(Continuous Delivery/Deployment) 系統進行自動部署。

    .更輕松的遷移:

Docker 使用的分層存儲以及鏡像的技術,使得應用重復部分的復用更為容易,也使得應用的維護更新更加簡單,基於基礎鏡像進一步擴展鏡像也變得非常簡單。此外,Docker 團隊同各個開源項目團隊一起維護了一大批高質量的官方鏡像,既可以直接在生產環境使用,又可以作為基礎進一步定制,大大的降低了應用服務的鏡像制作成本。使用Dockerfile 使鏡像構建透明化,不僅僅開發團隊可以理解應用運行環境,也方便運維團隊理解應用運行所需條件,幫助更好的生產環境中部署該鏡像。

 

二、docker中的基本概念

鏡像(Image):

  鏡像,從認識上簡單的來說,就是面向對象中的類,相當於一個模板。從本質上來說,鏡像相當於一個文件系統。Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時准備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建之后也不會被改變。

容器(Container):

  容器,從認識上來說,就是類創建的實例,就是依據鏡像這個模板創建出來的實體。容器的實質是進程,但與直接在宿主執行的進程不同,容器進程運行於屬於自己的獨立的命名空間。因此容器可以擁有自己的root 文件系統、自己的網絡配置、自己的進程空間,甚至自己的用戶ID 空間。容器內的進程是運行在一個隔離的環境里,使用起來,就好像是在一個獨立於宿主的系統下操作一樣。這種特性使得容器封裝的應用比直接在宿主運行更加安全。

倉庫(Respository):

  倉庫,從認識上來說,就好像軟件包上傳下載站,有各種軟件的不同版本被上傳供用戶下載。鏡像構建完成后,可以很容易的在當前宿主機上運行,但是,如果需要在其它服務器上使用這個鏡像,我們就需要一個集中的存儲、分發鏡像的服務,Docker Registry 就是這樣的服務。

三、Docker 版本

  Docker 划分為CE 和EE。CE 即社區版(免費,支持周期三個月),EE 即企業版,強調安全,付費使用。Docker在1.13 版本之后,從2017年的3月1日開始,版本命名規則變為如下:

項目 說明
版本格式 YY.MM
Stable版本 每個季度發行
Edge版本 每個月發型

 

  Docker CE 每月發布一個Edge 版本(17.03, 17.04, 17.05…),每三個月發布一個Stable 版本(17.03, 17.06, 17.09…),Docker EE 和Stable 版本號保持一致,但每個版本提供一年維護。

四、分層存儲

  因為鏡像包含操作系統完整的root 文件系統,其體積往往是龐大的,因此在Docker設計時,就充分利用Union FS 的技術,將其設計為分層存儲的架構。所以嚴格來說,鏡像並非是像一個ISO 那樣的打包文件,鏡像只是一個虛擬的概念,其實際體現並非由一個文件組成,而是由一組文件系統組成,或者說,由多層文件系統聯合組成。

鏡像構建時,會一層層構建,前一層是后一層的基礎。每一層構建完就不會再發生改變,后一層上的任何改變只發生在自己這一層。比如,刪除前一層文件的操作,實際不是真的刪除前一層的文件,而是僅在當前層標記為該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,但是實際上該文件會一直跟隨鏡像。因此,在構建鏡像的時候,需要額外小心,每一層盡量只包含該層需要添加的東西,任何額外的東西應該在該層構建結束前清理掉。

  分層存儲的特征還使得鏡像的復用、定制變的更為容易。甚至可以用之前構建好的鏡像作為基礎層,然后進一步添加新的層,以定制自己所需的內容,構建新的鏡像。

五、建立docker用戶組

  默認情況下,docker 命令會使用Unix socket 與Docker 引擎通訊。而只有root 用戶和docker 組的用戶才可以訪問Docker 引擎的Unix socket。出於安全考慮,一般Ubuntu系統上不會直接使用root 用戶。因此,更好地做法是將需要使用docker 的用戶加入docker用戶組

  # 建立docker組

  sudo groupadd docker

  # 將當前用戶加入docker組

  sudo usermod -aG docker $USER

 

六、配置國內鏡像加速

  在/etc/docker/daemon.json 中寫入如下內容(如果文件不存在請新建該文件)

  {

     "registry-mirrors": [

     "https://registry.docker-cn.com"

     ]

}

  重新啟動服務

  systemctl daemon-reload

  systemctl restart docker

 七、Docker 的C/S模式

  Docker 采用了C/S 架構,包括客戶端和服務端。Docker 守護進程(Daemon)作為服務端 
接受來自客戶端的請求,並處理這些請求(創建、運行、分發容器)。

  Docker 守護進程一般在宿主主機后台運行,等待接收來自客戶端的消息;Docker 客戶端則為用戶提供一系列可執行命令,用戶用這些命令實現跟Docker 守護進程交互。

Docker也為我們提供了Remote API來操作Docker的守護進程,也意味着我們可以通過自己的程序來控制Docker的運行。客戶端和服務端既可以運行在一個機器上,也可通過socket 或者RESTful API 來進行通信:

至於Docker的客戶端與守護進程之間的通信,其連接方式為socket連接。主要有三種socket連接方式:

unix:///var/run/docker.sock
tcp://host:port
fd://socketfd
完整的Docker的C/S連接方式的本質可以一般表示為如下:

八、使用Docker

  1、容器的基本操作

    >啟動一次操作容器:docker run IMAGE_NAME [COMMAND] [ARG…]

    例如,啟動一個容器輸出hello world。由於剛裝上Docker,沒有任何鏡像,所以會先下載一個最新的ubuntu18.04的docker鏡像。一次操作容器在處理完操作后會立即關閉容器。

    [root@localhost ~]# docker run centos echo "Hello World"
    Hello World

     >啟動交互式容器:docker run -t -i –name=自定義名稱 IMAGE_NAME /bin/bash

      -i –interactive=true | false,默認是false

      -t –tty=true | false,默認是false

      –name 給啟動的容器自定義名稱,方便后續的容器選擇操作

    啟動交互式的容器,就是類似虛擬機、雲主機的操作方式,操作完一個命令后仍然可以繼續:

    [root@localhost ~]# docker run -i -t centos /bin/bash

    [root@189987ca0084 /]#
    [root@189987ca0084 /]#
    [root@189987ca0084 /]# ll
    total 12
    -rw-r--r-- 1 root root 12076 Dec 5 01:37 anaconda-post.log
    lrwxrwxrwx 1 root root 7 Dec 5 01:36 bin -> usr/bin
    drwxr-xr-x 5 root root 360 Mar 16 03:31 dev
    drwxr-xr-x 1 root root 66 Mar 16 03:31 etc
    drwxr-xr-x 2 root root 6 Apr 11 2018 home
    lrwxrwxrwx 1 root root 7 Dec 5 01:36 lib -> usr/lib
    lrwxrwxrwx 1 root root 9 Dec 5 01:36 lib64 -> usr/lib64
    drwxr-xr-x 2 root root 6 Apr 11 2018 media
    drwxr-xr-x 2 root root 6 Apr 11 2018 mnt
    drwxr-xr-x 2 root root 6 Apr 11 2018 opt
    dr-xr-xr-x 133 root root 0 Mar 16 03:31 proc
    dr-xr-x--- 2 root root 114 Dec 5 01:37 root
    drwxr-xr-x 11 root root 148 Dec 5 01:37 run
    lrwxrwxrwx 1 root root 8 Dec 5 01:36 sbin -> usr/sbin
    drwxr-xr-x 2 root root 6 Apr 11 2018 srv
    dr-xr-xr-x 13 root root 0 Mar 16 03:31 sys
    drwxrwxrwt 7 root root 132 Dec 5 01:37 tmp
    drwxr-xr-x 13 root root 155 Dec 5 01:36 usr
    drwxr-xr-x 18 root root 238 Dec 5 01:36 var
    [root@189987ca0084 /]# cat /etc/issue
    \S
    Kernel \r on an \m

    [root@189987ca0084 /]# exit

    exit

     >查看容器:docker ps [-a][-l]

      省略參數:列出正在運行的容器

      -a: 列出所有容器

      -l: 列出最近的容器

    >查看指定的容器:docker inspect  name|id

    >重新啟動停止的容器:docker start [-i] 容器名

    >刪除停止的容器:docker rm name | id

    >>守護式容器:

      交互式容器在運行完命令退出后即停止,而實際中我們常常需要能夠長時間運行,即使退出也能后台運行的容器,而守護式容器具備這一功能。

      守護式容器具有:

      1.能夠長期運行。

      2.沒有交互式回話。

      3.適合於運行應用程序和服務。

       ===以守護形式運行容器:(我們執行完需要的操作退出容器時,不要使用exit,可以使用快捷鍵Ctrl+Q或Ctrl+P代替,以守護形式退出容器。)

       ===進入到已經運行的容器:(以守護形式退出容器,想要再次進入,需要使用attach命令:docker  attch  name |  id )

        docker attach  nginx(容器的名字)

      

      啟動守護式容器,可以在后台為我們執行操作:docker run -d IMAGE_NAME [COMMAND] [ARG…]

      當命令在后台執行完畢,容器還是會關閉。這里防止容器立刻退出,寫一個腳本循環輸出“hello world”。

      docker run --name hiahia -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

      >查看容器日志:當守護式容器在后台運行時,我們可以利用docker的日志命令查看其輸出:docker logs [-f] [-t] [–tail] IMAGE_NAME

      -f  --follows=true | false ,默認是false, 顯示更新

      -t  --timestamps=true | false ,默認是false, 顯示時間戳

      --tail = "all"  行數,顯示最新的日志

      例如: docker logs  web(容器名)  --tail  0 -tf

      >查看容器內的進程:

        對運行的容器查看進程:docker top Name(容器名)

      >運行中容器啟動新進程:

        Docker的理念是一個容器運行一個服務,但是往往需要對一個服務進行監控,所以也需要在已經運行服務的容器啟動新的進程:docker exec [-d] [-i] [-t]       IMAGE_NAME [COMMAND] [ARG…]

      例如:  docker exec -i -t hiahia /bin/bash

      >停止守護式容器

        發送信號停止容器:docker stop   容器名

        強制停止:docker  kill  容器名

    

      

  

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM