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 [image] save
--導出鏡像到本地文件,可以使用-o參數指定文件名docker [image] load
--從本地文件導入鏡像,可以使用-i參數指定文件名,或者使用<導入
創建鏡像
- 基於已有鏡像的容器創建--
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 Kingram
# 構建鏡像時執行的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