[TOC]
容器是獨立運行的一個或一組應用。Docker容器通過Docker鏡像來創建。
容器與鏡像的關系類似于面向對象編程中的對象與類。
>[info] 以下命令的容器名稱都可以換成容器的id
## 操作
# 創建一個叫mycon的容器并傳入參數php:5.6-fpm
docker create --name mycon php:5.6-fpm
# 如果鏡像中沒有cmd,報Error response from daemon: No command specified
docker create ubuntu-ssh-20190622:ansible /bin/bash
# 創建并運行ubuntu:15.10,輸出 "Hello world"
docker run ubuntu:15.10 /bin/echo "Hello world"
# 創建容器,并進入容器,如果不指定name就會自己創建一個臨時name
# 非bash,sh。就是直接執行后退出
docker run -i -t ubuntu:18.10(鏡像名) /bin/bash
# 加上d的話就創建運行后就直接退出
docker run -itd ubuntu:18.10
# 在容器mycon中開啟一個交互模式的終端
docker exec -i -t mycon /bin/bash
# 在容器mycon中以交互模式執行容器內/data/test.sh腳本
docker exec -it mycon /bin/sh /data/test.sh
# 退出容器
快捷鍵:Ctrl+P+Q
exit;
# 停止容器運行,發送信號SIGTERM
docker stop mycon
# 啟動一個停止狀態的容器
docker start mycon
# 重啟一個容器
docker restart mycon
# 刪除一個容器
doecker rm mycon
# 阻塞到一個容器,直到容器停止運行
docker wait mycon
# 暫停容器中所有的進程
docker pause mycon
# 恢復容器中所有的進程。
docker unpause mycon
# 找到目標容器的pid,然后用nsenter進入
# 老版本的docker是沒有exec命令的
docker inspect -f {{.State.Pid}} 44fc0f0582d9
nsenter --target 998 --mount --uts --ipc --net --pid
# 發送信號給容器,默認SIGKILL
docker kill -s KILL mycon (-s表示向容器發送一個信號)
## 信息
# 顯示狀態為運行(Up)的容器
docker ps
-a :顯示所有的容器,包括未運行的。例如:docker ps -a
# 深入容器內部獲取容器所有信息,例如:docker inspect mycon
docker inspect
-f :指定返回值的模板文件。例如:docker inspect -f '{{.NetworkSettings.IPAddress}}' mycon (獲取正在運行的容器mycon的 IP)
-s :顯示總的文件大小。
--type :為指定類型返回JSON。
# 查看容器的日志(stdout/stderr)
docker logs
-f : 跟蹤日志輸出,例如:docker logs -f mycon(查看容器mycon的日志輸出,容器必須是啟動狀態)
--since :顯示某個開始時間的所有日志
-t : 顯示時間戳
--tail :僅列出最新N條容器日志,例如:docker logs --since="2017-05-01" --tail=10 mycon(查看容器mycon從2017年5月1日后的最新10條日志。)
# 得到docker服務器的實時的事件
docker events
-f :根據條件過濾事件;例如:docker events -f "image"="mysql:5.6" --since="1466302400" (顯示docker 鏡像為mysql:5.6 這個時間戳對應的日期之后的相關事件。)
--since :從指定的時間戳后顯示所有事件;例如:docker events --since="1466302400" (顯示docker 在這個時間戳對應的日期之后的所有事件。)
--until :流水時間顯示到指定的時間為止;
# 顯示容器的端口映射,例如:docker port mycon
docker port
# 顯示容器的進程信息,支持ps參數。例如docker top mycon
docker top
# 顯示容器文件系統的前后變化, 檢查容器里文件結構的更改。例如:docker diff mycon
docker diff
## 數據卷與數據卷容器
刪除容器后數據還存在
# 數據卷的創建與查看
# 默認是創建在宿主機的/var/lib/docker/volumes/上
docker volume create nginx-vol
docker volume ls
docker volume inspect nginx-vol
# 數據卷掛載
docker run -itd --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
docker run -itd --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx
# 數據卷指定掛載目錄 /home/docker/wwwroot
# -v方式的可以自動創建目錄, --mount方式的不可以
docker run -itd --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
docker run -itd --name=nginx-test --mount type=bind src=/home/docker/wwwroot,dst=/usr/share/nginx/html nginx
docker run -itd --name=nginx-test -v /home/docker/wwwroot:/usr/share/nginx/html nginx
如果容器之間需要共享一些持續更新的數據
# 創建掛載卷容器 src:數據卷(必須要把名稱寫全) dst=把數據卷掛載到容器中的什么地方
docker run -itd --name nginx-data --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
# 新的容器關聯數據卷容器
docker run -itd --volumes-from nginx-data --name nginx-1 nginx
docker run -itd --volumes-from nginx-data --name nginx-2 nginx
# 三個容器的數據卷通用
## 導出導入
# 從容器里向外拷貝文件或目錄
docker cp
-L :保持源目標中的鏈接
docker cp /www/test mycon:/www/ # 將主機/www/test目錄拷貝到容器mycon的/www目錄下
docker cp /www/test mycon:/www # 將主機/www/test目錄拷貝到容器mycon中,目錄重命名為www
docker cp mycon:/www /tmp/test # 將容器mycon中的/www目錄拷貝到主機的/tmp/test目錄中
# 將容器整個文件系統導出為一個tar包,不帶layers、tag等信息
# 導出容器必須要先停止容器
docker export
-o :將輸入內容寫到文件。例如:docker export -o mysql-`date +%Y%m%d`.tar a404c6c174a2 #將id為a404c6c174a2的容器按日期保存為tar文件。
# docker import <文件路徑> <容器名>
docker import ./ubuntu1810.tar ubuntu1810:tag
>[info] 注意,docker import導入容器進去是成為一個新的鏡像,要通過`docker images`來查看,相比docker save命令,容器文件會丟失所有元數據和歷史記錄,僅保存容器當時的狀態,相當于虛擬機快照。