此內容基於《第一本docker書》總結,內容次序不是很規範,按照書籍內容介紹部分有添加:
docker子命令概覽
子命令分類 子命令
Docker環境信息 info、version
容器生命週期管理 create、exec、kill、pause、restart、rm、run、start、stop、unpause
鏡像倉庫命令 login、logout、pull、push、 search
鏡像管理 build、images、import、load、rmi、save、tag、commit
容器運維操做 attach、export、inspect、port、ps、rename、stats、top、wait、cp、diff、update
容器資源管理 volume、network
系統日誌信息 events、history、logs
獲取子命令詳細信息
docker COMMAND_NAME –helphtml
Docker容器操做
Docker守護進程綁定到多個地址
-H tcp://IP:PORT –H unix:///home/docker/docker.sock
基於基礎鏡像運行容器:【base registry爲Ubuntu】
docker run –i -t ubuntu /bin/bash
-i 保證容器中的STDIN是開啓的
-t 爲建立的容器分配一個僞tty終端
--name CONTAINER_NAME 容器命名
-d 建立守護式容器
帶標籤的Ubuntu鏡像 ubuntu:12.04
容器啓停
docker start|stop CONTAINER_NAME
docker ps 查看啓動的容器
-a 查看全部的容器
docker ps –n –x 會顯示最後x個容器,不論容器正在運行仍是已經中止
docker attach CONTAINER_NAME 附着到指定的容器上
docker logs COMTAINER_NAME 獲取容器的日誌
-f 參數來監控docker的日誌,與tail -f相似
-t 每條日誌加上時間戳
--tail N 獲取日誌的最後N行內容
--tail 0 –f 來跟蹤某個容器的最新日誌,沒必要讀取整個日誌
查看容器內的進程
docker top CONTAINER_NAME
在容器內部運行進程
docker exec –d CONTAINER_NAME COMMAND
-d 須要運行一個後臺進程
docker exec -i -t CONTAINER_NAME /bin/bash 爲執行的進程建立TTY並捕獲STDIN。exit後不會終止容器至關於建立一個新的bash回話。
docker run --restart=always ….
--restart 會檢查容器的退出代碼,並據此來決定是否要重啓容器,always不管容器的退出代碼是什麼,Docker都會自動重啓該容器;on-failure還接受一個可選的重啓次數參數 --restart=on-failure:5 最多重啓5次
深刻容器
docker inspect CONTAINER_NAME 會對容器進行詳細的檢查,而後返回其配置信息,包括名稱命令、網絡配置以及不少有用的數據
-f|—format=’{{ .State.Runing }}’ 查看日誌內容,能夠同時制定多個容器
刪除容器
docker rm CONTAINER_NAME
docker rm ‘docker ps -a -q’刪除全部
-q 只返回容器的ID
Docker安裝以後,/var/lib/docker存放着docker鏡像,容器以及容器的配置nginx
Docker鏡像操做
列出全部docker鏡像
docker images
拉取鏡像
docker pull registry_name|registry_name:xxx
查找鏡像
docker search registry_name
Docker Hub有兩種類型的倉庫:
用戶倉庫和頂層倉庫
用戶倉庫是docker用戶建立的
頂層倉庫是由docker內部的人來管理的
Jamturol/puppet
Jamturol: 用戶名
puppet:倉庫名web
構建鏡像
使用docker commit . 登陸(Docker Hub)操做構建
使用docker build和Dockerfile文件
docker commit CONTAINER_NAME|ID jamturol/apache2 提交的只是建立容器的鏡像與容器的當前狀態之間有差別的部分redis
Dockerfile文件
# version: 0.01 註釋
FROM BASE_REGISTRY # BASE_REGISTRY 做爲新鏡像的基礎鏡像
MAINTAINER xxx, 「xxx@gmail.com」 #鏡像的做者及做者的郵件地址
RUN echo ‘xxx’> /path/to/file #每條RUN指令都會建立一個新的鏡像層
RUN 。。。 # RUN指令會在shell裏使用命令包裝器/bin/sh -c來執行,若是不支持shell或者不但願shell運行,可使用exec格式的RUN指令。 RUN [ 「apt-get」,」install」,」-y」,」nginx」 ]
。。。
EXPOSE 80 # Docker該容器內的應用程序將會使用容器的指定端口。能夠指定多個EXPOSE指令來向外部公開多個端口。
docker build -t=」jamturol/static_web」 . #運行Dockerfile
-t 爲新鏡像設置了倉庫和名稱
-t=」jamturol/static_web:v1」 爲鏡像設置一個標籤,「鏡像名:標籤」,若是沒有指定任何標籤,Docker會將自動爲鏡像設置一個latest標籤
--no-cache 略過緩存功能,每一個包使用最新版本
ENV REFRESHED_AT 2017-07-05 #設置一個名爲REFRESHED_AT的環境變量
深刻探求鏡像是如何構建出來的
docker history REGISTRY_NAME|ID
重新鏡像啓動一個容器
docker run –d –p 80 --name static_web jamtuol/static_web nginx –g 「deamon off;」
之前臺方式運行nginx,-p公開哪些網絡端口給外部
docker ps –l 查看端口的映射狀況
docker port ID 80 查看容器端口的映射狀況
-P 大寫公開在Dockerfile中的EXPOSE設置的全部端口
-p IP:PORT1:PORT2 將容器的port2端口綁定到宿主機的port1端口上
CMD 指定容器啓動時要運行的命令, CMD [「/bin/bash」,」-l」]
使用docker run命令能夠覆蓋CMD指令
ENTRYPOINT docker run命令行中指定的任何參數都會被看成參數再次傳遞給ENTRYPOINT指令中指定的命令
ENTRYPOINT [「/usr/sbin/nginx」]
docker run 的--entrypoint標誌覆蓋ENTRYPOINT指令
WORKDIR 在容器內部設置一個工做目錄,ENTRYPOINT和CMD指定的程序會在這個目錄下執行,可設置多個
docker run –w /var/log …
-w 在運行時覆蓋工做目錄
ENV設置的環境變量,取值爲$變量名,這些變量會被持久保存到從咱們的鏡像建立的任何容器中
USER 指定該鏡像會以什麼樣的用戶去運行
USER nginx 也能夠是UID,指定user和group
USER UID
USER user:group
VOLUME [「/opt/project」] 基於此鏡像建立的任何容器,建立一個名爲/opt/project的掛載點,也能夠指定多個卷
VOLUME [「/opt/project」,」/data」]
ADD software.lic /opt/application/software.lic 將構建環境下的文件和目錄複製到鏡像中,在安裝應用程序時,會使用Docker經過目的地址參數末尾的字符來判斷文件源是目錄仍是文件
COPY conf.d /etc/apache2 把本地conf.d目錄中的文件複製到/etc/apache2/目錄中。copy只關心在構建上下文中複製本地文件,而不會去作文件提取和解壓的工做,若是目的位置不存在,Docker會自動建立所須要的目錄結構
ONBUILD 能爲鏡像添加觸發器,當一個鏡像被使用作其餘鏡像的基礎鏡像時,該鏡像中的觸發器將會執行,觸發器會在構建過程當中插入新指令,能夠認爲這些指令是緊跟在FROM以後指定的,觸發器能夠是任何構建指令
ONBUILD ADD . /opp/src
ONBUILD RUN cd /app/src && makedocker
鏡像打包及導入相關操做
打包一個鏡像
docker save REPO_NAME:TAG > filename.tar
docker load < filename.tar 加載一個鏡像
刪除鏡像
docker rmi jamtuol/static_web
docker run –v $PWD/website:/var/www/html/website:ro ….
-v 指定了卷的源目錄(本地宿主機的目錄)和容器裏的目的目錄,兩個目錄經過:來分隔,目的目錄不存在,會自動建立,ro或者rw來定讀寫狀態
docker run --link redis:db ...
--link 標誌建立了兩個容器間的父子鏈接,須要兩個參數一個是要鏈接的容器名字,另外一個是鏈接後容器的別名
docker run -p 4567 --name webapp --link redis:db -t -i -v $PWD/webapp:/opt/webapp jamturol/sintra /bin/bash
能夠強制docker只容許有鏈接的容器之間互相通訊。須要在啓動docker守護進程時加上--icc=false,關閉全部沒有鏈接的容器間的通訊。被鏈接的容器必須運行在同一個docker宿主機上
docker run 中加入--dns或者--dns-search爲某個容器單獨配置dns
RUN shell.sh 運行shell腳本
能夠經過多個文件來執行構建
Dockerfile、shell.sh、var.txt等
docker run --privileged ...
能夠啓動docker特權模式,容許以其宿主機具備的(幾乎)全部能力來運行容器,包括一些內核特性和設備訪問
docker wait CONTAINER_NAME 等待程序退出獲得返回碼
docker run --cidfile=/tmp/CONTAINERID.txt
讓docker截獲容器id並將其存到--cidfile選項指定的文件
docker run --rm ... 會在容器進程運行完畢後,自動刪除容器,對於只用一次的容器和用完即扔的容器頗有用
在Dockerfile中指定了VOLUME時,在run對應的鏡像啓動容器,容器中就有對外的掛載點。能夠經過inspect看到,若是沒有指定,則沒有對外的掛載點
Dockerfile使用for
RUN for var in v{v..8};do touch $DIRS/$var; done # DIRS是ENV指定的環境變量
serf是一個去中心化的服務發現和編排的解決方案,特色是輕量級和高可用,同時具有容錯的特性
docker run -p 53:53/udp ... 以udp的方式
docker run -h CONTAINER_host_name 。。。
docker各語言支持多種SDKshell