Docker容器建立常用選項以及常用管理命令
一:容器建立常用選項
docker run命令不清楚的可以 docker run --help |grep 引數
1、建立容器常用選項
建立容器命令格式:
Usage: docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]OPTIONS(常用選項)
OPTIONS:(以docker run為例)
=============================================================
-i
-t:開啟一個偽終端
-d:放到後臺執行
--add-host list :動態新增一個host記錄
例如:建立一個容器並檢視容器中的hosts
docker run -itd --name hello --add-host abc:192.168.0.2 ubuntu
docker exec hello cat /etc/hosts
-a:如果在執行run命令時沒有指定-a引數,那麼Docker預設會掛載所有標準資料流,包括輸入輸出和錯誤,可以單獨指定掛載哪個標準流
docker run -a stdin -a stdout -i -t ubuntu /bin/bash
--cap-add list:給容器賦予更細粒度的許可權,例如ntp服務,需要修改核心可以正常工作
--cap-drop list:給容器刪除更細粒度的許可權
--cidfile string:把容器id寫到一個檔案中
例如:把容器id寫到/tmp/dockerid.pid檔案並檢視
docker run -itd --name duan --cidfile /tmp/dockerid.pid ubuntu
cat /tmp/dockerid.pid
--device list :新增物理機上裝置到容器,比如磁碟掛在到容器
--dns list:指定容器DNS,例如:指定DNS並檢視預設DNS
docker run -itd--name dnstest --dns 8.8.8.8 ubuntu
docker exec dnstest cat /etc/resolv.conf
-e :傳入變數。例如:建立容器並傳入變數並檢視變數
docker run -itd --name bianliang -e TEST=123456 ubuntu
docker attach bianliang #echo $TEST
--env-file -list:通過檔案傳入變數 和-e引數類似
--expose list :指定容器開放的埠。例如:建立容器指定容器開放埠並檢視最新建立的容器
docker run -itd --name porttest --expose 80 ubuntu
docker ps -l
-h:指定容器主機名,預設容器id截斷部分,例如:建立指定容器主機名並檢視容器主機名
docker run -itd -name hostnametest -h duanshuaixing ubuntu
docker exec hostnametest hostname
--net:指定一個網路
--ip:指定一個ip(劃分網段進行隔離,只針對自定義網路)
例如:檢視當前網路並建立一個子網,再在新建立的容器中指定網路和ip,然後檢視容器資訊
docker network ls
docker network create --subnet=10.0.0.0/16 network_10
docker network ls
docker run -itd --name networktest --net=network_10 --ip 10.0.0.122 ubuntu
docker inspect networktest
--link: 連線已有容器。獲取指定容器ip 並且與abc對應,host的作用是通過域名或者主機名的方式進行訪問對應的ip,當ip發生變化時仍可以通過主機名或者域名進行連線不需要修改程式。
例如:檢視已有容器ip,建立一個容器並且連線指定容器,檢視hosts
docekr exec networktest cat /etc/hosts
docker run -itd --name linktest --link networktest:abc ubuntu
docker exec linktest cat /etc/hosts
--log-driver:【none(不開啟日誌)、json-file(預設)、syslog、fluentd、splunk等】。設定日誌預設日誌路徑:/var/lib/docker/containers/容器id/*.json.log檔案
例如:建立容器並指定使用syslog方式,檢視syslog檔案
docker run -itd --name logtest --log-driver ubuntu
tail /var/log/syslog -f
--log-opt:日誌的選項
--mount:把本地檔案系統掛載到容器
--net :指定容器為哪個網路
--oom-kill-disable:預設在Linux下系統物理資源不足會kill一些記憶體開銷比較大的程序,此選項可以避免被kill
--pid string:使用pid的名稱空間
-p:將容器埠轉發到埠
例如:將容器80埠轉發到宿主機8888埠並檢視轉發情況
docker run -itd --name porttest -p 8888:80 ubuntu
docker ps -l
-P:將expose標識的埠對映到宿主機隨機埠
--restart:容器掛了之後嘗試重啟
例如:容器掛了之後一直嘗試重啟和容器掛了之後重啟3次失敗就放棄
docker run -itd --name restarttest01 --restart alway ubuntu
docker run -itd --name restarttest02 --restart on-failure:3 ubuntu
--ulimit:開啟最大檔案限制
例如:設定使用者開啟最大程序數和開啟最大檔案數,並檢視ulimit值
docker run -itd --name ulimittest --ulimit nproc=10240 --ulimit nofile=10240 ubuntu
docker attach ulimittest
ulimit -n && ulimit -a |grep 10240
-v:將宿主機的某個目錄掛載到容器的某個目錄
-volumes-from:容器資料卷。容器為共享目錄共享到多個容器
-w:進入容器後到工作目錄
===================================================
關於CPU的限制
http://blog.opskumu.com/docker-cpu-limit.html
http://cenalulu.github.io/linux/numa/
--cpu-period init:cpu週期設定
--cpu-quota init :CPU配額限制
-c,--cpu-shares init: CPU共享(相對權重)
--cpuset-cpus string:CPUs in which to allow execution (0-3, 0,1)
--device-read-bps list:限制磁碟讀取速率
--device-write-bps list:限制磁碟寫的速率
--device-read-iops list:限制磁碟讀取的iops
--device-write-iops list:限制磁碟寫的iops
-m,--memory bytes 限制容器記憶體(硬限制,不可突破硬限制,可軟硬限制結合)
例如:建立一個容器,限制記憶體為10M,進入容器檢視限制
docker run --name memorytest -m 10240000 ubuntu
docker attach memorytest
cd /sys/fs/cgroup/memory/ && grep 10240000 *
--memory-reservation bytes(軟限制,可以突破軟限制,可軟硬限制結合)
--memory-swap bytes:交換限制等於記憶體加交換:“- 1”啟用無限交換
--nemory-swappiness init:限制是否使用swap(0 to 100),權重為0表示禁用swap,預設-1
--storage-opt list:容器的儲存驅動程式選項:只支援對devicemapper儲存驅動
=========================================================
二:常用管理命令
刪除所有容器:
docker rm -f $(docker ps -q -a)
容器基本操作:
ps:檢視當前執行的容器、檢視當前所有容器、檢視最新建立的容器、檢視容器pid、檢視容器的大小
docker ps && docker ps -a && docker ps -l && docker ps -q && docker ps -s
attach:標準的輸入輸出附加給容器程序,可以正常的進行輸入輸出
docker attach duan
rm:刪除容器(執行中不可以刪除)、強制刪除容器(執行不允許都刪除)、映象和容器一起刪除
docker rm duan && docker rm -f duan && docker rmi duan
start:啟動容器
docker start duan
stop:停止容器
docker stop duan
kill:掛起容器
docker kill duan
rename:命名變更,容器ID不變
docker rename duan newname
inspect:檢視容器的詳細配置資訊
docker inspect duan
exec:把命令執行在指定容器中而不需要attach到容器中。
當前bash的顯示方式、使用互動式顯示容器內容、把當前bash附加給容器達到類似於登陸容器的效果
docker exec duan ls /
docker exec -it duan ls /
docker exec -it duan /bin/bash
top:檢視容器中進行的程序
docker top duan
port:檢視容器埠轉發情況
docker port duan
cp:從本地拷貝到容器、從容器拷貝到本地
docker cp a.txt duan:/home
docker cp duan:/home/a.txt /tmp
diff:檢視讀寫層新增到檔案
docker diff duan
logs:檢視輸出到終端的日誌
docker logs duan
stats:動態檢視容器利用率、靜態檢視容器利用
docker stats duan
docker stats --no-stram duan
update:可以對正在執行的容器進行修改
events:檢視當前docker主機的資訊,不是針對某個容器,開啟一個終端監聽主機事件,操作容器監聽終端顯示操作資訊,容器內操作不監聽、
docker events (監聽終端)
docker start duan (操作終端)
檢視指定時間之後的事:--since string Show all events created since timestamp
檢視指定時間之前的事: --until string Stream events until this timestamp
過濾只顯示指定事件:
docker events -f events=kill
=========================================================
三:容器資料持久化
資料卷:
1、將宿主機目錄掛載到容器目錄
資料卷的特點:
01、在容器啟動初始化時,如果容器使用的宿主機掛載點有資料,這些資料就會拷貝到容器中
02、資料卷可以在容器直接共享和重用
03、可以直接對資料卷裡的內容進行修改
04、資料卷的變化不會影響映象的更新
05、卷會一直存在,即使掛載資料卷的容器已經刪除
示例:
1-1、建立一個web01的容器,掛載宿主機根目錄下的/container_data/web到容器目錄的data下
docker run -itd --name web01 -v /container_data/web:/data Ubuntu
1-2、建立一個web02的容器,掛載宿主機根目錄下的/container_data/web到容器目錄到data下
docker run -itd --name web02 -v /container_data/web:/data Ubuntu
1-3、修改宿主機下在宿主機的目錄下建立一個檔案容器內檢視,修改後再次檢視
echo hello >/container_data/web/index.php
docker exec web01 ls /data/
docker exec web02 ls /data/
echo 123123 >>/cotainer_data/web/index.php
docker exec web01 ls /data/
docker exec web02 ls /data/
2、容器資料卷(把一個容器作為資料卷掛載到其他容器共享)
2-1、建立一個名為data的資料卷容器、建立一個web01的容器,並掛在容器資料卷data
docker run -itd -v /data --name data ubuntu
docker run -itd --name web01 --volumes-from data ubuntu
2-2、在資料卷容器data中新增檔案、檢視資料卷中是否成功新增檔案、檢視web01中掛在的資料、再建立容器掛在容器資料卷、檢視容器web02的資料。
docker exec data touch /data/index.php
docker exec data ls /data/
docker exec data ls /data/
docker run -itd --name web02 -volumes-from data ubuntu
docker exec web02 ls /data/
4、管理應用程式資料
4-1:
1> : -Volume 管理資料卷:(可以多個容器共享一個數據卷)
docker volume create nginx-vloume
docker volume ls (檢視資料卷)
docker volume inspect nginx-volume (檢視資料卷想詳細資訊)
docker volume --help
2>用資料卷建立一個容器
docker run -itd --name nginx1 -p88:80 --mount src=nginx-volume,dst=/var/www/html richarvey/nginx-php-fpm
docker volume inspect nginx-volume
ls /var/lib/docker/volumes/nginx-volume/_data (檢視資料卷內到內容)
3>不指定資料卷:(匿名卷)
docker run -itd --name nginx1 -p88:80 --mount src=,dst=/var/www/html richarvey/nginx-php-fpm
4>清理:
docker container stop nginx
docker container rm nginx1
docker volume rm nginx-volume
5>如果沒有指定資料卷(匿名卷),系統自動建立。建議使用--mount引數,更通用
4-2: bind mount
1>用卷建立一個容器
docker run -itd --name=nginx11 --mount type=bind,src=/www/html,dst=/var/www/html richarvey/nginx-php-fpm
docker run -itd --name=nginx12 -v /www/html/:/var/www/html richarvey/nginx-php-fpm
2>驗證繫結:
docker inspect nginx11
3>清理:
docker container stop nginx11
docker container rm nginx11
4>注意:
a、如果原始檔/目錄不存在,不會自動建立,丟擲error
b、如果掛載目標在容器中是一個非空目錄,則改目錄現有檔案回被隱藏
四:圖形化管理
使用以下Docker命令部署Portainer:只需使用瀏覽器訪問Portainer正在執行的Docker引擎的埠9000。
1、建立資料卷
docker volume create portainer_data
2、建立容器
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer
3、訪問測試(初次訪問需要設定密碼)
ip+埠