Docker 常用命令與操作
介紹
此命令集合版本為 1.11.1
及以上
基礎類
查看docker信息
# 查看docker版本
docker version
# 顯示docker系統的信息
docker info
# 日誌信息
docker logs
# 故障檢查
service docker status
# 啟動關閉docker
sudo service docker start|stop
日誌類
查看容器日誌
docker logs -f <容器名orID>
docker daemon 日誌位置
也稱之為 引擎日誌
根據系統不同各不相同
* CoreOS - journalctl -u docker.service
* Ubuntu(16.04) - journalctl -u docker.service
* Ubuntu(14.04) - /var/log/upstart/docker.log
* Boot2Docker - /var/log/docker.log
* Debian GNU/Linux 8 - journalctl -u docker.service
* Debian GNU/Linux 7 - /var/log/daemon.log
* CentOS 7/RHEL 7 - journalctl -u docker.service
* CentOS - /var/log/daemon.log | grep docker
* Fedora - journalctl -u docker.service
* OpenSuSE - journalctl -u docker.service
* Red Hat Enterprise Linux Server - /var/log/messages | grep docker
* OSX - ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/log/docker.log
journalctl 日誌工具使用
# 最後行數的日誌
journalctl -n
# 詳細信息
journalctl -f
# 本次啟動後的所有日誌
journalctl -b
# 查看啟動記錄
journalctl --list-boots
# 查看某次運行過程中的日誌
sudo journalctl -b [啟動順序號,或者啟動hash]
# 查看記錄中指定單元 docker.service 的日誌
journalctl -u docker.service
- 顯示可以匹配日誌級別
journalctl -F PRIORITY
編碼 | 優先級 | 嚴重性 |
---|---|---|
0 | emerg | 系統不可用 |
1 | alert | 必須立即采取措施 |
2 | crit | 嚴重狀況 |
3 | err | 非嚴重錯誤狀況 |
4 | warning | 警告狀況 |
5 | notice | 正常但重要的事件 |
6 | info | 信息性事件 |
7 | debug | 調試級別消息 |
比如顯示 docker 內核日誌中 info 類的數據
# 只顯示錯誤、沖突和重要告警信息
journalctl -u docker.service -p err..alert
# -p 等效於 PRIORITY 也可以用數字來表示
journalctl -u docker.service PRIORITY=6
# 還可以加入 MESSAGE、MESSAGE_ID、_PID、_UID、_HOSTNAME、_SYSTEMD_UNIT 等條件
# 查詢字段 `man 7 systemd.journal-fields`
# 例如查詢 info 信息,PID 為 2331
journalctl -u docker.service PRIORITY=6 _PID=2331
journalctl 日誌保存到文件
systemd-journald 服務收集到的日誌默認保存在 /run/log 目錄中,重啟系統會丟掉以前的日誌信息
- 保存日誌到默認配置目錄
創建目錄 /var/log/journal
,當這個目錄存在,則日誌會持久化,記得創建後,重啟 systemd-journald.service
服務
sudo mkdir /var/log/journal
sudo chown root:systemd-journal /var/log/journal
sudo chmod 2775 /var/log/journal
sudo systemctl restart systemd-journald.service
- 或者修改配置
修改 /etc/systemd/journald.conf
,把取消註釋 Storage=auto
, 並改為 Storage=persistent
重啟 systemd-journald.service
服務
- 查看日誌占用的磁盤空間
sudo journalctl --disk-usage
容量定義文件在 /etc/systemd/journald.conf
日誌調整文件 /etc/logrotate.conf
日誌系統同樣會進行輪轉,每月觸發。默認情況下,日誌大小不能超過所處文件系統的10%,也不可使所處文件系統空間低於15%
無論是否設置把日誌存儲到文件,都會得到 disk-usage 的占用空間!
- 清理日誌數據
#使用 –vacuum-size 選項指定日誌的總體體積
sudo journalctl --vacuum-size=1G
使用 –vacuum-time 選項指定日誌的總時間占用
sudo journalctl --vacuum-time=1years
更多詳細見 http://www.cnblogs.com/sparkdev/p/8795141.html
docker ps 沒有響應 日誌查詢
# grep 所有容器的config.json
docker logs [conID]
# 確認問題後
# 該config.json 中有該容器1號進程的pid
kill -9 pid
容器類
docker容器可以理解為在沙盒中運行的進程
這個沙盒包含了該進程運行所必須的資源,包括文件系統、系統類庫、shell 環境等等。但這個沙盒默認是不會運行任何程序的。你需要在沙盒中運行一個進程來啟動某一個容器。這個進程是該容器的唯一進程,所以當該進程結束的時候,容器也會完全的停止。
查看容器信息
# 查看當前運行的容器
docker ps
# 查看全部容器
docker ps -a
# 查看全部容器的id和信息
docker ps -a -q
# 查看全部容器占用的空間
docker ps -as
# 查看一個正在運行容器進程,支持 ps 命令參數
docker top
# 查看容器的示例id
sudo docker inspect -f ‘{{.Id}}‘ [id]
# 檢查鏡像或者容器的參數,默認返回 JSON 格式
docker inspect
# 返回 ubuntu:14.04 鏡像的 docker 版本
docker inspect --format ‘{{.DockerVersion}}‘ ubuntu:14.04
docker inspect --format=‘{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}‘ ubuntu:14.04
容器同步命令
# 保存對容器的修改
docker commit
# 保存某個容器成為一個鏡像
docker commit -a "user" -m "commit info" [CONTAINER] [imageName]:[imageTag]
# 推送一個容器到中心倉庫
docker login --username=[userName] --password=[pwd] [registryURL]
## 建議登錄後查看 docker info
docker tag [imageID] [remoteURL]:[imageTag]
docker push [remoteURL]:[imageTag]
# 拉取提交的容器
docker pull [remoteURL]:[imageTag]
# 對比容器的改動
docker diff
# 附加到一個運行的容器上
docker attach
容器操作命令
創建刪除容器
# 創建一個容器命名為 test 使用鏡像daocloud.io/library/ubuntu
docker create -it --name test daocloud.io/library/ubuntu
# 創建並啟動一個容器 名為 test 使用鏡像daocloud.io/library/ubuntu
docker run --name test daocloud.io/library/ubuntu
# 刪除一個容器
docker rm [容器id]
# 刪除所有容器
docker rm `docker ps -a -q`
# 根據Dockerfile 構建
docker build -t [image_name] [Dockerfile_path]
docker容器隨系統自啟
docker run --restart=always
no
– 默認值,如果容器掛掉不自動重啟on-failure
– 當容器以非 0 碼退出時重啟容器,同時可接受一個可選的最大重啟次數參數 (e.g. on-failure:10).always
– 不管退出碼是多少都要重啟
容器資源限制參數
# 限制內存最大使用
-m 1024m --memory-swap=1024m
# 限制容器使用CPU
--cpuset-cpus="0,1"
把一個正在運行的容器保存為鏡像
docker commit <CONTAIN-ID> <IMAGE-NAME>
啟動停止容器等操作
docker start|stop|restart [id]
# 暫停|恢復 某一容器的所有進程
docker pause|unpause [id]
# 殺死一個或多個指定容器進程
docker kill -s KILL [id]
# 停止全部運行的容器
docker stop `docker ps -q`
# 殺掉全部運行的容器
docker kill -s KILL `docker ps -q`
交互式進入容器
sudo docker exec -it {{containerName or containerID}} bash
sudo docker exec -i {{containerName or containerID}} bash
sudo docker exec -t {{containerName or containerID}} bash
sudo docker exec -d {{containerName or containerID}} bash
- 只用
-i
參數,由於沒有分配偽終端,看起來像pipe執行一樣。但是執行結果、命令返回值都可以正確獲取 - 只用
-t
參數,則可以看到一個 console 窗口,但是執行命令會發現由於沒有獲得stdin的輸出,無法看到命令執行情況 - 使用
-it
時,則和我們平常操作 console 界面類似,而且也不會像attach方式因為退出,導致整個容器退出
- 使用
-d
參數,在後臺執行一個進程。如果一個命令需要長時間進程,會很快返回
Docker attach
Docker attach可以attach到一個已經運行的容器的stdin,然後進行命令執行的動作
docker attach {{containerName or containerID}}
需要註意的是,如果從這個stdin中exit,會導致容器的停止
查看容器的root用戶密碼
docker logs <容器名orID> 2>&1 | grep ‘^User: ‘ | tail -n1
因為Docker容器啟動時的root用戶的密碼是隨機分配的。所以,通過這種方式就可以得到容器的root用戶的密碼
容器於宿主拷貝文件
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
# 本地文件上傳到對應容器的目錄
docker cp local.sh [CONTAINERid]:[TagPath]
此命令為高版本docker才有,當然1.11+肯定包含
運行一個新容器,同時為它命名、端口映射、文件夾映射
以redmine
鏡像為例
docker run --name redmine -p 9003:80 -p 9023:22 -d -v /var/redmine/files:/redmine/files -v /var/redmine/mysql:/var/lib/mysql sameersbn/redmine
一個容器連接到另一個容器
docker run -i -t --name sonar -d -link mmysql:db tpires/sonar-server sonar
導入導出容器
# 支持遠程文件 .tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz
docker import
# 導出
docker export [id] >~/Downloads/ubuntu_nexus.tar
導出後導入(exported-imported))的容器會丟失所有的提交歷史,無法回滾。
鏡像操作
遠程鏡像
docker login
docker search
# 搜索處收藏數不小於 3 ,並且能夠自動化構建的 django 鏡像,並且完整顯示鏡像描述
docker search -s 3 --automated --no-trunc django
docker pull
# 拉取ubuntu最新的鏡像
docker pull ubuntu:latest
# 服務器拉取個人動態,可選擇時間區間
docker events
# 拉取個人從 2015/07/20 到 2015/08/08 的個人動態
docker events --since="20150720" --until="20150808"
鏡像同步操作
# 標記本地鏡像,將其歸入某一倉庫
docker tag
# 將 ID 為 5db5f84x1261 的容器標記為 mine/lnmp:0.2 鏡像
docker tag 5db5f84x1261 mine/lnmp:0.2
# 將鏡像推送至遠程倉庫,默認為 Docker Hub
docker push
本地鏡像
# 列出本地所有鏡像
docker images
# 本地鏡像名為 ubuntu 的所有鏡像
docker images ubuntu
# 查看指定鏡像的創建歷史
docker history [id]
# 本地移除一個或多個指定的鏡像
docker rmi
# 移除本地全部鏡像
docker rmi `docker images -a -q`
# 指定鏡像保存成 tar 歸檔文件, docker load 的逆操作
docker save
# 將鏡像 ubuntu:14.04 保存為 ubuntu14.04.tar 文件
docker save -o ubuntu14.04.tar ubuntu:14.04
# 從 tar 鏡像歸檔中載入鏡像, docker save 的逆操作
docker load
# 上面命令的意思是將 ubuntu14.04.tar 文件載入鏡像中
docker load -i ubuntu14.04.tar
docker load < /home/save.tar
# 構建自己的鏡像
docker build -t <鏡像名> <Dockerfile路徑>
docker build -t xx/gitlab .
保存後再加載(saved-loaded)的鏡像不會丟失提交歷史和層,可以回滾
重新查看container的stdout
# 啟動top命令,後臺運行
$ ID=$(sudo docker run -d ubuntu /usr/bin/top -b)
# 獲取正在running的container的輸出
$ sudo docker attach $ID
top - 02:05:52 up 3:05, 0 users, load average: 0.01, 0.02, 0.05
Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.1%us, 0.2%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 373572k total, 355560k used, 18012k free, 27872k buffers
Swap: 786428k total, 0k used, 786428k free, 221740k cached
^C$
$ sudo docker stop $ID
docker run
後臺運行(-d)、並暴露端口
docker run -d -p 127.0.0.1:33301:22 centos6-ssh
run 命令詳解
-a, --attach=[] Attach to STDIN, STDOUT or STDERR 指定標準輸入輸出內容類型,可選 STDIN/STDOUT/STDERR 三項
--add-host=[] Add a custom host-to-IP mapping (host:ip)
--blkio-weight=0 Block IO (relative weight), between 10 and 1000
-c, --cpu-shares=0 CPU shares (relative weight)
--cap-add=[] Add Linux capabilities
--cap-drop=[] Drop Linux capabilities
--cgroup-parent= Optional parent cgroup for the container
--cidfile= Write the container ID to the file
--cpu-period=0 Limit CPU CFS (Completely Fair Scheduler) period
--cpu-quota=0 Limit the CPU CFS quota
--cpuset-cpus= CPUs in which to allow execution (0-3, 0,1) 綁定容器到指定CPU運行
--cpuset-mems= MEMs in which to allow execution (0-3, 0,1) 綁定容器到指定MEM運行
-d, --detach=false Run container in background and print container ID 後臺運行容器,並返回容器ID
--device=[] Add a host device to the container
--dns=[] Set custom DNS servers 指定容器使用的DNS服務器,默認和宿主一致
--dns-search=[] Set custom DNS search domains 指定容器DNS搜索域名,默認和宿主一致
-e, --env=[] Set environment variables 設置環境變量
--entrypoint= Overwrite the default ENTRYPOINT of the image
--env-file=[] Read in a file of environment variables 從指定文件讀入環境變量
--expose=[] Expose a port or a range of ports
-h, --hostname= Container host name 指定容器的hostname
--help=false Print usage
-i, --interactive=false Keep STDIN open even if not attached 以交互模式運行容器,通常與 -t 同時使用
--ipc= IPC namespace to use
-l, --label=[] Set meta data on a container
--label-file=[] Read in a line delimited file of labels
--link=[] Add link to another container
--log-driver= Logging driver for container
--log-opt=[] Log driver options
--lxc-conf=[] Add custom lxc options
-m, --memory= Memory limit
--mac-address= Container MAC address (e.g. 92:d0:c6:0a:29:33)
--memory-swap= Total memory (memory + swap), ‘-1‘ to disable swap
--name= Assign a name to the container 為容器指定一個名稱
--net=bridge Set the Network mode for the container 指定容器的網絡連接類型,支持 bridge/host/none/container:<name|id> 四種類型
--oom-kill-disable=false Disable OOM Killer
-P, --publish-all=false Publish all exposed ports to random ports
-p, --publish=[] Publish a container‘s port(s) to the host
--pid= PID namespace to use
--privileged=false Give extended privileges to this container
--read-only=false Mount the container‘s root filesystem as read only
--restart=no Restart policy to apply when a container exits
--rm=false Automatically remove the container when it exits
--security-opt=[] Security Options
--sig-proxy=true Proxy received signals to the process
-t, --tty=false Allocate a pseudo-TTY 為容器重新分配一個偽輸入終端,通常與 -i 同時使用
-u, --user= Username or UID (format: <name|uid>[:<group|gid>])
--ulimit=[] Ulimit options
--uts= UTS namespace to use
-v, --volume=[] Bind mount a volume
--volumes-from=[] Mount volumes from the specified container(s)
-w, --workdir= Working directory inside the container
存在的問題解決方法
去除每次sudo運行docker命令,需要添加組
# Add the docker group if it doesn‘t already exist.
$ sudo groupadd docker
#改完後需要重新登陸用戶
$ sudo gpasswd -a ${USER} docker
Dockerfile中的EXPOSE、docker run --expose、docker run -p之間的區別
- Dockerfile的EXPOSE相當於docker run --expose,提供container之間的端口訪問
- docker run -p允許container外部主機訪問container的端口
註意
ubuntu14 的 febootstrap沒有 -i 命令
ubuntu14下的docker是沒有service服務
Docker 常用命令與操作