1. 程式人生 > >Docker容器建立常用選項以及常用管理命令

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+埠

    4、官方文件:https://portainer.readthedocs.io/en/stable/