Docker在執行容器前需要本地端存在對應的映像檔,若不存在,則會從映像檔倉庫下載(預設為Docker Hub公共註冊伺服器中的倉庫)
要在機器上執行容器前,機器必須先擁有所需的Image,可以從Registry(DockerHub)上取得Image,再進行操作。
查詢registry有哪些image --> docker search <image_keywords> <搜尋條件> --官方文件
從registry取得所需的image --> docker pull <registry>/<image>
檢視本地端有哪些images --> docker images、docker image ls 或 docker image ls <image> --加上image可篩選
列出目前的容器(並顯示來自哪些image) --> docker ps -a
實體化image(執行容器) --> docker run
刪除本地用不到的image --> docker image rm <repository> 或 docker rmi <image_id>
刪除容器 --> docker rm <container_id>
強制刪除正在執行的容器 --> docker rm -f <container_id>
使用者無需登入即可透過docker search指令尋找官方倉庫中的映像檔,再利用docker pull 命令將它下載到本地端
可將以上搜尋結果分為兩類,一類是類似cnetos這樣的基礎映像檔,稱為基礎或root映像檔,這些映像檔是由Docker建立、驗證、支援、提供,這種官方的映像檔往往只使用軟體名稱作為NAME。
另外一類則是類似kasmweb/centos-7-desktop這種映像檔,則是由Docker Hub使用者kasmweb建立並維護的,前半段帶有使用者名稱,表明是某使用者名下的某倉庫。
在搜尋時若增加-s N參數可以指定僅顯示評價為N星以上的映像檔。
使用docker pull 從Docker Hub 下載一個Ubuntu 12.04作業系統的映像檔
docker pull ubuntu:12.04 #docker pull image:tag
使用docker pull 從Docker Hub 下載一個Ubuntu 最新版本的作業系統映像檔
docker pull ubuntu
以上指令相當於 docker pull registry.hub.docker.com/ubuntu:12.04 ,只要將registry.hub.docker.com替換成其他registry的位址,就可以從其他registry取得image。
下載過程可以看出,Image一般由數個資料層(layer)所組成,d8868e50ac4c這樣的字串是資料層唯一的ID。
當不同的Image涵蓋相同的資料層時,本地端僅儲存資料層的唯一一份內容,減少了需要的儲存空間。
pull下來後,即可使用該映像檔,例如建立一個容器執行bash
docker run -t -i ubuntu:12.04 /bin/bash
docker image ls 或 docker images
來自於哪個倉庫
映像檔的標籤資訊。標籤只是標記,不能用來識別映像檔內容
映像檔的ID(可唯一識別映像檔)
建立時間
映像檔大小
為了方便在後續工作中使用特定映像檔,可以使用docker tag指令來為本地端映像檔隨意增加新的標籤。
docker tag ubuntu:12.04 myubuntu:latest
之後就可以直接使用myubuntu:latest來表示這個映像檔。
可以取得映像檔的詳細資訊,包含製作者、適用架構、各層的SHA256 Hash數值等,回傳的會是JSON格式資訊。
docker inspect ubuntu:12.04
使用docker rmi命令可以刪除映像檔
docker rmi IMAGE[IMAGE...]
docker rmi myubuntu:latest
當同一個映像檔擁有多個標籤的時候,docker rmi指令只是刪除該映像檔多個標籤中的特定標籤而已,不會影響映像檔。
但當映像檔只剩下一個標籤時就得注意了,此時再使用docker rmi指令會徹底刪除此映像檔。
例如刪除標籤為ubuntu:12.04的映像檔,由於該映像檔沒有額外的標籤指向它,因此當執行docker rmi指令,可以看出它會刪除這個映像檔的所有資料層。
當使用docker rmi指令,後面輸入映像檔的ID時,會先刪除所有指向該映像檔的標籤,然後刪除該映像檔本身。
但如果該映像檔建立的容器還存在著,映像檔預設是沒辦法被刪除的。
例如我們先利用ubuntu:14.04映像檔建立一個簡單的容器並輸出句子
docker run ubuntu:14.04 echo 'hello world'
再使用docker ps -a命令查看本機上存在的所有容器
可以看到後台有一個已退出執行狀態的容器,是基於ununtu:14.04所建立的,當我們試圖刪除該映像檔,會發現錯誤(無法刪除)
此時有兩種方式可以刪除該映像檔
強制刪除(使用-f參數)
docker rmi -f ubuntu:14.04
但不建議使用強制刪除一個存在容器仍在使用中的映像檔,因為這樣會造成一些資料遺漏的問題
2.正確刪除作法
先刪除相依於該映像檔的所有容器
再刪除映像檔
首先刪除該容器(於docker ps -a 內可以看到容器ID為:5f6329254c77)
docker rm 5f6329254c77
再刪除映像檔
docker rmi 13b66b487594
先使用下載的映像檔啟動容器
docker run -t -i training/sinatra /bin/bash
在容器中加入json的gem套件
gem install json
結束後,可以用exit退出,再使用docker commit提交更新後的副本
docker commit -m "Added json gem" -a "Docker Jim" 容器ID ouruser/sinatra:v2
該方法主要使用docker commit命令。
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]],主要選項有
-a , --author="":作者資訊
-c , --change=[]:commit的時候執行Dockerfile指令,包含CMD、ENV、USER、WORKDIR等
-m , --message="":新增commit訊息
-p , --pause=true:commit時暫停容器運作
我們先啟動一個映像檔,並在裡面新增一個test檔,之後退出。
這邊容器ID(b26cbdbb3727)需要先記住,待會需要用。
此時該容器跟原本的ubuntu:14.04相比,已經產生變化,可以使用docker commit命令建立一個新的映像檔。
docker commit -m "Added a new file" -a "Docker Jim" b26cbdbb3727 test:0.1
之後會回傳新建立的映像檔的ID資訊。
# syntax=docker/dockerfile:1
FROM ubuntu:18.04
COPY . /app
RUN make /app
CMD python /app/app.py
Dockerfile內的每個指令(FROM、COPY、RUN、CMD)都會建造一個新的image,在指令結束前,必須把所有暫時/不需要的東西(下載檔案、apt緩存等)都移除掉。一旦指令結束,所有東西就會被建構為一個「唯讀」的 image,就算之後再用指令刪除,無法真正移除它。
新增一個目錄及Dockerfile
-->在Linux內使用touch Dockerfile 新增,Windows的話可以使用 echo > Dockerfile
編輯檔案
-->notepad Dockerfile 或 使用VSCODE編輯
進入後輸入指令,每一條指令都會建立一層映像檔
FROM python:3.8-slim-buster #使用FROM指定base image , python為官方image的名字 ,:後為tag
WORKDIR /app #指定之後所有docker命令的工作路徑,若路徑不存在則會自動建立
COPY . . #使用COPY命令將程式copy到image中, COPY<本地路徑><目標路徑>
RUN pip install opencv-python #RUN 後面放指令,用來執行安裝和設定這個 Image 需要的東西
CMD ["python3" , "test.py"] #使用CMD指定當Docker容器運行後要執行的命令
完成Dockerfile後可以使用docker build建立映像檔 -t指令image的名字 最後面的 .告訴docker應該在當前目錄下尋找Dockerfile
docker build -t my-first .
完成後,可以使用docker run啟動容器
docker run -p 80:5000 -d my-first
-p:將容器上的某一個端口映射到本地端,才能訪問容器中的Web應用,80為本地端口,5000是容器上的端口
-d(detached):讓容器在後台執行
上傳映像檔
docker push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT/]NAME[:TAG]
使用者在Docker Hub網站註冊後,即可上傳自製的映像檔。
儲存映像檔
docker save -o ubuntu_12.04.tar ubuntu:12.04
就可以透過複製ubuntu_12.04.tar檔將該映像檔分享給他人。
載入映像檔
docker load --input ubuntu_12.04.tar 或 docker load < ubuntu_12.04.tar