1. 程式人生 > 實用技巧 >Docker基礎筆記&基於GO專案建立Docker映象

Docker基礎筆記&基於GO專案建立Docker映象

Docker基礎筆記&基於GO專案建立Docker映象

核心概念

  • Doker映象--包含一個基本的作業系統執行環境和應用程式,映象是建立Docker容器的基礎。
  • Docker容器--如果把映象理解成物件,則容器就是物件的例項,他也包含基本的作業系統環境,並且可以啟動、開始、停止、刪除,每個容器之間是互相隔離的
  • Docker倉庫--存放Docker映象的倉庫,分為公有倉庫和私有倉庫
  • 倉庫註冊伺服器--存放倉庫的地方,每個倉庫集中存放某一類映象,往往包括多個映象檔案,通過不同的標籤(tag)來進行區分

獲取映象

  • docker [image] pull NAME[:TAG]--從DockerHub獲取映象,NAME是映象倉庫名稱(用來區分映象), TAG是映象的標籤(往往用來表示版本資訊)。如果不顯式指定TAG,則預設會選擇latest標籤,這會下載倉庫中最新版本的映象。
  • docker images/docker image ls--列出本機已有映象資訊
  • docker tag ubuntu:18.04 myubuntu:18.04--修改映象標籤

刪除和清理映象

  • docker rmi/docker image rm--刪除映象
    • -f, -force:強制刪除映象,即使有容器依賴它;
    • -no-prune:不要清理未帶標籤的父映象。
  • docker image prune--清理無用的臨時映象
    • -a, -all:刪除所有無用映象,不光是臨時映象;
    • -f, -force:強制刪除映象,而不進行提示確認。

建立映象

  • 基於已有映象的容器建立--docker commit [OPTIONS]
    --類似於git的commit命令
    • -a, --author="":作者資訊;
    • -c, --change=[]:提交的時候執行Dockerfile指令,包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等;
    • -m, --message="":提交訊息;
    • -p, --pause=true:提交時暫停容器執行。
  • 基於本地模板匯入--docker import
  • 基於Dockerfile建立--docker [image] build NAME[:TAG]--Dockerfile是一個文字檔案,利用給定的指令描述基於某個父映象建立新映象的過程。

Dockerfile語法知識

# 指定基礎映象,必須為第一個命令
FROM <image name>

# 指定作者
格式:
    MAINTAINER <name>
示例:
    MAINTAINER Jasper Xu
    MAINTAINER [email protected]
    MAINTAINER Jasper Xu <[email protected]>

# 構建映象時執行的shell或者exec命令,UN指令建立的中間映象會被快取,並會在下次構建中使用。如果不想使用這些快取映象,可以在構建時指定--no-cache引數,如:docker build --no-cache
格式:
    RUN <command>
exec執行
格式:
    RUN ["executable", "param1", "param2"]
示例:
    RUN ["executable", "param1", "param2"]
    RUN apk update
    RUN ["/etc/execfile", "arg1", "arg1"]

# 將本地檔案新增到容器中
格式:
    ADD <src>... <dest>
    ADD ["<src>",... "<dest>"] # 用於支援包含空格的路徑

示例:
    ADD hom* /mydir/          # 新增所有以"hom"開頭的檔案
    ADD hom?.txt /mydir/      # ? 替代一個單字元,例如:"home.txt"
    ADD test relativeDir/     # 新增 "test" 到 `WORKDIR`/relativeDir/
    ADD test /absoluteDir/    # 新增 "test" 到 /absoluteDir/

# 指定容器啟動時執行的命令,Dockerfile只允許使用一次CMD指令。 使用多個CMD會抵消之前所有的指令,只有最後一個指令生效。 CMD有三種形式:
格式:
    CMD ["executable","param1","param2"] (執行可執行檔案,優先)
    CMD ["param1","param2"] (設定了ENTRYPOINT,則直接呼叫ENTRYPOINT新增引數)
    CMD command param1 param2 (執行shell內部命令)
示例:
    CMD echo "This is a test." | wc -
    CMD ["/usr/bin/wc","--help"]
注:
   CMD不同於RUN,CMD用於指定在容器啟動時所要執行的命令,而RUN用於指定映象構建時所要執行的命令。
   
# 配置給容器一個可執行的命令,這意味著在每次使用映象建立容器時一個特定的應用程式可以被設定為預設程式。同時也意味著該映象每次被呼叫時僅能執行指定的應用。
格式:
    ENTRYPOINT ["executable", "param1", "param2"] (可執行檔案, 優先)
    ENTRYPOINT command param1 param2 (shell內部命令)
示例:
    FROM ubuntu
    ENTRYPOINT ["top", "-b"]
    CMD ["-c"]

# 指定RUN、CMD與ENTRYPOINT命令的工作目錄。在使用docker run執行容器時,可以通過-w引數覆蓋構建時所設定的工作目錄。
格式:
    WORKDIR /path/to/workdir
示例:
    WORKDIR /a  (這時工作目錄為/a)
    WORKDIR b  (這時工作目錄為/a/b)
    WORKDIR c  (這時工作目錄為/a/b/c)

# 指定互動埠,EXPOSE並不會讓容器的埠訪問到主機。要使其可訪問,需要在docker run執行容器時通過-p來發布這些埠,或通過-P引數來發布EXPOSE匯出的所有埠
格式:
    EXPOSE <port> [<port>...]
示例:
    EXPOSE 80 443
    EXPOSE 8080
    EXPOSE 11211/tcp 11211/udp

舉個栗子:一個簡單的GO程式建立為docker映象

程式碼如下:

//hello.go
package main

import (
    "fmt"
)

func main() {
    fmt.Println("Hello, World!")
}

第一步編譯:

go build -o hello

第二步編寫Dockerfile

FROM golang

RUN mkdir $GOPATH/src/hello

COPY ./hello $GOPATH/src/hello

WORKDIR $GOPATH/src/hello

RUN chmod +x hello

第三步建立映象

docker build -t hello:1.0 .

# 檢視映象
docker images

第四部啟動容器

docker run hello:1.0