[TOC]
# 簡介
Dockerfile 使用準則
1. 大: 首字母必須大寫D
2. 空: 盡量將Dockerfile放在空目錄中。
3. 單: 每個容器盡量只有一個功能。
4. 少: 執行的命令越少越好。
Dockerfile文件內容: 首行注釋信息 指令(大寫) 參數
Dockerfile使用命令:
~~~
#構建鏡像命令格式:
docker build -t [鏡像名]:[版本號][Dockerfile所在目錄] #構建樣例:
docker build -t nginx:v0.2 /opt/dockerfile/nginx/ #參數詳解:
-t 指定構建后的鏡像信息,
/opt/dockerfile/nginx/ 則代表Dockerfile存放位置,如果是當前目錄,則用 .(點)表示
~~~
# 基礎指令
## FROM
~~~
#格式:
FROM <image>
FROM <image>:<tag>
#解釋:
#FROM 是 Dockerfile 里的第一條而且只能是除了首行注釋之外的第一條指令 #可以有多個FROM語句,來創建多個image
#FROM 后面是有效的鏡像名稱,如果該鏡像沒有在你的本地倉庫,那么就會從遠程倉庫Pull取,如果遠程也
沒有,就報錯失敗
#下面所有的 系統可執行指令 在 FROM 的鏡像中執行。
~~~
## MAINTAINER
~~~
MAINTAINER
#格式:
MAINTAINER <name>
#解釋:
#指定該dockerfile文件的維護者信息。類似我們在docker commit 時候使用-a參數指定的信息
~~~
## RUN
~~~
RUN
#格式:
RUN <command> (shell模式) RUN["executable", "param1", "param2"] (exec 模式)
#解釋:
#表示當前鏡像構建時候運行的命令,如果有確認輸入的話,一定要在命令中添加 -y #如果命令較長,那么可以在命令結尾使用 \ 來換行 #生產中,推薦使用上面數組的格式
#注釋:
#shell模式:類似于 /bin/bash -c command
#舉例: RUN echo hello
#exec模式:類似于 RUN["/bin/bash", "-c", "command"] #舉例: RUN["echo", "hello"]
~~~
## EXPOSE
~~~
EXPOSE
#格式:
EXPOSE <port> [<port>...]
#解釋: 設置Docker容器對外暴露的端口號,Docker為了安全,不會自動對外打開端口,如果需要外部提供訪問, 還需要啟動容器時增加-p或者-P參數對容器的端口進行分配
~~~
# 運行時指令
## CMD
~~~
#格式:
CMD ["executable","param1","param2"] (exec 模式)推薦 CMD command param1 param2 (shell模式) CMD ["param1","param2"] 提供給ENTRYPOINT的默認參數;
#解釋:
#CMD指定容器啟動時默認執行的命令 #每個Dockerfile只能有一條CMD命令,如果指定了多條,只有最后一條會被執行 #如果你在啟動容器的時候使用docker run 指定的運行命令,那么會覆蓋CMD命令。 #舉例: CMD ["/usr/sbin/nginx","-g","daemon off;"]
#CMD指令實踐:
#修改Dockerfile文件內容: #在上一個Dockerfile文件內容基礎上,末尾增加下面一句話:
CMD ["/usr/sbin/nginx","-g","daemon off;"]
#構建鏡像
:~/docker/images/nginx$ docker build -t ubuntu-nginx:v0.3 . #根據鏡像創建容器,創建時候,不添加執行命令
:~/docker/images/nginx$ docker run --name nginx-1 -itd ubuntu-nginx:v0.3 #根據鏡像創建容器,創建時候,添加執行命令/bin/bash
:~/docker/images/nginx$ docker run --name nginx-2 -itd ubuntu-nginx:v0.3
/bin/bash
docker ps
#發現兩個容器的命令行是不一樣的 itcast@itcast-virtual-machine:~/docker/images/nginx$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED 921d00c3689f ubuntu-nginx:v0.3 "/bin/bash" 5 seconds ago
e6c39be8e696 ubuntu-nginx:v0.3 "/usr/sbin/nginx -g ..." 14 seconds ago
#查看兩個容器詳細ip
itcast@itcast-virtual-machine:~/docker/images/nginx$ docker inspect
921d00c3689f
"IPAddress": "192.168.110.65",
itcast@itcast-virtual-machine:~/docker/images/nginx$ docker inspect
NAMES nginx-
nginx-
2 1
e6c39be8e696
CMD
"IPAddress": "192.168.110.64",
#格式:
CMD ["executable","param1","param2"] (exec 模式)推薦 CMD command param1 param2 (shell模式) CMD ["param1","param2"] 提供給ENTRYPOINT的默認參數;
#解釋:
#CMD指定容器啟動時默認執行的命令 #每個Dockerfile只能有一條CMD命令,如果指定了多條,只有最后一條會被執行 #如果你在啟動容器的時候使用docker run 指定的運行命令,那么會覆蓋CMD命令。 #舉例: CMD ["/usr/sbin/nginx","-g","daemon off;"]
#CMD指令實踐:
#修改Dockerfile文件內容:
#在上一個Dockerfile文件內容基礎上,末尾增加下面一句話:
CMD ["/usr/sbin/nginx","-g","daemon off;"]
#構建鏡像
:~/docker/images/nginx$ docker build -t ubuntu-nginx:v0.3 . #根據鏡像創建容器,創建時候,不添加執行命令
:~/docker/images/nginx$ docker run --name nginx-1 -itd ubuntu-nginx:v0.3 #根據鏡像創建容器,創建時候,添加執行命令/bin/bash
:~/docker/images/nginx$ docker run --name nginx-2 -itd ubuntu-nginx:v0.3
/bin/bash
docker ps
~~~
## ENTRYPOINT
~~~
#格式:
ENTRYPOINT ["executable", "param1","param2"] (exec 模式) ENTRYPOINT command param1 param2 (shell 模式)
#解釋:
#和CMD 類似都是配置容器啟動后執行的命令,并且不會被docker run 提供的參數覆蓋。 #每個Dockerfile 中只能有一個ENTRYPOINT,當指定多個時,只有最后一個起效。 #生產中我們可以同時使用ENTRYPOINT 和CMD,
#想要在docker run 時被覆蓋,可以使用"docker run --entrypoint"
#ENTRYPOINT指令實踐:
#修改Dockerfile文件內容:
#在上一個Dockerfile 文件內容基礎上,修改末尾的CMD 為ENTRYPOINT: ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
#構建鏡像
:~/docker/images/nginx$ docker build -t ubuntu-nginx:v0.4 .
#根據鏡像創建容器,創建時候,不添加執行命令
:~/docker/images/nginx$ docker run --name nginx-3 -itd ubuntu-nginx:v0.4
#根據鏡像創建容器,創建時候,添加執行命令/bin/bash
:~/docker/images/nginx$ docker run --name nginx-4 -itd ubuntu-nginx:v0.4
/bin/bash
#查看ENTRYPOINT是否被覆蓋
:~/docker/images/nginx$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED
NAMES
e7a2f0d0924e ubuntu-nginx:v0.4 "/usr/sbin/nginx -g ..." 59 seconds ago
nginx-4
c92b2505e28e ubuntu-nginx:v0.4 "/usr/sbin/nginx -g ..." About a minute ago
nginx-3
#根據鏡像創建容器,創建時候,使用--entrypoint參數,添加執行命令/bin/bash
docker run --entrypoint "/bin/bash" --name nginx-5 -itd ubuntu-nginx:v0.4
#查看ENTRYPOINT是否被覆蓋
:~/docker/images/nginx$ docker ps CONTAINER ID IMAGE COMMAND
NAMES
6c54726b2d96 ubuntu-nginx:v0.4 "/bin/bash"
nginx-5
~~~
## CMD ENTRYPOINT 綜合使用實踐
~~~
CMD ENTRYPOINT 綜合使用實踐
#修改Dockerfile文件內容:
# 在上一個Dockerfile文件內容基礎上,修改末尾的ENTRYPOINT
:~/docker/images/nginx$ vim Dockerfile ENTRYPOINT ["/usr/sbin/nginx"]
CMD ["-g"]
#構建鏡像
:~/docker/images/nginx$ docker build -t ubuntu-nginx:v0.5 . #根據鏡像創建容器,創建時候,不添加執行命令
:~/docker/images/nginx$ docker run --name nginx-6 -d ubuntu-nginx:v0.5
#查看效果
:~/docker/images/nginx$ docker ps -a
CONTAINER ID IMAGE
NAMES
e28875d281eb ubuntu-nginx:v0.5
nginx-6
COMMAND
"/usr/sbin/nginx -g"
CREATED
9 seconds ago
#根據鏡像創建容器,創建時候,不添加執行命令,覆蓋cmd的參數 -g "daemon off;" :~/docker/images/nginx$ docker run --name nginx-7 -d ubuntu-nginx:v0.5 -g "daemon off;"
#查看效果
itcast@itcast-virtual-machine:~/docker/images/nginx$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED e5addad86ef5 ubuntu-nginx:v0.5 "/usr/sbin/nginx -g ..." 5 seconds ago
7
#注釋:
#任何docker run設置的命令參數或者CMD指令的命令,都將作為ENTRYPOINT 指令的命令參數,追加到 ENTRYPOINT指令之后
~~~
# 文件編輯指令
## ADD
~~~
#ADD #格式:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"] #解釋:
#將指定的<src> 文件復制到容器文件系統中的<dest>
#src 指的是宿主機,dest 指的是容器
#所有拷貝到container 中的文件和文件夾權限為0755,uid 和gid 為0 #如果文件是可識別的壓縮格式,則docker 會幫忙解壓縮
#注意:
#1、如果源路徑是個文件,且目標路徑是以/ 結尾, 則docker 會把目標路徑當作一個目錄,會把源文件 拷貝到該目錄下;
#如果目標路徑不存在,則會自動創建目標路徑。
#2、如果源路徑是個文件,且目標路徑是不是以/ 結尾,則docker 會把目標路徑當作一個文件。 #如果目標路徑不存在,會以目標路徑為名創建一個文件,內容同源文件; #如果目標文件是個存在的文件,會用源文件覆蓋它,當然只是內容覆蓋,文件名還是目標文件名。
#如果目標文件實際是個存在的目錄,則會源文件拷貝到該目錄下。注意,這種情況下,最好顯示的以/ 結尾,以 避免混淆。
#3、如果源路徑是個目錄,且目標路徑不存在,則docker 會自動以目標路徑創建一個目錄,把源路徑目錄 下的文件拷貝進來。
#如果目標路徑是個已經存在的目錄,則docker 會把源路徑目錄下的文件拷貝到該目錄下。 #4、如果源文件是個壓縮文件,則docker 會自動幫解壓到指定的容器目錄中。
#ADD實踐: #拷貝普通文件
:~/docker/images/nginx$ vim Dockerfile #Dockerfile文件內容
# 構建一個基于ubuntu的docker定制鏡像 # 基礎鏡像
FROM ubuntu
# 鏡像作者
MAINTAINER panda kstwoak47@163.com
# 執行命令
ADD ["sources.list","/etc/apt/sources.list"] RUN apt-get clean
RUN apt-get update
RUN apt-get install nginx -y
# 對外端口
EXPOSE 80
#構建鏡像
:~/docker/images/nginx$ docker build -t ubuntu-nginx:v0.6 .
#根據鏡像創建容器,創建時候,不添加執行命令進入容器查看效果 docker run --name nginx-8 -it ubuntu-nginx:v0.6
#拷貝壓縮文件
tar zcvf this.tar.gz ./*
#Dockerfile文件內容
...
# 執行命令
...
# 增加文件
ADD ["linshi.tar.gz","/nihao/"]
...
#構建鏡像
:~/docker/images/nginx$ docker build -t ubuntu-nginx:v0.7 . #根據鏡像創建容器,創建時候,不添加執行命令進入容器查看效果
docker run --name nginx-9 -it ubuntu-nginx:v0.7
:~/docker/images/nginx$ docker run --name nginx-9 -it ubuntu-nginx:v0.7
~~~
## COPY
~~~
#COPY #格式:
COPY <src>... <dest>
COPY ["<src>",... "<dest>"]
#解釋:
#COPY 指令和ADD 指令功能和使用方式類似。只是COPY 指令不會做自動解壓工作。 #單純復制文件場景,Docker 推薦使用COPY
#COPY實踐
#修改Dockerfile文件內容:
# 構建一個基于ubuntu的docker定制鏡像
# 基礎鏡像
FROM ubuntu
# 鏡像作者
MAINTAINER panda kstwoak47@163.com # 執行命令
ADD ["sources.list","/etc/apt/sources.list"]
RUN apt-get clean
RUN apt-get update
RUN apt-get install nginx -y
COPY ["index.html","/var/www/html/"] # 對外端口
EXPOSE 80
#運行時默認命令
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"] index.html 文件內容:
<h1>hello world </h1>
<h1>hello docker </h1>
<h1>hello nginx</h1>
#構建鏡像
:~/docker/images/nginx$ docker build -t ubuntu-nginx:v0.8 . #根據鏡像創建容器,創建時候,不添加執行命令
:~/docker/images/nginx$ docker run \--name nginx-10 \-itd ubuntu-nginx:v0.8
#查看nginx-10信息
:~/docker/images/nginx$docker inspect nginx-10
#瀏覽器訪問nginx查看效果
~~~
## VOLUME
~~~
#VOLUME #格式:
VOLUME ["/data"]
#解釋:
#VOLUME 指令可以在鏡像中創建掛載點,這樣只要通過該鏡像創建的容器都有了掛載點 #通過VOLUME 指令創建的掛載點,無法指定主機上對應的目錄,是自動生成的。 #舉例:
VOLUME ["/var/lib/tomcat7/webapps/"]
~~~
# 環境指令
## ENV
~~~
#ENV #格式:
ENV <key> <value> (一次設置一個環節變量)
ENV <key>=<value> ... (一次設置一個或多個環節變量) #解釋:
#設置環境變量,可以在RUN 之前使用,然后RUN 命令時調用,容器啟動時這些環境變量都會被指定
~~~
## ENV實踐
~~~
#ENV實踐:
#命令行創建ENV的容器
:~$ docker run -e NIHAO="helloworld" -itd --name ubuntu-111 ubuntu /bin/bash #進入容器ubuntu-111
:~$ docker exec -it ubuntu-111 /bin/bash
:/# echo $NIHAO
#修改Dockerfile文件內容:
#在上一個Dockerfile 文件內容基礎上,在RUN 下面增加一個ENV ENV NIHAO=helloworld
...
#構建鏡像
docker build -t ubuntu-nginx:v0.10 .
#根據鏡像創建容器,創建時候,不添加執行命令
docker run --name nginx-12 -itd ubuntu-nginx:v0.10 docker exec -it nginx-12 /bin/bash
echo $NIHAO
~~~
## WORKDIR
~~~
#WORKDIR #格式:
WORKDIR /path/to/workdir (shell 模式)
#解釋:
#切換目錄,為后續的RUN、CMD、ENTRYPOINT 指令配置工作目錄。相當于cd #可以多次切換(相當于cd 命令),
#也可以使用多個WORKDIR 指令,后續命令如果參數是相對路徑,則會基于之前命令指定的路徑。例如 #舉例:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd #則最終路徑為/a/b/c
~~~
**實踐**
~~~
#WORKDIR實踐:
#修改Dockerfile文件內容:
# 在上一個Dockerfile 文件內容基礎上,在RUN 下面增加一個WORKDIR WORKDIR /nihao/itcast/
RUN ["touch","itcast1.txt"]
WORKDIR /nihao
RUN ["touch","itcast2.txt"]
WORKDIR itcast
RUN ["touch","itcast3.txt"]
...
#構建鏡像
:~/docker/images/nginx$ docker build -t ubuntu-nginx:v0.11 . #根據鏡像創建容器,創建時候,不添加執行命令
docker run --name nginx-13 -itd ubuntu-nginx:v0.11
#進入鏡像
docker exec -it nginx-13 /bin/bash
~~~
## USER與ARG
~~~
#USER #格式:
USER daemon
#解釋:
#指定運行容器時的用戶名和UID,后續的RUN 指令也會使用這里指定的用戶。 #如果不輸入任何信息,表示默認使用root 用戶
#ARG #格式:
ARG <name>[=<default value>] #解釋:
#ARG 指定了一個變量在docker build 的時候使用,可以使用\--build-arg =來 指定參數的值,不過
#如果構建的時候不指定就會報錯。
~~~
# 觸發器
~~~
ONBUILD
#格式:
ONBUILD [command]
#解釋: #當一個鏡像A被作為其他鏡像B的基礎鏡像時,這個觸發器才會被執行, #新鏡像B在構建的時候,會插入觸發器中的指令。 #使用場景對于版本控制和方便傳輸,適用于其他用戶。
~~~
**實踐**
~~~
#編輯Dockerfile
:~/docker/images/nginx$ vim Dockerfile
#內容如下:
# 構建一個基于ubuntu的docker定制鏡像
# 基礎鏡像
FROM ubuntu
# 鏡像作者
MAINTAINER panda kstwoak47@163.com
# 執行命令
ADD ["sources.list","/etc/apt/sources.list"]
RUN apt-get clean
RUN apt-get update
RUN apt-get install nginx -y
#觸發器
ONBUILD COPY ["index.html","/var/www/html/"]
# 對外端口
EXPOSE 80
#運行時默認命令
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
#構建鏡像
:~/docker/images/nginx$ docker build -t ubuntu-nginx:v0.12 .
#根據鏡像創建容器,
:~/docker/images/nginx$docker run -p 80 --name nginx-14 -itd ubuntu-nginx:v0.12 :~/docker/images/nginx$docker ps
#查看鏡像信息
:~/docker/images/nginx$ docker inspect ubuntu-nginx:v0.12 #訪問容器頁面,是否被更改
:~/docker/images/nginx$ docker inspect nginx-14
#構建子鏡像Dockerfile文件
FROM ubuntu-nginx:v0.12
MAINTAINER panda kstwoak47@163.com
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
#構建子鏡像
:~/docker/images/nginx$ docker build -t ubuntu-nginx:v0.13 . #根據鏡像創建容器,
docker run -p 80 --name nginx-15 -itd ubuntu-nginx:v0.13 #查看鏡像信息
:~/docker/images/nginx$ docker inspect ubuntu-nginx:v0.13 docker ps
#訪問容器頁面,是否被更改
~~~
# 構建緩存
第一次構建很慢,之后的構建都會很快,因為他們用到了構建的緩存
~~~
#取消緩存:
docker build --no-cache -t [鏡像名]:[鏡像版本][Dockerfile位置]
~~~
- 基礎
- 簡介
- 主要特征
- 變量和常量
- 編碼轉換
- 數組
- byte與rune
- big
- sort接口
- 和mysql類型對應
- 函數
- 閉包
- 工作區
- 復合類型
- 指針
- 切片
- map
- 結構體
- sync.Map
- 隨機數
- 面向對象
- 匿名組合
- 方法
- 接口
- 權限
- 類型查詢
- 異常處理
- error
- panic
- recover
- 自定義錯誤
- 字符串處理
- 正則表達式
- json
- 文件操作
- os
- 文件讀寫
- 目錄
- bufio
- ioutil
- gob
- 棧幀的內存布局
- shell
- 時間處理
- time詳情
- time使用
- new和make的區別
- container
- list
- heap
- ring
- 測試
- 單元測試
- Mock依賴
- delve
- 命令
- TestMain
- path和filepath包
- log日志
- 反射
- 詳解
- plugin包
- 信號
- goto
- 協程
- 簡介
- 創建
- 協程退出
- runtime
- channel
- select
- 死鎖
- 互斥鎖
- 讀寫鎖
- 條件變量
- 嵌套
- 計算單個協程占用內存
- 執行規則
- 原子操作
- WaitGroup
- 定時器
- 對象池
- sync.once
- 網絡編程
- 分層模型
- socket
- tcp
- udp
- 服務端
- 客戶端
- 并發服務器
- Http
- 簡介
- http服務器
- http客戶端
- 爬蟲
- 平滑重啟
- context
- httptest
- 優雅中止
- web服務平滑重啟
- beego
- 安裝
- 路由器
- orm
- 單表增刪改查
- 多級表
- orm使用
- 高級查詢
- 關系查詢
- SQL查詢
- 元數據二次定義
- 控制器
- 參數解析
- 過濾器
- 數據輸出
- 表單數據驗證
- 錯誤處理
- 日志
- 模塊
- cache
- task
- 調試模塊
- config
- 部署
- 一些包
- gjson
- goredis
- collection
- sjson
- redigo
- aliyunoss
- 密碼
- 對稱加密
- 非對稱加密
- 單向散列函數
- 消息認證
- 數字簽名
- mysql優化
- 常見錯誤
- go run的錯誤
- 新手常見錯誤
- 中級錯誤
- 高級錯誤
- 常用工具
- 協程-泄露
- go env
- gometalinter代碼檢查
- go build
- go clean
- go test
- 包管理器
- go mod
- gopm
- go fmt
- pprof
- 提高編譯
- go get
- 代理
- 其他的知識
- go內存對齊
- 細節總結
- nginx路由匹配
- 一些博客
- redis為什么快
- cpu高速緩存
- 常用命令
- Go 永久阻塞的方法
- 常用技巧
- 密碼加密解密
- for 循環迭代變量
- 備注
- 垃圾回收
- 協程和纖程
- tar-gz
- 紅包算法
- 解決golang.org/x 下載失敗
- 逃逸分析
- docker
- 鏡像
- 容器
- 數據卷
- 網絡管理
- 網絡模式
- dockerfile
- docker-composer
- 微服務
- protoBuf
- GRPC
- tls
- consul
- micro
- crontab
- shell調用
- gorhill/cronexpr
- raft
- go操作etcd
- mongodb