docker之容器管理篇
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之容器管理篇