Docker 快速上手學習入門教程

原文連接:http://tabalt.net/blog/docker...html

Docker是一個使用Golang開發的開源應用容器引擎,讓開發者能夠打包應用和依賴到一個輕量級、可移植的鏡像中,而後分發到任何流行的Linux機器上,並在這些機器上啓動容器,容器之間隔離獨立,資源消耗低。linux

Docker的常見概念

  • 鏡像 Image

    鏡像是一個分層的文件系統,集成了容器運行時所需的操做系統、應用程序、運行時環境等;鏡像是隻讀的,構建以後內容不會被改變,可被複制和分發。nginx

  • 容器 Container

    容器是由鏡像啓動的運行時實例,可被啓動、中止、刪除,容器之間相互隔離,容器對資源的使用能夠作限制。容器從鏡像啓動時,Docker會在鏡像的上層建立一個可寫層。git

  • 鏡像倉庫 Image Repository

    鏡像倉庫相似於代碼倉庫,用來集中存放鏡像文件。鏡像編譯好後推送(push)到倉庫中,在運行容器的機器上拉取(pull)下來即完成了鏡像的複製和分發。github

  • Dockerfile

    Dockerfile是由一系列命令和參數構成的腳本,這些命令基於基礎鏡像,將業務須要的應用程序和依賴環境打包起來,並最終建立一個新的鏡像。docker

  • 客戶端Client和守護進程Daemon

    Docker是C/S(客戶端Client-服務器Server)架構模式,客戶端是名爲docker的命令行工具,服務器是名爲dockerd的守護進程,用戶經過客戶端向服務器提供的接口發送請求和指令,守護進程執行一系列操做後返回給客戶端結果。centos

Docker各組件結構

architecture.jpg

下載&安裝&啓動 Docker

Docker的官方文檔(https://docs.docker.com/install/ )上提供了很是詳細的安裝流程,簡單摘錄在CentOS 7.x 上下載Docker社區版並安裝的操做命令:服務器

mkdir ~/soft && cd ~/soft
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-18.06.1.ce-3.el7.x86_64.rpm

sudo yum install docker-ce-18.06.1.ce-3.el7.x86_64.rpm
sudo systemctl start docker
sudo docker run hello-world

當控制檯輸出Hello from Docker!加一大段介紹文字時,安裝就大功告成了。網絡

運行Docker的Hello World容器的一些細節

剛剛咱們成功運行了Docker提供的Hello World版容器,大體的執行過程以下:架構

  • 命令行執行的Docker客戶端程序,解析出命令run和參數hello-world,並請求Docker Daemon守護進程提供的相關接口
  • Docker Daemon獲得要將名爲hello-world的鏡像啓動爲容器的請求後,嘗試在本地查找名爲hello-world的鏡像
  • 由於咱們是剛安裝的Docker,本地並無這個鏡像,Docker Daemon會嘗試從官方鏡像倉庫拉取名爲hello-world的鏡像
  • 名爲hello-world的鏡像拉取到本地後,Docker Daemon再真正執行啓動容器的操做
  • 容器啓動起來後,執行構建鏡像時指定的/hello程序,輸出Hello from Docker!等介紹文字
  • 介紹文字輸出完畢後,/hello程序就退出了,Docker容器也跟着退出

上述流程中,咱們的Docker Daemon程序自動拉取了hello-world鏡像,也能夠經過命令先行拉取下來:

sudo docker pull hello-world

經過下面的命令能夠查看本地的鏡像列表:

[tabalt@dev ~]$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              2cb0d9787c4d        6 weeks ago         1.85kB

容器運行完退出後,其實還有殘留,可經過以下命令看到:

[tanyanping@p10992v ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                         PORTS               NAMES
bb61ae864566        hello-world         "/hello"            About an hour ago   Exited (0) About an hour ago                       modest_cray

Dockerfile 指令介紹

Dockerfile由一行行的命令語句組成,支持以 # 開頭的註釋,主要有四個部分:基礎鏡像信息、維護者信息、鏡像操做指令、容器啓動指令。 主要指令列舉以下(加*表示經常使用):

指令 做用 格式 說明
FROM* 指定基礎鏡像 FROM <image>
FROM <image>:<tag>
首條指令必須爲FROM
可以使用多個FROM 建立多個鏡像
MAINTAINER 指定維護者 MAINTAINER <name>
ENV* 指定環境變量 ENV <key> <value> 後續RUN指令和容器中可用
USER 指定運行容器的用戶 USER daemon 用戶名或UID,對後續的RUN指令生效
WORKDIR 指定工做目錄 WORKDIR /path/to/workdir 對後續RUN、CMD、ENTRYPOINT指令生效
VOLUME 建立掛載點 VOLUME ["/data"]
ONBUILD 做爲基礎鏡像時的指令 ONBUILD [INSTRUCTION]
RUN* 執行命令 RUN <command>
RUN ["executable", "param1", "param2"]
前者爲/bin/sh -c執行
後者使用 exec 執行
命令較長時可用\換行
ADD* 複製文件到容器 ADD <src> <dest> 路徑或URL,tar文件自動解壓
COPY* 複製文件到容器 COPY <src> <dest> 源目錄爲本地目錄時,推薦使用
ENTRYPOINT* 容器啓動後執行的命令 ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
不可被docker run的參數覆蓋
多條命令只有最後一條生效
CMD* 容器啓動執行的命令 CMD ["executable","param1","param2"]
CMD command param1 param2
CMD ["param1","param2"]
第一種使用exec執行,推薦使用
第二種在/bin/sh中執行,支持交互
第三種是ENTRYPOINT的默認參數
多條CMD命令只有最後一條生效
EXPOSE* 指定暴露的端口號 EXPOSE <port> [<port>...]

能夠經過幾個知名項目中的Dockerfile文件來學習一下各個指令的應用:

Dockerfile編譯成鏡像並運行

編寫一個能編譯運行並輸出Hello Docker!的Dockerfile:

[tabalt@dev ~]$ cd ~/docker/hello-docker/
[tabalt@dev ~/docker/hello-docker]$ cat Dockerfile
FROM alpine:latest

CMD echo "Hello World!"

將Dockerfile編譯成名爲hello-docker的鏡像:

[tabalt@dev ~/docker/hello-docker]$ sudo docker build -t hello-docker:latest ./
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM alpine:latest
latest: Pulling from library/alpine
8e3ba11ec2a2: Already exists 
Digest: sha256:7043076348bf5040220df6ad703798fd8593a0918d06d3ce30c6c93be117e430
Status: Downloaded newer image for alpine:latest
 ---> 11cd0b38bc3c
Step 2/2 : CMD echo "Hello World!"
 ---> Running in 28dc89adf3d5
Removing intermediate container 28dc89adf3d5
 ---> 5614b1e6b7eb
Successfully built 5614b1e6b7eb
Successfully tagged hello-docker:latest

[tabalt@dev ~/docker/hello-docker]$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-docker        latest              5614b1e6b7eb        22 seconds ago      4.41MB
alpine              latest              11cd0b38bc3c        7 weeks ago         4.41MB

運行名爲hello-docker的鏡像:

[tabalt@dev ~/docker/hello-docker]$ sudo docker run -i -t --rm --net=host hello-docker:latest
Hello World!

Docker客戶端經常使用命令

前面已經見識過Docker的一些客戶端命令及用法,接下來再看看一些經常使用命令的詳細介紹:

  • docker version

    客戶端和服務端 版本信息

  • docker info

    鏡像數、容器數、配置等系統信息

  • docker search

    從Docker Hub中搜索符合條件的鏡像

    docker search [OPTIONS] TERM
    
    Options:
        -f, --filter filter   根據提供的條件過濾輸出
        --format string   用Go模板語法格式化打印的搜索結果
        --limit int       搜索結果最大條數(默認 25)
        --no-trunc        顯示完整輸出
  • docker pull

    從Docker Hub中拉取或者更新指定鏡像

    docker pull [OPTIONS] NAME[:TAG|@DIGEST]
    
    Options:
    -a, --all-tags                下載倉庫中全部打TAG的鏡像
      --disable-content-trust   跳過鏡像驗證(默認開啓)
      --platform string         如服務器具備多平臺功能,可設置平臺
  • docker login

    登陸Docker Hub,須要輸入用戶名、密碼、郵箱

  • docker logout

    退出登陸

  • docker images

    列出鏡像

    docker images [OPTIONS] [REPOSITORY[:TAG]]
    
    Options:
        -a, --all             顯示全部鏡像(默認隱藏中間鏡像)
            --digests         顯示摘要
        -f, --filter filter   根據提供的條件過濾輸出
            --format string   用Go模板語法格式化打印的搜索結果
            --no-trunc        顯示完整輸出
        -q, --quiet           只顯示數字ID
  • docker ps

    列出容器

    docker ps [OPTIONS]
    
    Options:
        -a, --all             顯示全部容器(默認只顯示運行中的)
        -f, --filter filter   根據提供的條件過濾輸出
            --format string   用Go模板語法格式化打印的搜索結果
        -n, --last int        顯示最新建立的n個容器(包含全部狀態)(默認爲-1)
        -l, --latest          顯示最新建立的容器(包含全部狀態)
            --no-trunc        顯示完整輸出
        -q, --quiet           只顯示數字ID
        -s, --size            顯示文件總大小
  • docker rmi

    刪除鏡像

    docker rmi [OPTIONS] IMAGE [IMAGE...]
    
    Options:
        -f, --force      強制刪除鏡像
        --no-prune   不要刪除未打Tag的父鏡像
  • docker rm

    刪除容器

    docker rm [OPTIONS] CONTAINER [CONTAINER...]
    
    Options:
        -f, --force     強制刪除運行中的容器(使用SIGKILL)
        -l, --link      刪除指定的連接
        -v, --volumes   刪除與容器關聯的卷
  • docker history

    查看鏡像建立歷史

    docker history [OPTIONS] IMAGE
    
    Options:
            --format string   用Go模板語法格式化打印的搜索結果
        -H, --human           以人類可讀格式打印尺寸和日期(默認爲true)
            --no-trunc        顯示完整輸出
        -q, --quiet           只顯示數字ID
  • docker start|stop|restart

    啓動、中止和重啓一個或多個指定容器

  • docker kill

    殺死一個或多個指定容器

  • docker events

    從服務器拉取動態

  • docker save

    將指定鏡像保存成 tar 歸檔文件

  • docker load

    從 tar 鏡像歸檔中載入鏡像

  • docker export

    將指定的容器保存成 tar 歸檔文件

  • docker import

    從歸檔文件(支持遠程文件)建立一個鏡像

  • docker top

    查看一個正在運行容器的進程,支持 ps 命令參數。

  • docker inspect

    檢查鏡像或者容器的參數,默認返回 JSON 格式。

  • docker pause

    暫停某一容器的全部進程。

  • docker unpause

    恢復某一容器的全部進程。

  • docker tag

    標記本地鏡像,將其納入某一倉庫

    docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
  • docker push

    將鏡像推送至遠程倉庫,默認爲 Docker Hub

  • docker logs

    獲取容器運行時的輸出日誌

  • docker run

    啓動一個容器,在其中運行指定命令。

    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    
    Options:
    -a      stdin 指定標準輸入輸出內容類型,可選 STDIN、STDOUT、STDERR 三項
    -d      後臺運行容器,並返回容器ID;
    -i      以交互模式運行容器,一般與 -t 同時使用;
    -t      爲容器從新分配一個僞輸入終端,一般與 -i 同時使用;
    --name="nginx-lb"           爲容器指定一個名稱;
    --dns 8.8.8.8               指定容器使用的DNS服務器,默認和宿主一致;
    --dns-search example.com    指定容器DNS搜索域名,默認和宿主一致;
    -h "mars"                   指定容器的hostname;
    -e username="ritchie"       設置環境變量;
    --env-file=[]               從指定文件讀入環境變量;
    --net="bridge"              指定容器的網絡鏈接類型,支持 bridge、host、none
    
    # 更多參數請查看 docker help run

更多資料

原文連接:http://tabalt.net/blog/docker...

相關文章
相關標籤/搜索