docker命令詳解

keke_li發表於2017-12-27

docker命令詳解

此次操作都是在unbantu17.01下進行,docker版本是17.10.0-ce,docker-compose是1.17.1.

docker 存在的意義

  • 使用dokcer加速本地開發和構建,開發人員可以構建、執行並分享Docker容器,容器可以在開發環境中構建,然後輕鬆地提交到測試環境中,並最終進入生產環境
  • 能夠讓獨立服務或應用程式在不同環境中,得到相同的執行結果。
  • 用docker 建立隔離環境進行測試
  • docker 可以讓開發者先在本機上構建一個複雜的程式測試,而不是一開始就在生產環境進行測試

docker概念

  • Docker 的常用文件:https://docs.docker.com/
  • Docker 映象: 使用者基於映象來執行自己的容器,可以把映象當做容器的『原始碼』,映象體積很小,易於分享、儲存和更新
  • Registry: Docker 用 Registry 儲存使用者構建的映象,Registry 分為公共和私有兩種:
    • Docker 公司運營的公共 Registry 叫做 Docker Hub,我們可以在上面註冊賬號,分享並儲存自己的映象。
    • 可以在 Docker Hub 儲存自己的私有映象或者架設自己私有的 Registry
  • Docker 容器: 把應用程式或服務打包放進去,容器是基於映象啟動的,容器中可以執行一個或多個程式。
    • 映象是 Docker 生命週期中的構建或打包階段
    • 容器則是啟動或執行階段

docker的使用命令

1 docker 命令介紹

docker --help

管理命令:
  container   管理容器
  image       管理映象
  network     管理網路
命令:
  attach      介入到一個正在執行的容器
  build       根據 Dockerfile 構建一個映象
  commit      根據容器的更改建立一個新的映象
  cp          在本地檔案系統與容器中複製 檔案/資料夾
  create      建立一個新容器
  exec        在容器中執行一條命令
  images      列出映象
  kill        殺死一個或多個正在執行的容器    
  logs        取得容器的日誌
  pause       暫停一個或多個容器的所有程式
  ps          列出所有容器
  pull        拉取一個映象或倉庫到 registry
  push        推送一個映象或倉庫到 registry
  rename      重新命名一個容器
  restart     重新啟動一個或多個容器
  rm          刪除一個或多個容器
  rmi         刪除一個或多個映象
  run         在一個新的容器中執行一條命令
  search      在 Docker Hub 中搜尋映象
  start       啟動一個或多個已經停止執行的容器
  stats       顯示一個容器的實時資源佔用
  stop        停止一個或多個正在執行的容器
  tag         為映象建立一個新的標籤
  top         顯示一個容器內的所有程式
  unpause     恢復一個或多個容器內所有被暫停的程式

複製程式碼

2.更詳細的功能引數配置

引數 解釋
--api-enable-cors=false 開放遠端API呼叫的 CORS 頭資訊。這個介面開關對想進行二次開發的上層應用提供了支援.
-b, --bridge="" 掛載已經存在的網橋裝置到 Docker 容器裡。注意,使用 none 可以停用容器裡的網路.
--bip="" 使用 CIDR 地址來設定網路橋的 IP。注意,此引數和 -b 不能一起使用.
-D, --debug=false 開啟Debug模式。例如:docker -d -D
-d, --daemon=false 開啟Daemon模式.
--dns=[] 強制容器使用DNS伺服器.例如: docker -d --dns 8.8.8.8
--dns-search=[] 強制容器使用指定的DNS搜尋域名.例如: docker -d --dns-search example.com
-e, --exec-driver="native" 強制容器使用指定的執行時驅動.例如:docker -d -e lxc
-G, --group="docker" 在後臺執行模式下,賦予指定的Group到相應的unix socket上。注意,當此引數 --group 賦予空字串時,將去除組資訊。
-g, --graph="/var/lib/docker" 配置Docker執行時根目錄
-H, --host=[] 在後臺模式下指定socket繫結,可以繫結一個或多個 tcp://host:port, unix:///path/to/socket, fd://* 或 fd://socketfd。例如:$ docker -H tcp://0.0.0.0:2375 ps 或者 $ export DOCKER_HOST="tcp://0.0.0.0:2375" $ docker ps
--icc=true 啟用內聯容器的通訊.
--ip="0.0.0.0" 容器繫結IP時使用的預設IP地址.
--ip-forward=true 啟動容器的 net.ipv4.ip_forward.
--iptables=true 啟動Docker容器自定義的iptable規則.
--mtu=0 設定容器網路的MTU值,如果沒有這個引數,選用預設 route MTU,如果沒有預設route,就設定成常量值 1500.
-p, --pidfile="/var/run/docker.pid" 後臺程式PID檔案路徑.
-r, --restart=true 重啟之前執行中的容器.
-s, --storage-driver="" 強制容器執行時使用指定的儲存驅動,例如,指定使用devicemapper, 可以這樣:docker -d -s devicemapper
--selinux-enabled=false 啟用selinux支援
--storage-opt=[] 配置儲存驅動的引數
--tls=false 啟動TLS認證開關
--tlscacert="/Users/dxiao/.docker/ca.pem" 通過CA認證過的的certificate檔案路徑
--tlscert="/Users/dxiao/.docker/cert.pem" TLS的certificate檔案路徑
--tlskey="/Users/dxiao/.docker/key.pem" TLS的key檔案路徑
--tlsverify=false 使用TLS並做後臺程式與客戶端通訊的驗證
-v, --version=false 顯示版本資訊

*注意:其中帶有[] 的啟動引數可以指定多次,例如

docker run -a stdin -a stdout -a stderr -i -t ubuntu /bin/bash

複製程式碼

docker基本

  1. 檢視系統核心
 uname -r
複製程式碼
  1. 啟動docker 境像
systemctl start docker 
複製程式碼

3.檢視docker版本

docker verison
複製程式碼

4.顯示docker系統的資訊

docker info
複製程式碼

操作docker映象

1.檢索image

docker search image-name
複製程式碼

2.下載image

docker pull image-name
複製程式碼

3.列出映象列表

docker images 
複製程式碼

4.刪除一個或者多個映象

docker rmi image-name
複製程式碼

5.顯示一個映象的歷史

docker history image-name  
複製程式碼

6.通過容器建立映象

*從已經建立的容器中更新映象,並且提交這個映象 *使用 Dockerfile 指令來建立一個新的映象 下面通過已存在的容器建立一個新的映象。

docker commit -m="First Image" -a="keke" 7a15f99695c0 keke/unbantu:17.10.0

上面命令引數說明:
* -m 提交的描述資訊
* -a 指定映象作者
* 7a15f99695c0 記住這個是容器id,不是映象id
* keke/unbantu:17.10.0 建立的目標映象名

複製程式碼
  1. Docker 註冊賬戶,釋出的映象都在這個頁面裡展示
  2. 將上面做的映象unbantu,起個新的名字unbantu-test
docker tag keke/unbantu:17.10.0 keke/unbantu-test:lastest
複製程式碼
  1. 登入docker
docker login
複製程式碼

4.上傳unbantu映象

docker push keke/unbantu-test:lastest
複製程式碼

啟動容器

docker容器可以理解為在沙盒中執行的程式。這個沙盒包含了該程式執行所必須的資源,包括檔案系統、系統類庫、shell 環境等等。但這個沙盒預設是不會執行任何程式的。你需要在沙盒中執行一個程式來啟動某一個容器。這個程式是該容器的唯一程式,所以當該程式結束的時候,容器也會完全的停止。

1.在容器中安裝新的程式

docker run image-name apt-get install -y -name
複製程式碼

2.在容器中執行"echo"命令,輸出"hello word"

docker run image-name echo "hello word" 
複製程式碼

3.互動式進入容器中

docker run -i -t image_name /bin/bash  
複製程式碼

注意:在執行apt-get 命令的時候,要帶上-y引數。如果不指定-y引數的話,apt-get命令會進入互動模式,需要使用者輸入命令來進行確認,但在docker環境中是無法響應這種互動的。apt-get 命令執行完畢之後,容器就會停止,但對容器的改動不會丟失.

檢視容器

1.列出當前所有正在執行的container

docker ps
複製程式碼

2.列出所有的container

docker ps -a  
複製程式碼

3.列出最近一次啟動的container

docker ps -l  
複製程式碼

4.儲存對容器的修改 當你對某一個容器做了修改之後(通過在容器中執行某一個命令),可以把對容器的修改儲存下來,這樣下次可以從儲存後的最新狀態執行該容器。

1.儲存對容器的修改; -a, --author="" Author; -m, --message="" Commit message

docker commit ID new-image-name 
複製程式碼

5.操作容器

1.刪除所有容器

docker rm `docker ps -a -q`
複製程式碼

2.刪除單個容器; -f, --force=false; -l, --link=false Remove the specified link and not the underlying container; -v, --volumes=false Remove the volumes associated to the container

docker rm Name/ID 
複製程式碼

3.停止、啟動、殺死一個容器

docker stop Name/ID  
docker start Name/ID  
docker kill Name/ID 
複製程式碼

4.從一個容器中取日誌; -f, --follow=false Follow log output; -t, --timestamps=false Show timestamps

docker logs Name/ID  
複製程式碼

5.列出一個容器裡面被改變的檔案或者目錄,list列表會顯示出三種事件,A 增加的,D 刪除的,C 被改變的

docker diff Name/ID
複製程式碼

6.顯示一個執行的容器裡面的程式資訊

docker top Name/ID  
複製程式碼

7.從容器裡面拷貝檔案/目錄到本地一個路徑

docker cp Name:/container-path to-path  
docker cp ID:/container-path to-path 
複製程式碼

8.重啟一個正在執行的容器; -t, --time=10 Number of seconds to try to stop for before killing the container, Default=10

docker restart Name/ID
複製程式碼

9.附加到一個執行的容器上面; --no-stdin=false Do not attach stdin; --sig-proxy=true Proxify all received signal to the process

docker attach ID #重新啟動並執行一個互動式會話shell
複製程式碼

注意:使用這個命令可以掛載正在後臺執行的容器,在開發應用的過程中運用這個命令可以隨時觀察容器內程式的執行狀況.

儲存和載入映象

當需要把一臺機器上的映象遷移到另一臺機器的時候,需要儲存映象與載入映象。

1.儲存映象到一個tar包; -o, --output="" Write to an file

docker save image-name -o file-path 
複製程式碼

2.載入一個tar包格式的映象; -i, --input="" Read from a tar archive file

docker load -i file-path 
複製程式碼

3.從機器A拷貝到機器B

docker save image-name > /home/keke/main.tar

*使用scp將main.tar拷到機器A上:

docker load < /home/keke/main.tar

複製程式碼

登入

1.登陸registry server; -e, --email="" Email; -p, --password="" Password; -u, --username="" Username

docker login
複製程式碼

釋出docker映象

docker push new-image-name 
複製程式碼

構建映象(Dockerfile + docker build)

FROM ...

RUN ...

# 指定容器內的程式將會使用容器的指定埠
# 配合 docker run -p
EXPOSE ...

複製程式碼
  • RUN: 指定映象被構建時要執行的命令
  • CMD: 指定容器被啟動時要執行的命令
  • ENTRYPOINT: 同 CMD ,但不會被 docker run -t 覆蓋
  • WORKDIR: CMD/ENTRYPOINT 會在這個目錄下執行
  • VOLUME
  • ADD
  • COPY
docker history images-name
複製程式碼

1.從新映象啟動容器

docker run -d -p 4000:80 --name [name] #可以在 Dokcer 宿主機上指定一個具體的埠對映到容器的80埠上
複製程式碼

守護容器

docker run -d container-name #建立守護容器
docker top container-name #檢視容器內程式
docker exec container-name touch a.txt #在容器內部執行程式
docker stop container-name #停止容器

複製程式碼

關於docker

覺得此文章不錯可以去github給我star! 如果還有遇到問題可以加我微信Sen0676備註下來自github,進go實戰群詳細交流!

參考資料

官方英文資源

  • Docker官網:http://www.docker.com
  • Docker windows入門:https://docs.docker.com/windows/
  • Docker Linux 入門:https://docs.docker.com/linux/
  • Docker mac 入門:https://docs.docker.com/mac/
  • Docker 使用者指引:https://docs.docker.com/engine/userguide/
  • Docker 官方部落格:http://blog.docker.com/
  • Docker Hub: https://hub.docker.com/
  • Docker開源: https://www.docker.com/open-source

中文資源

  • Docker中文網站:http://www.docker.org.cn
  • Docker中文文件:http://www.dockerinfo.net/document
  • Docker安裝手冊:http://www.docker.org.cn/book/install.html
  • 一小時Docker教程 :https://blog.csphere.cn/archives/22
  • Docker中文指南:http://www.widuu.com/chinese_docker/index.html

其它資源