1. 程式人生 > 實用技巧 >Docker篇之docker容器

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 支援的容器操作子命令。