1. 程式人生 > >Docker之容器管理

Docker之容器管理

目錄

一、建立容器

使用 docker container run 命令建立容器,該命令有很多的選項,這些選項可以讓容器執行時具備我們想要的狀態。

$ docker container run --help

docker container run 常用選項:

OPTIONS DESCRIBE
-i,--interactive 互動式介面
-t,--tty 分配一個偽終端
-d,--detach 在後臺執行容器
-e,--env 設定環境變數
-p,--publish list 釋出容器埠到主機
-P,--publish-all 釋出容器所有EXPOSE的埠到主機的隨機埠
--name STRING 指定容器別名
-h,--hostname 設定容器主機名
--ip STRING 指定容器ip,只能用於自定義網路
--network 連線容器到一個網路
--mount mount 將檔案系統附加到容器
-v,--volume list 繫結掛載一個卷
--rm 當容器退出時自動移除它

Example:

建立一個 tomcat 容器,取名 tomcat_1,並放入後臺執行

$ docker container run --name tomcat_1 -d tomcat:7.0
154038abdd941bd62ae252fd814effc15e595a72fa900fb0a9fe13ea180caad5

列出當前正在跑的容器

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
154038abdd94        tomcat:7.0          "catalina.sh run"   56 seconds ago      Up 55 seconds       8080/tcp            tomcat_1

欄位說明:

CONTAINER ID:隨機生成的容器ID

IMAGE:該容器是基於哪個映象建立的

COMMAND:啟動容器執行的命令

CREATED:容器建立時間

STATUS:執行狀態

PORTS:容器監聽的埠

NAMES:該容器的名稱

指定容器名稱、主機名和設定環境變數:

$ docker container run -d --name tomcat_2 -e VAR="hello,world" -h tomcat_2.example.com tomcat:7.0
ba11428a6b30a6829cb096fc9019a82b9845016d51a1a8b56a3c9d7155f19b46

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ba11428a6b30        tomcat:7.0          "catalina.sh run"   32 seconds ago      Up 31 seconds       8080/tcp            tomcat_2
154038abdd94        tomcat:7.0          "catalina.sh run"   9 minutes ago       Up 9 minutes        8080/tcp            tomcat_1

進入容器 tomcat_2

$ docker container exec -it tomcat_2 /bin/bash

檢視變數VAR和主機名

[email protected]_2:/usr/local/tomcat# echo $VAR
hello,world

[email protected]_2:/usr/local/tomcat# hostname
tomcat_2.example.com

退出容器

Ctrl + p + q

建立一個容器 tomcat_3,從主機上暴露一個 8899埠 到容器的 8080埠,代表主機監聽 0.0.0.0 的 8899埠,將訪問這個埠的請求轉發到該容器的 8080埠

$ docker container run -d --name tomcat_3 -p 8899:8080 tomcat:7.0
6db0b5bb72c405d47a0dbf0d3c8f7c7676ad34b13a51ffc64fec05b74de5d02d

$ docker container ls
CONTAINER ID        IMAGE               COMMAND          CREATED             STATUS               PORTS                   NAMES
6db0b5bb72c4        tomcat:7.0       "catalina.sh run"   8 seconds ago      Up 7 seconds      0.0.0.0:8899->8080/tcp   tomcat_3
ba11428a6b30        tomcat:7.0          "catalina.sh run"   8 minutes ago       Up 8 minutes          8080/tcp                 tomcat_2
154038abdd94        tomcat:7.0          "catalina.sh run"   17 minutes ago      Up 17 minutes       8080/tcp                 tomcat_1

二、容器資源管理

容器是密集型的,啟動大量的容器,如果不對其進行資源限制,難免會因為某個容器佔用大量資源,導致宿主機資源耗盡。

資源限制常用選項:

OPTIONS DESCRIBE

-m,--memory

容器可以使用的最大記憶體
--memory-swap 允許交換到磁碟的記憶體量
--memory-swappiness  (0 to 100) (default -1) 容器使用Swap分割槽交換的百分比
--oom-kill-disable 禁用 OOM Killer
--cpus 可以使用的CPU數量
--cpuset-cpus  (0-3, 0,1) 限制容器使用的CPU核心
--cpu-shares CPU共享(相對權重)

Example:

限制容器最多使用500M記憶體和600M交換分割槽,並禁用OOM Killer。

$ docker container run -d --name nginx_1 --memory="500m" --memory-swap="600m" --oom-kill-disable nginx:1.14
b6321b45c90db555bb8df98b3c45a5aa7b89acff7e4f0e737c72171d4ffa1034

檢視 nginx_01 的記憶體限制及使用

$ docker stats --no-stream nginx_1 
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
b6321b45c90d        nginx_1             0.00%               2.594MiB / 500MiB   0.52%               648B / 0B           0B / 0B             2

允許容器最多可以使用兩個半的CPU

$ docker container run -d --name nginx_02 --cpus="2.5" nginx:1.14
d220b844a18466aff1f55ad9142fd87516f6d2a84ebbba56f894a83d82182369

允許容器最多使用50%的CPU

$ docker container run -d --name nginx_03 --cpus=".5" nginx:1.14
184f4e8277e612c791c84295bc3de021a0ea05b7153ba169cc068ec50b7bb68d

 建議設定 --memory 再禁用 OOM Killer,CPU使用率不超過 50%

三、資料管理

隨著容器刪除,容器裡產生的資料也會刪除,並且在容器裡操作的是最上層的可寫層,會經過儲存驅動管理,這種額外的抽象會降低效能。

容器的可寫層儲存資料,有一些缺陷:

當容器停止允許時,資料將不會持續存在,如果另一個程序需要這些資料,則很難將資料從容器中取出。並且容器刪除後,資料也會隨著刪除。容器的可寫層與容器允許的主機耦合度緊密,無法輕鬆地將資料移動到其它地方。容器的可寫層需要儲存驅動程式來管理檔案系統。儲存驅動程式使用Linux核心提供的聯合檔案系統,與直接在宿主機上寫入檔案相比,這種額外的抽象會降低效能。

(1)volumes:Docker管理宿主機檔案系統的一部分(/var/lib/docker/volumes/)。儲存資料的最佳方式。

(2)bind mounts:將宿主機上的任意位置的檔案或目錄掛載到容器中。

(3) tmpfs:掛載儲存在主機系統的記憶體中,而不會寫入主機的檔案系統。如果不希望將資料持久儲存在任何位置,可以使用tmpfs,同時避免寫入容器可寫層以提高效能。

1. volumes

特點:

  多個容器之間共享資料。

  當容器停止或被移除時,該卷依然存在。

  多個容器可以同時掛載相同的卷。

  當明確刪除卷時,卷才會被刪除。

$ docker volume --help

建立一個卷 nginx-vol

$ docker volume create nginx-vol

列出卷

$ docker volume ls
DRIVER              VOLUME NAME
local               nginx-vol

檢視卷的詳細資訊

$ docker volume inspect nginx-vol 
[
    {
        "CreatedAt": "2018-09-27T04:24:26+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data",
        "Name": "nginx-vol",
        "Options": {},
        "Scope": "local"
    }
]

允許容器時,使用上面建立的卷

$ docker container run -d --name nginx_04 -v nginx-vol:/usr/share/nginx/html nginx:1.14
6e80f1e4a5f99f9ff70eea842a00e7a7b73498b0ad0bdde9b42124b7da265032

進入容器 nginx_04,在 /usr/local/nginx/html 下建立一個測試檔案,然後在宿主機上 /var/lib/docker/volumes/ 目錄下進行檢視

$ docker container exec -it nginx_04 /bin/bash
[email protected]:/# echo "Hello,World!" > /usr/share/nginx/html/hello.txt

$ sudo cat /var/lib/docker/volumes/nginx-vol/_data/hello.txt
Hello,World!

移除卷,需要先停止容器,刪除容器,然後再移除卷

$ docker container stop nginx_04
$ docker container rm nginx_04
$ docker volume rm nginx-vol

也可以使用 nfs 共享儲存

$ docker volume create
    --driver local \
    --opt type=nfs \
    --opt o=addr=192.168.5.101,rw \
    --opt device=:/home/shares \
    nginx-vol

2. bind mounts

特點:

  從主機共享配置檔案到容器。

  在Docker主機上的開發環境和容器之間共享程式碼。

  當Docker主機的檔案或目錄結構保證與容器所需的繫結掛載一致時

在宿主機本地建立目錄,作為掛載源路徑

$ mkdir /home/qkc/www
$ echo 'How are you?' > /home/qkc/www/test.html

執行一個容器,掛載宿主機目錄。進入容器驗證。

注意:如果原始檔或目錄沒有存在,--mount 選項不會自動建立,而是會丟擲一個異常。

$ docker container run -d --name nginx_05 -v /home/qkc/www/:/usr/share/nginx/html nginx:1.14
58d7d1a821c5e43db31bad02dedf8c65d3bd83a064a7b9fecfeea7456ff5c907

$ docker exec -it nginx_05 /bin/bash
[email protected]:/# cat /usr/share/nginx/html/test.html 
How are you?

$ docker inspect -f '{{.Mounts}}' nginx_05
[{bind  /home/qkc/www /usr/share/nginx/html   true rprivate}]

清理

$ docker container stop nginx_05
$ docker container rm nginx_05

四、容器管理

$ docker container --help

常用命令:

OPTIONS DESCRIBE
ls [-a] 列出容器
inspect [-f] 檢視一個或多個容器詳細資訊
exec 在執行容器中執行命令
commit 建立一個新映象來自一個容器
cp 拷貝檔案或資料夾到一個容器
logs 獲取一個容器的日誌
port 列出或指定容器埠對映
top 顯示一個容器執行的程序
stats 顯示容器資源使用統計
stop/start/restart 停止/啟動/重啟一個或多個容器
rm 刪除一個或多個容器

列出當前正在執行的容器

$ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
038bc1d162df        nginx:1.14          "nginx -g 'daemon of…"   8 seconds ago       Up 6 seconds        0.0.0.0:8888->80/tcp   nginx_07

列出所有容器,包括已停止的

$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                  NAMES
038bc1d162df        nginx:1.14          "nginx -g 'daemon of…"   9 seconds ago       Up 7 seconds                0.0.0.0:8888->80/tcp   nginx_07
ccced98a1397        nginx:1.14          "nginx -g 'daemon of…"   About an hour ago   Exited (0) 45 minutes ago                          nginx_04

檢視容器詳細資訊  JSON格式

$ docker container inspect nginx_07

在容器裡執行命令

$ docker container exec nginx_07 hostname
038bc1d162df

進入容器終端

$ docker container exec -it nginx_07 /bin/bash
[email protected]:/#

拷貝檔案或目錄到容器

$ touch test.py
$ docker container cp ./test.py nginx_07:/tmp/
$ docker container exec nginx_07 ls /tmp/
test.py

檢視容器日誌

$ docker container inspect -f '{{.NetworkSettings.IPAddress}}' nginx_07
172.17.0.2
$ docker container logs nginx_07
192.168.5.1 - - [26/Sep/2018:22:02:04 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063" "-"

檢視容器埠對映

$ docker container port nginx_07
80/tcp -> 0.0.0.0:8888

顯示容器執行的程序

$ docker container top nginx_07 
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                2155                2139                0                   05:55               ?                   00:00:00            nginx: master process nginx -g daemon off;
101                 2189                2155                0                   05:55               ?                   00:00:00            nginx: worker process
root                2485                2139                0                   05:57               pts/0               00:00:00            /bin/bash

顯示容器資源統計

$ docker container stats --no-stream nginx_07 
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
038bc1d162df        nginx_07            0.00%               1.836MiB / 3.842GiB   0.05%               2.58kB / 2.02kB     18.1MB / 0B         3

$ docker container stats  nginx_07    # 動態生成

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
038bc1d162df        nginx_07            0.00%               1.836MiB / 3.842GiB   0.05%               2.58kB / 2.02kB     18.1MB / 0B         3

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
038bc1d162df        nginx_07            0.00%               1.836MiB / 3.842GiB   0.05%               2.58kB / 2.02kB     18.1MB / 0B         3

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
038bc1d162df        nginx_07            0.00%               1.836MiB / 3.842GiB   0.05%               2.58kB / 2.02kB     18.1MB / 0B         3

匯出本地容器,這樣將匯出容器快照到本地檔案

$ docker container export nginx_07 > nginx07.tar
$ ls nginx07.tar 
nginx07.tar

匯入容器,從容器快照檔案中再匯入映象

$ cat nginx07.tar | docker import  -  nginx:07
sha256:783dda08f8579c1f77b4447e1af10f9a23e0abcc15d61c7ba80469316d29eb20
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               07                  783dda08f857        4 seconds ago       107MB
tomcat              7.0                 372bd73e50e7        5 days ago          357MB
nginx               1.14                86898218889a        3 weeks ago         109MB

停止/啟動/刪除容器

$ docker container stop nginx_07 
$ docker container start nginx_07 
$ docker container stop nginx_07 
$ docker container rm nginx_07

五、容器網路

Docker支援五種網路模式

(1)bridge

  --net=bridge

  預設網路,Docker啟動後建立一個 docker0 網橋,預設建立的容器也是新增到這個網橋中。

(2)host

  --net=host

  容器不會獲得一個獨立的 network namespace,而是與宿主機共用一個。這就意味著容器不會有自己的網絡卡資訊,而是使用宿主機的。這個預設下,容器除了網路,其它都是隔離的。

(3)none

  --net=none

  獲取獨立的 network namespace,但不為容器進行任何網路配置,需要我們手動配置。

(4)container

 --net=container:Name/ID

  與指定的容器使用同一個 network namespace,具有同樣的網路配置資訊,兩個容器除了網路,其它都還是隔離的。

(5)自定義網路

  與預設的 bridge 原理一樣,但自定義網路具備內部 DNS 發現,可以通過容器名或者主機名容器之間網路通訊。

建立自定義網路,起兩個 busybox 容器都加入到該自定義網路中,驗證互相能夠解析

$ docker network create net_qkc
46cfda654093abdb11b450ffa096f7c474fde9f6729c09738e1c77161805da0e

$ docker run -d --name=c1 --net=net_qkc -it busybox:latest
$ docker run -d --name=c2 --net=net_qkc -it busybox:latest

$ docker exec c2 ping -c4 c1
PING c1 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.100 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.122 ms
64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.067 ms
64 bytes from 172.18.0.2: seq=3 ttl=64 time=0.101 ms

檢視指定網路的詳細資訊

$ docker network inspect net_qkc

容器網路訪問原理

Docker啟動後會建立一個 docker0 的網橋,當建立容器時,Docker 會使用 vethpair 建立一對虛擬網絡卡,一端放到新建立的容器中,並重命名 eth0,另一端放到宿主機上,以 veth+隨機7個字串命名,並將這個網路裝置加入到 docker0 網路中,網橋自動為容器分配一個 IP,並設定 docker0 的 IP 為容器預設閘道器。同時在 iptables 新增 SNAT 轉換網路段 IP 預設網段,以便容器訪問外網。

$ ip a | grep veth*
18: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-46cfda654093 state UP group default 
20: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-46cfda654093 state UP group default

iptables 規則

$ sudo iptables -t nat -vnL POSTROUTING
Chain POSTROUTING (policy ACCEPT 32 packets, 2090 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   12   664 MASQUERADE  all  --  *      !br-46cfda654093  172.18.0.0/16        0.0.0.0/0           
    0     0 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0

容器訪問外網時,資料包從容器 eth0 發出到 veth0,到達自己閘道器,也就是 docker0,到了主機走預設閘道器,匹配 iptables NAT 規則轉發,將資料包源 IP 地址轉換成 eth0 地址傳送出去。 

外部訪問容器時,資料包線到達宿主機,宿主機收到資料包後匹配 iptables NAT 規則轉發給 docker0,docker0根據基於 Mac地址轉發到 veth0 介面的另一端容器裡的 eth0,容器處理資料,處理結果原路返回。

相關推薦

docker容器管理常用命令篇

多個 filesyste 啟動 acc code ppi -- ike ces 常用命令如下表: 選項 描述 ls 列出容器 inspect 查看一個或多個容器詳細信息 exec 在運行容器中執行命令 commit 創建一個新鏡像來自一個容器 cp 拷貝

Docker容器管理

目錄 一、建立容器 使用 docker container run 命令建立容器,該命令有很多的選項,這些選項可以讓容器執行時具備我們想要的狀態。 $ docker container run --help docker container run

docker容器管理篇

error ats 無法 ofo 說明 label start pub new 一、創建容器常用選項 1.1常用選項如下表: 選項 描述 -i, --interactive 交互式 -t, --tty 分配一個偽終端 -d, --detach 運行容器到

docker容器網絡篇

支持 status tro afa 主機名 nta creat ipa idg 一、docker網絡模式 Docker支持五種網絡模式:A、bridge--net=bridge默認網絡,Docker啟動後創建一個docker0網橋,默認創建的容器也是添加到這個網橋中。B、h

Docker容器常見操作

some ports ctrl+ exec 信息 參數說明 守護 all -h 一、啟動容器 啟動容器有兩種方式,一種是基於鏡像新建一個容器並啟動,另外一個是將在終止狀態(stopped ) 的容器重新啟動。因為 Docker 的容器實在太輕量級了,很多時候用戶都是隨時刪除

Docker容器日期解決

    將業務應用製作成映象,以容器的方式執行之後,發現在容器中獲取的日期不是國內使用的東八區時間,這肯定不行的,應用與時間緊密相關,所以要解決這個問題。     由於我們的應用是基於Springboot的,所以通過Dockerfile的形式製作為映象。解決方法是在D

docker倉庫管理

倉庫認識 docker 倉庫,即所謂registry,實現了映象的管理、分發,同時還包括使用者的認證。dockerregistry倉庫是一個無狀態的、高可靠的伺服器應用程式,用來儲存docker映象。docker.io為docker官方的倉庫,預設所有的pull

Docker容器的基本操作

1.1.啟動容器 docker run IMAGE [COMMAND] [ARG...] 在新容器中執行命令 1.1.1.樣例 -輸出hello world www.0001.GA@gaoxinfu MINGW64 /d/Program Files/Docker Toolb

Docker映象管理及Dockerfile

目錄 映象:   1. 一個分層儲存的檔案:     優點:易於擴充套件、優化儲存空間   2. 一個軟體的環境   3. 一個映象可以用於建立多個容器   4. 一種標準化的交付 一、映象工作原理 映象不是一個單一的檔案,而是有多層構成。

docker容器訪問和網絡連接(三)

-name 應用容器 network http containe 地址 ins ODB names 前言 當一臺服務器上部署了多個應用容器,它們直接可能需要相互通信,比如web應用容器需要訪問mysql數據庫容器。 主機訪問容器 通過映射端口的形式我們可以在外部訪問容器內的

11、《每天5分鐘玩轉Docker容器技術》學習-Docker命令容器生命周期管理

hostman cloudman cloud openstack docker a) Docker create 命令docker create :創建一個新的容器但不啟動它docker create [OPTIONS] IMAGE [COMMAND] [ARG...]-a stdin:

docker數據管理與網絡通信數據卷與數據卷容器

file var 個數 exe 運行 roc 80端口 兩種 watermark 管理Docker容器中數據主要有兩種方式:數據卷和數據卷容器。 數據卷 數據卷是一個供容器使用的特殊目錄,位於容器中,可將宿主機的目錄掛載到數據卷上,雖對數據卷的修改操作立刻可見,並且更新數據

docker筆記初體驗(容器管理

容器基本操作: 建立一個容器 [[email protected] ~]# docker run -itd ubuntu 3635f4dd3ae30a4377fc4f2eafc191b7890bbe5873bb4e5f9e5077f794466ec4 檢視容器

Docker容器技術映象管理基礎(三)

上一篇文章連結:Docker容器技術基礎用法(二) 目錄   一、回顧 1.1docker容器的狀態 1.2docker容器管理時常用的命令 1.3docker的架構形式 二、About Docker Images 2.1 關於docker映象的作用

Docker搭建2048遊戲,四種網路模式的學習,容器管理,資料卷的管理,用Dockerfile建立映象

1.映象管理 物理機上: 軟體包: docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm docker-engine-selinux-17.03.1.ce-1.el7.centos.noarch.rpm [

docker一: 鏡像與容器管理

docker 鏡像 容器 Docker的優勢:1、啟動非常快,秒級實現。2、資源利用率高,在機器中以進程的方式存在,一臺機器可以跑上百個docker容器。3、創建和配置後可以在任意地方運行docker,只需將其上傳到docker倉庫,用到時拉下來就可以4、易遷移,平臺依賴性不強。Docker的主要

docker鏡像、容器管理

dockerDocker優勢1) 更高效的利用系統資源無論是應用執行速度、內存損耗或者文件存儲速度,都要比傳統虛擬機技術更高效。2)更快速的啟動時間Docker 容器應用,由於直接運行於宿主內核,無需啟動完整的操作系統,因此可以做到秒級、甚至毫秒級的啟動時間。3)一致的運行環境Docker 的鏡像提供了除內核

Docker容器管理

發送 停止 一段時間 一個 con doc 實現 ons style 創建容器:   docker create -it [NAME]:[TAG] 啟動容器:   docker start ID 創建並啟動容器:   docker run -it [NAME]:[TAG]

Docker(十二):Docker集群管理Compose

png eas version pull 是否 com a star reat volume 1、Compose安裝   curl -L https://github.com/docker/compose/releases/download/1.1.0/docker-com

Docker系列(三)容器管理

mozilla http 格式 file tor centos determine dia 進程 3.1 新建容器並啟動所需要的命令主要為docker run [root@localhost ~]# docker run centos /bin/echo "syavi