docker初學

前言

初學docker,記錄下,強烈推薦這篇文章理解docker。

知識

git

用過git的同學肯定感受到通過git管理代碼是多麼方便,我認爲git主要作用有

  1. 本地管理代碼版本:提交,回退,查看修改。如果沒有git,可能會整天擔心,改動這裏,會不會影響原本其他功能?有git,影響了,就回退吧,寫代碼顧慮少了很多。
  2. 遠程代碼版本同步:聞說,很久以前將代碼部署到服務器是用ftp的,要保證服務器端代碼與本地一致很麻煩..,而git,能百分比保證。

git與docker

  • git管理的是代碼,在A主機寫好的代碼,在B主機git pull A機倉庫就能得到完全一致的代碼。
  • docker管理的是環境,在A機通過docker能正常運行nginx,php,mysql,通過docker,能很方便地同步到B機中。
  • Docker Hub對應 GitHub。

docker

  • 通過docker運行的服務->docker->操作系統,對通過docker運行的服務來說,操作系統是透明的,即不管是什麼操作系統,我照樣運行我的,docker處理了操作系統差異,提供了上層所希望的環境。

  • 獲得鏡像的方式:

    • 方式1:Dockerfile —生成—> 鏡像images
    • 方式2:Docker pull —獲取–> 鏡像
  • 容器 = 鏡像 + 讀寫層

  • 數據存儲問題:

    • 首先,在容器裏做的修改,如docker cp 文件 <container-id>://路徑,當容器被刪除後,修改就不存在了。要想保存修改,可以docker commit生成新鏡像,下次通過新鏡像docker run就能得到修改後的。

    理解1:爲什麼容器被刪除後,修改就不存在了呢?
    通過docker info可查看到docker根目錄,centos7下是/var/lib/docker/。當通過鏡像生成容器,會生成/var/lib/docker/container/容器id 目錄,複製過來的文件就保存在類似這些臨時目錄中,當容器刪除了,目錄不存在,修改自然不存在了。(實際複製過來的文件不是保存到/var/lib/docker/overlay2/的某個目錄中去了,內部原理不理解,暫時不管了)

    理解2:docker cp 文件 ....這個操作,實際作用的是某一隻讀層,不能理解爲cp命令是對容器操作,因爲容器 = 鏡像 + 讀寫層,鏡像也有隻讀層!理解到這個,當看到在Dockerfile裏出現COPY命令就不會覺得奇怪了。

    • 但如果面對數據庫數據的修改,這麼多修改,不可能每次都commit吧,此時可通過volume解決,它的作用是實現持久化存儲。通過docker run -v 主機目錄:容器目錄-v參數作主機目錄與容器目錄的映射
  • docker-compose:管理多容器應用

命令

容器生命週期管理

  • create,start,run

    • docker create爲 指定鏡像添加了一個可讀寫層(Read-Write-Layer),此時容器並未運行,處於Created狀態。

      • 通過pstree -a | grep docker查看,可知,未佔進程。
      • 可通過-p參數指定端口映射,類似參數屬於這個命令
    • docker start爲容器文件系統創建了一個進程隔離空間。注意,每一個容器只能夠有一個進程隔離空間。

    • docker run = docker create + docker start,類似git pull = git fetch + git merge

    docker create [-p..] <image-id>
    docker start <container-id>
    docker run [-p..] <image-id>
  • 停止相關

    docker stop <container-id>  ## 向運行中容器發送SIGTERM信號,linux信號15
    docker kill <container-id>  ## 發送SIGKILL信號,linux信號9
    docker pause <container-id> ## 利用了cgroups的特性將運行中的進程空間暫停 
  • 移除容器的可讀寫層,只能對非運行態容器執行

    docker rm <container-id>    

容器操作

  • 列出docker容器

    docker ps   ## 列出運行中容器
    docker ps -a    ## 列出所有容器
  • 獲取容器/鏡像的元數據。

    docker inspect <image-id/container-id>

本地鏡像管理

  • 列出所有頂層(top-level)鏡像。頂層鏡像:創建容器時使用的鏡像或直接pull下來的鏡像

    docker images
  • 列出所有鏡像,即列出所有可讀層

    docker images -a
  • 移除鏡像的一個可讀寫層

    docker rmi <image-id> ## 只能移除頂層
    -f <image-id> ## 強制刪除中間層
  • 根據Dockerfile生成本地鏡像

    docker build -t 標籤 Dockerfile所在目錄(上下文)
    docker build -t hello_docker .

容器rootfs命令

  • 容器與主機間數據拷貝

    docker cp 主機目錄/文件 <container-id>://目錄
    docker cp index.html 6d61b7cf92c5://usr/share/nginx/html
  • 將容器的可讀可寫層轉換爲只讀層

    docker commit -m "提交信息" <container-id> [tag]

鏡像倉庫

  • 從Docker Hub中查看鏡像

    docker search php
  • 從鏡像倉庫中拉取或者更新指定鏡像

    docker pull php
  • 登錄

    docker login
  • 將本地的鏡像上傳到鏡像倉庫,要先登陸到鏡像倉庫

    docker push 鏡像

info相關

docker info
docker version
docker <命令> --help  查看指定命令的介紹和參數

Dockerfile

這東西涉及很多~,簡單理解,Dockerfile被用了生成鏡像,Dockerfile裏的每一行都是所生成鏡像裏的一層

兩個簡單例子(引用自慕課docker教程,鏈接在此

  • 生成輸出hello docker的鏡像,Dockerfile內容如下:

    
    # 引入基礎鏡像,alpine是極小的linux環境,即生成的鏡像會非常小
    
    FROM alpine:latest
    
    # 鏡像作者
    
    MAINTAINER kbellx
    
    # 命令
    
    CMD echo "Hello Docker"
  • 生成帶有nginx服務器的鏡像

    
    # 引入ubuntu鏡像
    
    FROM ubuntu
    MAINTAINER kbellx
    
    # 在ubuntu環境下,鏡像環境,非主機環境
    
    RUN apt-get update
    
    # 安裝nginx
    
    RUN apt-get install -y nginx
    
    # 複製Dockerfile同級目錄下index.html文件到鏡像目錄
    
    COPY index.html /var/www/html
    
    # 指明docker run 鏡像,所執行的命令的路徑,參數等
    
    ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
    
    # 暴露鏡像80端口
    
    EXPOSE 80

相關鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章