Docker篇之docker容器
前言:什麼是容器¿
什麼是容器¿
容器,是Docker的另一個核心概念,簡單來說,容器是執行在映象之上的,基於映象而執行的。映象是隻讀的,無法進行修改的,但是我們可以在容器中,基於映象,來進行操作。
一、建立容器
1.建立容器(create)
首先我們先來看一下命令格式:
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
用上一節的映象來建立個容器試一下
[root@localhost ~]# docker create -it newnginx:newtar
404aba21efb67897b4d298678573effc1705f7953c31a7d54b8209fd6e4e27da
使用create創建出來的容器是處於暫停狀態下的,可以使用docker start來啟動,這個命令後面會說。
容器可以說是整個Docker技術棧的核心, 所以建立命令create已經後面的run命令支援的選項非常之多,需要在實踐中慢慢實踐。我們可以用docker create --help 或者 docker run --help來檢視詳細介紹。在這裡我貼幾張中文對照圖供大家檢視。
(1)create與容器執行模式相關的選項
(2)create與容器環境和配置相關的選項
(3)create 與容器資源限制和安全保護相關的選項
2.啟動容器(start)
命令格式:
docker start [OPTIONS] CONTAINER [CONTAINER...]
通過容器的CONTAINER ID來控制的,現在我們來啟動一下剛才建立的容器。
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
404aba21efb6 newnginx:newtar "/docker-entrypoint.…" 37 minutes ago Created elated_booth
[root@localhost ~]# docker start 404
404
這是我們通過docker ps命令檢視到執行的容器,具體命令後面會講。
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
404aba21efb6 newnginx:newtar "/docker-entrypoint.…" 38 minutes ago Up 39 seconds 80/tcp elated_booth
3.建立並新建容器(run)
建立容器除了可以用create命令外,還可以使用run命令,等同於先create然後在start。
命令格式:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
具體的OPTIONS選項可以用docker run --help來檢視,這裡先說下常用的,像埠對映之類的後期會有介紹,這裡暫不贅述,一步一步來。
-i:讓容器的標準輸入保持開啟
-t:讓 Docker 分配一個偽終端並繫結到容器的標準輸入上
-d: 讓Docker 容器在後臺以守護態形式執行。
4.檢視容器輸出(logs)
命令格式:
docker logs [OPTIONS] CONTAINER
具體可以用docker logs --help檢視,這裡不做解釋。
二、停止容器
1.暫停容器(pause)
格式:
docker pause CONTAINER [CONTAINER...]
暫停上邊建立的容器,並檢視。
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
404aba21efb6 newnginx:newtar "/docker-entrypoint.…" About an hour ago Up 41 minutes 80/tcp elated_booth
[root@localhost ~]# docker pause 40
40
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
404aba21efb6 newnginx:newtar "/docker-entrypoint.…" About an hour ago Up 41 minutes (Paused) 80/tcp elated_booth
位於Paused狀態下的容器,可以用unpause來恢復到執行狀態,格式為
docker unpause CONTAINER [CONTAINER...]
2.終止容器(stop)
格式:
docker stop [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS選項:
-t:等待t秒後在關閉容器,預設10秒
此外,還可以用kill來強行終止容器,格式如下:
docker kill [OPTIONS] CONTAINER [CONTAINER...]
處於終止狀態下的容器,可以用docker start來開啟;也可以使用docker restart來進行重啟容器。
3.進入容器(attach|exec)
上面說過,建立啟動容器時,如果用了-d選項,那麼容器會在後臺執行,既沒有輸出也無法操作。這時候有兩個命令可以讓我們進入容器。那就是attach和exec命令。
(1)attach命令格式:
docker attach [OPTIONS] CONTAINER
Options:
–detach-keys string :指定退出 attach 模式的快捷鍵序列, 預設是 CTRL-P-Q
–no-stdin 是否關閉標準輸入,預設是保持開啟
–sig-proxy 是否代理收到的系統訊號給應用程序,預設為 true
這裡來測試下命令的使用
[root@localhost ~]# docker pull centos:centos7.3.1611 #下載了一個centos的映象
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
newnginx newtar 4bb46517cac3 3 weeks ago 133MB
nginx 1.19.2 4bb46517cac3 3 weeks ago 133MB
centos centos7.3.1611 c5d48e81b986 18 months ago 192MB
[root@localhost ~]# docker run -itd c5 #通過這個映象建立了一個容器
f19e2a048673c997fff2353ba26298665b978988873c159337c20121430d5c1d
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f19e2a048673 c5 "/bin/bash" 6 seconds ago Up 5 seconds naughty_khorana
[root@localhost ~]# docker attach f1
[root@f19e2a048673 /]#
不過attach也有不便之處,就是如果你開多個視窗並同時attach到同一個容器時,所有視窗都會同步顯示;當某一個視窗因命令阻塞時,其他視窗也無法執行操作。
(2)exec命令格式:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
OPTIONS:
-d, --detach 在容器中後臺執行命令;
–detach-keys string 指定將容器切回後臺的按鍵;
-e, --env list :指定環境變數列表
-i, --interactive 開啟標準輸入接受使用者輸入命令, 預設值為false;
–privileged 是否給執行命令以高許可權,預設值為 false
-t, --tty 分配偽終端,預設值為 false;
-u, --user string :執行命令的使用者名稱或 ID
-w, --workdir string 容器內的工作目錄
通過指定 it 引數來保持標準輸入開啟,並 且分配 一個偽終端 通過 ec 命令對容器執行操作是最為推薦的方式
4.刪除容器(rm)
格式:
docker rm [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS:
-f, --force: 是否強行終止並刪除一個執行中的容器,預設否
-l, --link:刪除容器的連線 ,但保留容器;
-v, --volumes:刪除容器掛載的資料卷
預設情況docker rm
下無法在容器執行的狀態下進行容器的刪除,新增-f
選項後會先發送SIGKILL訊號給容器,終止其內的應用,然後在強行刪除。
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f19e2a048673 c5 "/bin/bash" 30 minutes ago Up 30 minutes naughty_khorana
0ab0bc5b18f1 c5 "/bin/bash" 31 minutes ago Up 31 minutes modest_easley
f758e99d39a1 4bb "/docker-entrypoint.…" 40 minutes ago Up 40 minutes 80/tcp gracious_nobel
404aba21efb6 newnginx:newtar "/docker-entrypoint.…" 3 hours ago Up 2 hours 80/tcp elated_booth
[root@localhost ~]# docker rm -f 0ab0bc5b18f1 #強制刪除0ab0bc5b18f1容器
0ab0bc5b18f1
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f19e2a048673 c5 "/bin/bash" 31 minutes ago Up 31 minutes naughty_khorana
f758e99d39a1 4bb "/docker-entrypoint.…" 40 minutes ago Up 40 minutes 80/tcp gracious_nobel
404aba21efb6 newnginx:newtar "/docker-entrypoint.…" 3 hours ago Up 2 hours 80/tcp elated_booth
5.匯出匯入容器(export、import)
(1)匯出容器
官方的解釋是這樣的:將容器的檔案系統匯出為tar存檔。
命令格式:
docker export [OPTIONS] CONTAINER
Options:
-o, --output string 指定匯出的tar檔名
(2)匯入容器
命令格式:
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
Options:
-c, --change list 在匯入的同時執行對容器進行修改的 Dockerfile(可用於建立映象的檔案,後續文章會介紹)
-m, --message string 為匯入的映像設定提交訊息
–platform string 如果伺服器支援多平臺,則設定平臺
6.檢視容器(ps,top,inspet…)
(1)檢視容器詳情
檢視某容器的具體資訊,會以 json 格式返回包括容器 Id 建立時間、路徑、狀態、映象、配置等在內的各項資訊,
命令格式:
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
(2)檢視容器內程序
打印出容器內的程序資訊,包括 PID、使用者、時間、命令等 例如,檢視某容器內的程序資訊。
命令格式:
docker top CONTAINER [ps OPTIONS]
(3)檢視統計資訊
顯示 CPU 、記憶體、儲存、網路等使用情況的統計資訊
格式:
docker stats [OPTIONS] [CONTAINER...]
Options:
-a, --all: 輸出所有容器統計資訊,預設僅在執行中;
–format string :格式化輸出資訊;
–no-stream :不持續輸出,預設會自動更新持續實時結果;
–no-trunc :不截斷輸出資訊
(4)列出容器
命令格式:
docker ps [OPTIONS]
可用引數:
-a, --all 檢視所有
-f, --filter filter Filter output based on conditions provided
–format string Pretty-print containers using a Go template
-n, --last int 顯示最後建立的n個容器(-1是顯示所有)
-l, --latest 顯示最後建立的那個容器
–no-trunc Don’t truncate output
-q, --quiet 只輸出容器ID
-s, --size 顯示容器檔案大小
7.其他容器命令
(1)複製檔案cp
容器支援與主機之間複製檔案,命令格式如下:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
Options:
-a, --archive:打包模式,複製檔案會帶有原始的 uid/gid 資訊;
-L, --follow-link:跟隨軟連線。當原路徑為軟連線時,預設只複製連結資訊,使用該選項會複製連結的目標內容。
例:複製本地下app資料夾到容器的/tmp目錄下
[root@localhost ~]# docker cp app f1:/tmp
[root@localhost ~]# docker attach f1
[root@f19e2a048673 /]# ls tmp/
app ks-script-LRoSA2 yum.log
[root@f19e2a048673 /]#
*2.檢視容器內變化diff
用於檢查容器內的檔案或目錄的更改,格式為:
docker diff CONTAINER
例如檢視下f1容器下的變化
[root@localhost ~]# docker diff f1
C /tmp
A /tmp/app
3.列出容器的埠對映或特定對映port
格式:
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
官方解釋道,
docker port
至少需要1個引數,最多2個引數。
4.更新容器配置update
格式:
docker update [OPTIONS] CONTAINER [CONTAINER...]
Options:
–blkio-weight uint16:更新塊 IO 限制, 10~1000 ,預設值為0,代表著無限制;
–cpu-period int :限制 CPU 排程器 CFS (Completely Fair Scheduler )使用時間,
單位為微秒,最小 1000;
–cpu-quota int 限制CPU CFS(完全公平排程程式)配額
–cpu-rt-period int 以微秒為單位限制CPU的實時週期
–cpu-rt-runtime int 以微秒為單位限制CPU實時執行時間
-c, --cpu-shares int CPU份額(相對權重)
–cpus decimal CPU數量
–cpuset-cpus string -允許執行的CPU(0-3,0,1)
–cpuset-mems string 允許執行的MEMs(0-3,0,1)
–kernel-memory bytes 核心記憶體限制
-m, --memory bytes 記憶體限制
–memory-reservation bytes 記憶體軟限制
–memory-swap bytes: 交換限制等於記憶體加交換:’-1’以啟用無限制交換
–pids-limit int:調整容器pids限制(設定-1表示無限制)
–restart string:容器退出後的重啟策略
總結
容器是直接提供應用服務的元件,也是 Docker 整個技術核中最為核心的概念 圍繞容
器, Docker 提供了十分豐富的操作命令,允許使用者高效地管理容器的整個生命週期 。大家可以使用 docker help 令檢視 Docker 支援的容器操作子命令。