Python全棧開發之Docker
為什麽會出現Docker?
一款產品從生產到上線,從操作系統,到運行環境,再到應用配置,往往在開發那裏可以正常運行,到了運維那裏就掛了,特別是版本升級,不同版本之間的兼容問題,也讓運維人員頭疼不已,docker應運而生,docker將運行文件、配置環境、運行環境、運行依賴包、操作系統、內核打包成鏡像
Docker理念
Docker的目標是Build,Ship and Run Any APP,Anywhere,就是對應用的封裝、分發、部署、運行等生命周期的管理,使用戶的APP及其運行環境能夠做到一次封裝,處處運行
Docker三組件
- 鏡像一個只讀的模板,可以用來創建Docker容器,一個鏡像可以創建多個容器,就相當於Python中的類,可以同過類創建對象
- 容器 容器可以開發、運行應用,容器就是用鏡像創建的運行實例,它可以被啟動、刪除、停止、開始,每個容器都是相互隔離的,這樣能保證平臺的安全性
- 倉庫集中存放鏡像文件的場所,每個倉庫存放好多個鏡像,每個鏡像有不同的標簽(tag),最大的倉庫是DockerHub,存放了數據龐大的鏡像
Docker為什麽這麽快
Docker的接觸是Linux(LXC)技術,在LXC的基礎上進行了進一步的封裝,讓用戶不需要考慮容器的管理,使操作更加簡單,從結構上來看,虛擬機的Guest OS層和Hypervisor層被Docker Engine層所取代,我們知道Guest OS是一個完整的操作系統,Hypervisor是一個硬件虛擬化平臺,Docker有著比虛擬機更加少的抽象層,不許你硬件虛擬化,運行在Docker中的應用直接使用物理機的硬件資源,因此,Docker的效率更高,Docker使用宿主機的內核,不需要Guest OS,不關心操作系統,我只需要知道我下面有一個系統就夠了,從而減少了操作系統內核的時間和資源的消耗No.2 安裝與配置
Ubuntu
查看本機內核版本,Docker要求內核版本必須高於3.10
uname -r
使用官方安裝腳本自動安裝
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
鏡像加速
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-‘EOF‘ { "registry-mirrors": ["https://q6trwb9o.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
Centos
使用yum進行安裝
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 安裝必要的一些系統工具
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker- 添加軟件源信息ce/linux/centos/docker-ce.repo 更新並安裝 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
鏡像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-‘EOF‘
{
"registry-mirrors": ["https://q6trwb9o.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Windows
安裝Docker
- 對於Windows 10以下的用戶,推薦使用Docker Toolbox
- 對於Windows 10以上的用戶 推薦使用Docker for Windows
鏡像加速
# 針對安裝了Docker Toolbox的用戶
docker-machine create --engine-registry-mirror=https://q6trwb9o.mirror.aliyuncs.com -d virtualbox default
docker-machine env default
eval "$(docker-machine env default)"
docker info
# 針對安裝了Docker for Windows的用戶
在系統右下角托盤圖標內右鍵菜單選擇 Settings,打開配置窗口後左側導航菜單選擇 Docker Daemon。編輯窗口內的JSON串,填寫下方加速器地址:
{
"registry-mirrors": ["https://q6trwb9o.mirror.aliyuncs.com"]
}
Mac
安裝Docker
- 對於10.10.3以下的用戶 推薦使用Docker Toolbox
- 對於10.10.3以上的用戶 推薦使用Docker for Mac
鏡像加速
# 針對安裝了Docker Toolbox的用戶,
docker-machine create --engine-registry-mirror=https://q6trwb9o.mirror.aliyuncs.com -d virtualbox default
docker-machine env default
eval "$(docker-machine env default)"
docker info
# 針對安裝了Docker for Mac的用戶
右鍵點擊桌面頂欄的 docker 圖標,選擇 Preferences ,在 Daemon 標簽(Docker 17.03 之前版本為 Advanced 標簽)下的 Registry mirrors 列表中將
https://q6trwb9o.mirror.aliyuncs.com加到"registry-mirrors"的數組裏,點擊 Apply & Restart按鈕
No.3 Docker常用命令
幫助命令
docker version # 查看docker版本號
docker info # 顯示系統相關信息
docker --help # 查看幫助信息
鏡像命令
docker images [OPTIONS]列出本地主機上的鏡像
OPTIONS
-a 列出本地所有的鏡像
-q 只顯示鏡像ID
--digests 顯示鏡像的摘要信息
--no-trunc 顯示完整的鏡像信息
docker search [OPTIONS] 鏡像名稱 查找鏡像
OPTIONS
--no-trunc 顯示完整的鏡像描述
-s 列出收藏數不小於指定值的鏡像
--automated 只列出antomated build類型的鏡像
docker rmi
docker rmi -f 鏡像ID[ 鏡像ID] 刪除一個或多個鏡像
docker rmi -f $ (docker images -qa) 刪除全部鏡像
容器命令
創建並啟動容器 docker run [OPTIONS] image COMMAND
OPTIONS
--name 為容器指定一個新的名稱
-d 後臺運行容器,並返回容器ID
-i 以交互模式運行容器,通常以-t同時使用
-t 為容器重新分配一個偽輸入終端
-P 隨機端口映射
-p 指定端口映射
查看docker中正在運行的容器 docker ps [OPTIONS]
OPTIONS
-a 列出當前所有正在運行的容器和歷史運行的容器
-l 顯示最近創建的容器
-n 顯示最近創建的n個容器
-q 靜默模式,只顯示容器編號
--no-trunc 不截斷退出
退出容器
exit 容器停止並退出
ctrl+P+Q 容易不停止退出
啟動容器 docker start 容器ID
重啟容器 docker restart 容器ID
停止容器 docker stop 容器ID
強制停止容器 docker kill 容器ID
刪除已停止的容器 docker rm 容器ID
啟動守護式容器 docker run -d 容器
查看容器日誌 docker logs -f -t --tail 容器ID
-t 加入時間戳
-f 跟隨最新的日誌打印
--tail n 顯示最後n條
查看容器內運行的進程 docker top 容器ID
查看容器內部細節 docker inspect 容器ID
進入正在運行的容器並以命令行交互 docker exec -it 容器ID bashShell
docker attach 容器ID
區別是attach直接進入容器啟動命令的終端,不會啟動新的進程,而exec是在容器中打開新的終端,並且可以啟動新的進程
從容器內拷貝文件到主機上 docker cp 容器ID:容器內路徑 宿主機路徑
其他命令
create # 創建一個新的容器,同 run,但不啟動容器
diff # 查看 docker 容器變化
events # 從 docker 服務獲取容器實時事件
export # 導出容器的內容流作為一個 tar 歸檔文件[對應 import ]
history # 展示一個鏡像形成歷史
import # 從tar包中的內容創建一個新的文件系統映像[對應export]
load # 從一個 tar 包中加載一個鏡像[對應 save]
login # 註冊或者登陸一個 docker 源服務器
logout # 從當前 Docker registry 退出
port # 查看映射端口對應的容器內部源端口
pause # 暫停容器
restart # 重啟運行的容器
save # 保存一個鏡像為一個 tar 包[對應 load]
start # 啟動容器
stop # 停止容器
tag 給源中鏡像打標簽
top # 查看容器中運行的進程信息
unpause # 取消暫停容器
wait # 截取容器停止時的退出狀態值
No.4 Docker容器數據卷
容器數據卷解決什麽問題
將運行的代碼、環境打包成容器運行,運行可以伴隨容器,但是我們希望數據是持久化的,容器之間能夠共享數據,Docker容器產生的數據,如果不通過commit生成新的鏡像,那麽當容器刪除後,數據就丟失了
特點
- 數據卷可以在容器之間共享數據和重用數據
- 數據卷的更改可以直接生效
- 數據卷的更改不會包含在鏡像的更新中
- 數據卷的生命周期一直持續到沒有容器使用它為止
創建並使用數據卷
- 創建容器卷
# container表示宿主機的絕對路徑,data表示容器內的目錄,容器和數據之間數據是共享的,容器停止後,宿主機修改數據後,重新進入容器,數據同步 docker run -it -v /container:/data centos # 同上,區別是允許宿主機讀寫,容器內只能讀取宿主機的數據,不能修改 docker run -it -v /container:/data ro centos
- 查看容器卷是否掛在成功
docker inspect 容器ID
數據卷容器
- 創建容器卷
什麽是數據卷容器
命名的容器掛載數據卷,其它容器通過掛載這個(父容器)實現數據共享,掛載數據卷的容器,稱之為數據卷容器
容器間傳遞共享(--volumes-from)
# 先啟動一個父容器dc01
docker run -it --name dc01 kernel/centos
# 在dataVolumeContainer1新增內容
touch dc01_test.txt
# dc02/dc03繼承自dc01
docker run -it --name dc02 --volumes-from dc01 kernel/centos
docker run -it --name dc03 --volumes-from dc01 kernel/centos
# dc02/dc03分別在dataVolumeContainer1各自新增內容
touch dc02_test.txt
touch dc03_test.txt
# 回到dc01發現數據共享了
# 刪除dc01,發現dc02和dc03能繼續共享
# 刪除dc02後dc03還能繼續訪問
# 新建dc04繼承於dc03,刪除dc03,dc04能繼續訪問
# 由此,容器之間配置信息的傳遞,數據卷的生命周期一直持續到沒有容器使用它為止
No.5 DockerFile
dockerfile是什麽
dockerfile是用來構建docker鏡像的構建文件,是由一系列命令和參數構成的腳本
構建三步驟
-
dockerfile
-
docker build
- docker run
dockerfile解析流程
-
docker從基礎鏡像運行一個容器
-
執行一條指令並對容器進行修改
-
執行類似docker commit的操作提交一個新的鏡像層
-
docker再基於剛提交的鏡像運行一個新容器
- 執行dockerfile中的下一條指令直到所有指令都執行完成
docker保留關鍵字
- FROM 基礎鏡像,當前新鏡像基於哪個鏡像
- MAINTAINER 鏡像維護者的姓名和郵箱地址
- RUN 容器構建時需要運行的命令
- EXPOSE 當前容器對外暴露的端口
- WORKDIR 指定容器被創建後,終端默認登錄進來的工作目錄
- ENV 用來構建鏡像過程中設置的環境變量
- ADD 將宿主機目錄下的文件拷貝到鏡像並且ADD可以自動處理URL和解壓tar包
- COPY 類似於ADD
- VOLUME 容器數據卷,用於數據保存和持久化操作
- CMD 指定一個容器啟動時要運行的命令,Dockerfile中可以有多個CMD,但只有最後一個生效,CMD會被docker run之後的參數替換
- ENTRYPOINT 和CMD類似,docker run之後的參數不會覆蓋ENTRYPOINT,而是追加
- ONBUILD 當構建一個被繼承的Dockerfile時運行命令,父鏡像在被子繼承後父鏡像的onbuild被觸發
No.6 本地鏡像發布到阿裏雲
- 在阿裏雲開發者平臺新建倉庫鏡像
- 將鏡像推送到registry
Python全棧開發之Docker