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

docker之容器管理篇

error ats 無法 ofo 說明 label start pub new

一、創建容器常用選項

1.1常用選項如下表:

選項 描述

-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   綁定掛載一個卷
--restart string    容器退出時重啟策略,默認no

1.2實例演示:

創建nginx容器:

[root@localhost ~]# docker container run -d nginx
Unable to find image ‘nginx:latest‘ locally
latest: Pulling from library/nginx
be8881be8156: Pull complete 
32d9726baeef: Pull complete 
87e5e6f71297: Pull complete 
Digest: sha256:6ae5dd1664d46b98257382fd91b50e332da989059482e2944aaa41ae6cf8043a
Status: Downloaded newer image for nginx:latest
e7155844c2a27d9a9beb52307fba95c63fbaeec4aa8adaecc8e30c6968209e9c

列出當前正在運行的容器:

[root@localhost ~]# docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
e7155844c2a2        nginx               "nginx -g ‘daemon of…"   4 minutes ago       Up 4 minutes        80/tcp              priceless_jones

字段說明:

CONTAINER ID - 隨機生成的容器ID
IMAGE - 基於哪個鏡像創建的
COMMAND - 啟動容器運行的命令
CREATED - 創建時間
STATUS - 運行狀態

列出所有容器,包括已停止的:
[root@localhost ~]# docker container ls -a

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

[root@localhost ~]# docker container run -d --name nginx01 -e TEST=123 -h nginx01 nginx
dd29208fbfd70eec6797d523a4ef8436ebd6f6818d89c139a949f15fafabc38c
[root@localhost ~]# 
[root@localhost ~]# docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
dd29208fbfd7        nginx               "nginx -g ‘daemon of…"   13 seconds ago      Up 12 seconds       80/tcp              nginx01
e7155844c2a2        nginx               "nginx -g ‘daemon of…"   8 minutes ago       Up 8 minutes        80/tcp              priceless_jones
[root@localhost ~]# 

[root@localhost ~]# docker container exec -it nginx01 bash
root@nginx01:/# 
root@nginx01:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@nginx01:/# echo $TEST
123

容器創建了,怎麽讓用戶訪問呢?那就用到-p選項了,從宿主機暴露一個端口到容器:

[root@localhost ~]# docker container run -d --name nginx02 -p 88:80 nginx 
a5e10362acc39efcdd8d3dccdca0b8ae8dd1bb824c259a3ebada70ec73b8b6e4
[root@localhost ~]# 

[root@localhost ~]# docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
a5e10362acc3        nginx               "nginx -g ‘daemon of…"   18 seconds ago      Up 17 seconds       0.0.0.0:88->80/tcp   nginx02
dd29208fbfd7        nginx               "nginx -g ‘daemon of…"   4 minutes ago       Up 4 minutes        80/tcp               nginx01
e7155844c2a2        nginx               "nginx -g ‘daemon of…"   12 minutes ago      Up 12 minutes       80/tcp               priceless_jones
[root@localhost ~]# 

此時多個一個PORTS字段,代表宿主機監聽0.0.0.0的88端口,轉發到該容器80端口。
打開瀏覽器輸入:http://宿主機IP:88

下面設置允許容器nginx03最多使用50M內存和30M的SWAP,並禁用OOM Killer

[root@localhost ~]# docker container run -d --name nginx03 --memory="50m" --memory-swap="80m" --oom-kill-disable nginx
8cb80b28450d05e1e3cd5437b73bb791daa6603412961fb6da55b78f66d69ad7
[root@localhost ~]# 

開啟,關閉,重啟,刪除容器:

[root@localhost ~]# docker container stop  nginx03
停止容器nginx03
[root@localhost ~]# docker container start  nginx03
重啟容器
[root@localhost ~]# docker container restart  nginx03

刪除一個容器:
[root@localhost ~]# docker container rm nginx03
Error response from daemon: You cannot remove a running container 8cb80b28450d05e1e3cd5437b73bb791daa6603412961fb6da55b78f66d69ad7. Stop the container before attempting removal or force remove
[root@localhost ~]# 

[root@localhost ~]# docker  stop nginx03
nginx03
[root@localhost ~]# docker container rm nginx03
nginx03

使用 docker stats 查看當前容器內存限制及使用:

[root@localhost ~]# docker stats --no-stream nginx03
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
8cb80b28450d        nginx03             0.00%               3.98MiB / 50MiB     7.96%               648B / 0B           0B / 0B             0
[root@localhost ~]# 
[root@localhost ~]# docker stats nginx02

查看nginx02容器的實時的內存,網絡I/O CPU, 磁盤IO的使用情況
CPU限額:
允許容器最多可以使用一個半的CPU:

docker container run -d --name nginx01 --cpus=".5"  --memory="50m" --memory-swap="80m" --oom-kill-disable nginx

建議:設置-memory再禁用OOM Killer,CPU使用不超過50%。

2、管理應用程序數據

前面講到過容器刪除,容器裏產生的數據也會刪除,並且在容器裏操作是在可寫層,會經過存儲驅動管理,這種額外的抽象會降低性能。
容器的可寫層存儲數據,有一些缺點:

A、當容器停止運行時,數據將不會持續存在,如果另一個進程需要這些數據,則很難將數據從容器中取出。並且容器刪除後,數據也會隨著刪除。
B、容器的可寫層與容器運行的宿主機緊密耦合,無法輕松地將數據移動到其他地方。
C、容器的可寫層需要存儲驅動程序來管理文件系統。存儲驅動程序使用Linux內核提供的聯合文件系統,與直接在宿主機上寫入文件相比,這種額外的抽象會降低性能。
Docker提供三種方式將數據從宿主機掛載到容器中:
D、volumes:Docker管理宿主機文件系統的一部分(/var/lib/docker/volumes)。保存數據的最佳方式。
E、bind mounts:將宿主機上的任意位置的文件或者目錄掛載到容器中。
F、 tmpfs:掛載存儲在主機系統的內存中,而不會寫入主機的文件系統。如果不希望將數據持久存儲在任何位置,可以使用tmpfs,同時避免寫入容器可寫層提高性能。

2.1 volumes

特點:
A、多個運行容器之間共享數據。
B、當容器停止或被移除時,該卷依然存在。
C、多個容器可以同時掛載相同的卷。
D、當明確刪除卷時,卷才會被刪除。

管理卷:

[root@localhost ~]# docker volume create nginx-vol
nginx-vol

[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               nginx-vol
[root@localhost ~]# docker volume inspect nginx-vol
[
    {
        "CreatedAt": "2018-08-05T05:05:51+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data",
        "Name": "nginx-vol",
        "Options": {},
        "Scope": "local"
    }
]

[root@localhost ~]# cd /var/lib/docker/volumes/nginx-vol/_data
[root@localhost _data]# ls

運行一個容器使用上面創建的卷:

[root@localhost _data]# docker container run -d --name=nginx-vol --mount source=nginx-vol,destination=/usr/share/nginx/html nginx
7587ed948f95eb885a2bd5e2739da2d7e767e0efed01d9c69685ce4b83521c7b

[root@localhost _data]#  ls /var/lib/docker/volumes/nginx-vol/_data
50x.html  index.html

[root@localhost _data]# docker container exec -it nginx-vol bash
root@7587ed948f95:/# 
root@7587ed948f95:/# cd /usr/share/nginx/html
root@7587ed948f95:/usr/share/nginx/html# ls
50x.html  index.html
root@7587ed948f95:/usr/share/nginx/html# pwd
/usr/share/nginx/html

可以看到容器中的數據已經存儲到了nginx-vol數據卷中:
註:-v選項在早期Docker版本已經支持,而--mount是在17 CE版本後才引入的選項,初學者建議使用--mount。

清理:

[root@localhost _data]# docker container stop nginx-vol
nginx-vol
[root@localhost _data]# docker container rm nginx-vol
nginx-vol
[root@localhost _data]# docker volume rm nginx-vol
nginx-vol
[root@localhost _data]# docker volume ls
DRIVER              VOLUME NAME

docker之容器管理篇