容器架構下
- 6. Dockerfile
- 6.1 Docker自動化DIY鏡像之Dockerfile
- 1) 環境準備
- 2) 書寫Dockerfile內容
- 3) 運行Dockerfile生成鏡像
- 4) 運行容器
- 5) 小結
- 6.2 案例14:Dockerfile-RUN指令
- 1) 書寫Dockerfile
- 2) 構建鏡像
- 3) 啟動容器
- 4) 測試結果
- 6.3 Dockerfile指令
- 7. 容器數據持久化
- 1)演示:
- a)啟動數據庫容器
- b)連接容器創建庫
- c)刪除容器,重新創建容器檢查數據是否還在?
- 2)數據持久化
- 3)小結:
- 8. 容器鏡像的私有倉庫
- 1) 拉取registry鏡像與修改配置文件
- 2)啟動鏡像倉庫
- 3) 上傳鏡像到私有的鏡像倉庫
- 4) 刪除本地鏡像
- 5) 重新拉取
- 6)小結
6. Dockerfile
6.1 Docker自動化DIY鏡像之Dockerfile
- 通過上個案例(手動創建鏡像)發現很麻煩所以用dockerfile自動化創建鏡像
- 這里我們就可以使用Dockerfile文件方法把定義鏡像的流程,根據Dockerfile指令指定,最終生成我們想要的自定義鏡像。
- 目標:
- 1??會使用Dockerfile
- 2??掌握如何書寫Dockerfile
- 任務要求:通過Dockerfile一鍵創建小鳥飛飛的鏡像。
1) 環境準備
- 創建目錄:
mkdir -p /server/dockerfiles/01-bird
- 上傳文件:上傳
bird.zip
到linux(/root/即可) - 解壓:
unzip bird.zip
- 復制文件到目錄中:
cp -a bird /server/dockerfiles/01-bird
2) 書寫Dockerfile內容
- 梳理自定義bird鏡像的流程(對鏡像的操作)
自定義鏡像流程 | 步驟 | Dockerfile指令 |
---|---|---|
1?? | 選擇基礎鏡像 nginx:1.24 | FROM nginx:1.24 |
2?? | 把bird代碼傳輸到 /usr/share/nginx/html/目錄下。 通過Dockerfile處理的 文件或目錄放在Dockerfile所在目錄。 | ADD bird/ /usr/share/nginx/html/ ADD 宿主機目錄或文件 鏡像目錄 |
3?? | 完成 | CMD指令 |
- Dockerfile
#1. Dockerfile所在目錄結構drwxr-xr-x 3 root root 98 11月 16 2021 bird #Dockerfile需要的bird目錄 -rw-r--r-- 1 root root 239 8月 14 09:31 Dockerfile #Dockerfile文件#2. 編輯Dockerfile vim Dockerfile #指定基礎鏡像 FROM nginx:1.24 #鏡像的說明信息 LABEL author=lidao996 url=www.oldboyedu.com#傳輸內容 ADD bird/ /usr/share/nginx/html/#指定容器入口指令 #用于啟動ngx服務 CMD ["nginx","-g","daemon off;"]
3) 運行Dockerfile生成鏡像
- 進入Dockerfile所在目錄:
cd /server/dockerfiles/01-bird/
- 生成鏡像命令:
docker build -t oldboydir:lidao996_bird_diy_v2 .
- -t tag標簽,用于指定新鏡像的分類:名字_版本
.
指定Dockerfile就在當前目錄
4) 運行容器
- 根據新的鏡像啟動容器:
docker run -d -p 12306:80 --name bird_diy_v2 oldboydir:lidao996_bird_diy_v2
- 檢查容器運行情況:
docker ps |grep bird_diy_v2
- 瀏覽器檢查:登錄
10.0.0.62:12306
5) 小結
- Dockerfile作用與指令。
- 一般根據手動的步驟,把步驟轉行為Dockerfile.
- 開頭部分
- FROM
- LABEL
- 中間過程
- ADD/COPY
- 結尾部分
- CMD
6.2 案例14:Dockerfile-RUN指令
- 創建一個nginx自定義鏡像,鏡像首頁文件內容要是oldboyedu.com.
- echo命令修改文件內容。
echo oldboyedu.com >/usr/share/nginx/html/index.html
- 創建自定義鏡像的時候執行Linux命令。
1) 書寫Dockerfile
mkdir -p /server/dockerfiles/02-ngx
cd /server/dockerfiles/02-ngxvim Dockerfile
FROM nginx:1.24
LABEL author=lidao996 url=www.oldboyedu.com RUN echo oldboyedu.com >/usr/share/nginx/html/index.htmlCMD ["nginx","-g","daemon off;"]
2) 構建鏡像
docker build -t oldboydiy:test_v2 .
3) 啟動容器
docker run -d -p 10086:80 oldboydiy:test_v2
4) 測試結果
6.3 Dockerfile指令
Dockerfile指令 | 含義 | 應用 | 建議 |
---|---|---|---|
Dockerfile開頭部分 | |||
FROM | 指定基本鏡像類似于docker pull 下載鏡像 | FROM ubuntu:20.04 | 盡量少寫ubuntu或ubuntu:latest,盡量指定具體的版本. |
LABEL | 用于指定容器的屬性信息,作者,個人聯系方式(郵件)… | LABEL maintainer=“lidao996 youjiu_linux@qq.com” | 推薦使用LABEL,不推薦使用下面的MAINTAINER |
ENV | 用于創建Dockerfile中使用的變量 | ENV Tengine_Version空格2.3.3 | 軟件版本可以創建使用變量. |
Dockerfile中間處理部分 | |||
RUN | 制作鏡像過程中需要的執行命令,通常系統配置,服務配置,部署。 但不能出現阻塞當前終端的命令。 | RUN 系統命令即可. | 不建議使用連續多個RUN,合并連續多個RUN. |
ADD | 可以把指定文件或目錄拷貝到容器中(指定目錄),會解壓壓縮包. 相對于當前目錄. | ADD restart.tar.gz空格/app/code/restart/ | 拷貝壓縮包使用. |
COPY | 可以把指定文件或目錄拷貝到容器中(指定目錄),不支持自動解壓. 相對于當前目錄. | COPY nginx.conf空格 /etc/nginx/nginx.conf | 拷貝文件或目錄. |
Dockerfile結尾部分書寫的內容 | |||
CMD | 用于指定容器的入口命令.入口命令可以在docker run的時候替換.==運行鏡像啟動容器的時候,容器默認運行的命令是什么. | CMD [“命令”,“參數01”,“參數02”] CMD [“nginx”,“-g”,“daemon off;”] | 大部分都會使用CMD. |
7. 容器數據持久化
1)演示:
a)啟動數據庫容器
docker run -d -p 13306:3306 --name mysql_8.0_v3 -e MYSQL_ROOT_PASSWORD=1 mysql:8.0-debian
b)連接容器創建庫
- 進入到數據庫創建數據庫
c)刪除容器,重新創建容器檢查數據是否還在?
- 數據丟失
2)數據持久化
- 把容器中的文件或目錄連接到宿主機中。
- 把宿主機的/server/data/mysql/目錄連接到容器中/var/lib/mysql/
- 準備宿主機的數據目錄:
mkdir -p /server/data/mysql/
- 使用-v參數連接宿主機與容器(
-v 宿主機的目錄或文件:容器中的目錄或文件
,把宿主機中的目錄或文件掛載(連接)到容器中。)docker run -d -p 13306:3306 --name mysql_8.0_v3 -e MYSQL_ROOT_PASSWORD=1 \ -v /server/data/mysql/:/var/lib/mysql/ mysql:8.0-debian
- 檢查結果:
/server/data/mysql/
下增加了很多文件 - 進入容器創建庫:
docker exec -it mysql_8.0_v3 mysql -uroot -p1
#這樣可以直接進入數據庫 - 創建庫:
create database lidao996;
- 退出然后刪除容器:
docer rm -f mysql_8.0_v3
- 重新創建容器并檢查庫是否還在
docker run -d -p 13306:3306 --name mysql_8.0_v3 -e MYSQL_ROOT_PASSWORD=1 \
-v /server/data/mysql/:/var/lib/mysql/ mysql:8.0-debian docker exec -it mysql_8.0_v3 mysql -uroot -p1 #這樣可以直接進入數據庫
show databases; #數據庫還在
3)小結:
- 理解什么是容器的數據持久化即可。為何要做持久化。
- docker run 加上-v選項
- 應用數據庫數據目錄做做持久化。
- 用于測試代碼:nginx /usr/share/nginx/html/連接到宿主機的代碼目錄。
- 用于測試配置:nginx.conf ,my.cnf 配置文件。
8. 容器鏡像的私有倉庫
- registry倉庫(簡單,命令行),harbor倉庫(復雜,web界面)。
1) 拉取registry鏡像與修改配置文件
- 拉鏡像:
docker pull registry
- 修改所有docker配置文件
cat > /etc/docker/daemon.json<<'EOF' {"registry-mirrors": ["https://bjjtv7cs.mirror.aliyuncs.com"],"insecure-registries": ["10.0.0.62:5000"] } EOF systemctl restart docker
2)啟動鏡像倉庫
mkdir -p /server/data/images/
docker run -d --name "oldboy_registry" -p 5000:5000 \
-v /server/data/images/:/var/lib/registry \
--restart=always registry
3) 上傳鏡像到私有的鏡像倉庫
docker tag oldboydir:lidao996_bird_diy_v2 10.0.0.62:5000/oldboyedu/ngx:bird_diy_v2
#docker login -u用戶名 -p密碼
docker push 10.0.0.62:5000/oldboyedu/ngx:bird_diy_v2
4) 刪除本地鏡像
docker rmi 鏡像名字
如果鏡像使用中則需要刪除鏡像對應的容器,然后刪除鏡像。
5) 重新拉取
docker pull 10.0.0.62:5000/oldboyedu/ngx:bird_diy_v2
6)小結
-
未來使用內部私有鏡像倉庫。
-
會通過docker tag +docker push 上傳。
-
會通過docker pull 下載即可。
-