1. 程式人生 > >Python全棧開發之Docker

Python全棧開發之Docker

服務器 test tail machine sys 結構 關鍵字 需要 修改

No.1 概念

為什麽會出現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生成新的鏡像,那麽當容器刪除後,數據就丟失了

特點

  • 數據卷可以在容器之間共享數據和重用數據
  • 數據卷的更改可以直接生效
  • 數據卷的更改不會包含在鏡像的更新中
  • 數據卷的生命周期一直持續到沒有容器使用它為止

    創建並使用數據卷

    1. 創建容器卷
      # container表示宿主機的絕對路徑,data表示容器內的目錄,容器和數據之間數據是共享的,容器停止後,宿主機修改數據後,重新進入容器,數據同步
      docker run -it -v /container:/data centos 
      # 同上,區別是允許宿主機讀寫,容器內只能讀取宿主機的數據,不能修改
      docker run -it -v /container:/data ro centos 
    2. 查看容器卷是否掛在成功
      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