Docker基礎,docker基礎鏡像
Docker是什麼
Docker是一個改進的容器技術。具體的“改進”體現在,Docker為容器引入了鏡像,使得容器可以從預先定義好的模版(images)建立出來,並且這個模版還是分層的。
Docker經常被提起的特點:
- 輕量,體現在記憶體佔用小,高密度
- 快速,毫秒啟動
- 隔離,沙箱技術更像虛擬機器
Docker技術的基礎:
- namespace,容器隔離的基礎,保證A容器看不到B容器. 6個名空間:User,Mnt,Network,UTS,IPC,Pid
- cgroups,容器資源統計和隔離。主要用到的cgroups子系統:cpu,blkio,device,freezer,memory
- unionfs,典型:aufs/overlayfs,分層鏡像實現的基礎
Docker組件:
- docker Client用戶端————>向docker伺服器處理序發起請求,如:建立、停止、銷毀容器等操作
- docker Server伺服器處理序—–>處理所有docker的請求,管理所有容器
- docker Registry鏡像倉庫——>鏡像存放的中央倉庫,可看作是存放二進位的scm
Docker安裝
Docker的安裝非常簡單,支援目前所有主流作業系統,從Mac到Windows到各種Linux發行版
具體參考: docker安裝
Docker常見命令預留位置相關操作
- docker create # 建立一個容器但是不啟動它
- docker run # 建立並啟動一個容器
- docker stop # 停止容器運行,發送訊號SIGTERM
- docker start # 啟動一個停止狀態的容器
- docker restart # 重啟一個容器
- docker rm # 刪除一個容器
- docker kill # 發送訊號給容器,預設SIGKILL
- docker attach # 串連(進入)到一個正在啟動並執行容器
- docker wait # 阻塞到一個容器,直到容器停止運行
擷取容器相關資訊
- docker ps # 顯示狀態為運行(Up)的容器
- docker ps -a # 顯示所有容器,包括運行中(Up)的和退出的(Exited)
- docker inspect # 深入容器內部擷取容器所有資訊
- docker logs # 查看容器的日誌(stdout/stderr)
- docker events # 得到docker伺服器的即時的事件
- docker port # 顯示容器的連接埠映射
- docker top # 顯示容器的進程資訊
- docker diff # 顯示容器檔案系統的前後變化
匯出容器
- docker cp # 從容器裡向外拷貝檔案或目錄
- docker export # 將容器整個檔案系統匯出為一個tar包,不帶layers、tag等資訊
執行
- docker exec # 在容器裡執行一個命令,可以執行bash進入互動式
鏡像操作
- docker images # 顯示本地所有的鏡像列表
- docker import # 從一個tar包建立一個鏡像,往往和export結合使用
- docker build # 使用Dockerfile建立鏡像(推薦)
- docker commit # 從容器建立鏡像
- docker rmi # 刪除一個鏡像
- docker load # 從一個tar包建立一個鏡像,和save配合使用
- docker save # 將一個鏡像儲存為一個tar包,帶layers和tag資訊
- docker history # 顯示產生一個鏡像的曆史命令
- docker tag # 為鏡像起一個別名
鏡像倉庫(registry)操作
- docker login # 登入到一個registry
- docker search # 從registry倉庫搜尋鏡像
- docker pull # 從倉庫下載鏡像到本地
- docker push # 將一個鏡像push到registry倉庫中
擷取Container IP地址(Container狀態必須是Up)
docker inspect id | grep IPAddress | cut -d '"' -f 4
擷取連接埠映射
docker inspect -f '{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' id
擷取環境變數
docker exec container_id env
殺掉所有正在啟動並執行容器
docker kill $(docker ps -q)
刪除老的(一周前建立)容器
docker ps -a | grep 'weeks ago' | awk '{print $1}' | xargs docker rm
刪除已經停止的容器
docker rm `docker ps -a -q`
刪除所有鏡像,小心
docker rmi $(docker images -q)
Dockerfile
Dockerfile是docker構建鏡像的基礎,也是docker區別於其他容器的重要特徵,正是有了Dockerfile,docker的自動化和可移植性才成為可能。
不論是開發還是營運,學會編寫Dockerfile幾乎是必備的,這有助於你理解整個容器的運行。
FROM , 從一個基礎鏡像構建新的鏡像
FROM ubuntu
MAINTAINER , 維護者資訊
MAINTAINER William <wlj@nicescale.com>
ENV , 設定環境變數
ENV TEST 1
RUN , 非互動式運行shell命令
RUN apt-get -y update RUN apt-get -y install nginx
ADD , 將外部檔案拷貝到鏡像裡,src可以為url
ADD http://nicescale.com/ /data/nicescale.tgz
WORKDIR /path/to/workdir, 設定工作目錄
WORKDIR /var/www
USER , 設定使用者ID
USER nginx
VULUME <#dir>, 設定volume
VOLUME [‘/data’]
EXPOSE , 暴露哪些連接埠
EXPOSE 80 443
ENTRYPOINT [‘executable’, ‘param1’,’param2’]執行命令
ENTRYPOINT ["/usr/sbin/nginx"]
CMD [“param1”,”param2”]
CMD ["start"]
docker建立、啟動container時執行的命令,如果設定了ENTRYPOINT,則CMD將作為參數
Dockerfile最佳實務
- 盡量將一些常用不變的指令放到前面
- CMD和ENTRYPOINT盡量使用json數組方式
通過Dockerfile構建image
docker build csphere/nginx:1.7 .
鏡像倉庫Registry
鏡像從Dockerfile build產生後,需要將鏡像推送(push)到鏡像倉庫。企業內部都需要構建一個私人docker registry,這個registry可以看作二進位的scm,CI/CD也需要圍繞registry進行。
部署registry
mkdir /registrydocker run -p 80:5000 -e STORAGE_PATH=/registry -v /registry:/registry registry:2.0
推送鏡像儲存到倉庫
假設192.168.1.2是registry倉庫的地址:
docker tag csphere/nginx:1.7 192.168.1.2/csphere/nginx:1.7docker push 192.168.1.2/csphere/nginx:1.7