此篇會將一些筆者覺得較為進階的Docker使用方式教給大家,或許有些技巧並不常用,但透過這些進階功能,能夠讓大家的容器化之路有更多的武器能夠使用。
雖說Day-5已經提及,但這邊還是在講述一次給大家知道。
cmd命令時所指定的參數,不能由Container啟動時執行的參數所替代。
若在Dockerfile中執行
CMD["Jack"]
此時我們啟動Container
$ docker run container echo Tim
這時在Container前台會輸出 echo Jack.
Entrypoint所指定的參數,能經由Container啟動時執行的參數所替代。
ENTRYPOINT ["Jack"]
此時我們啟動Container
$ docker run container echo Tim
這時在Container前台會輸出 echo Tim.
docker stats
-c / —cpus
原本預設值為1024, 這裡512指的是相對值,佔用主機一半cpu資源
$ docker run --name ironman -d -c 512 -p 8100:8100 ghjjhg567/ironman:latest
這邊則是指的是使用幾cpu
$ docker run --name ironman -d --cpus 2 -p 8100:8100 ghjjhg567/ironman:latest
-m
$ docker run --name ironman -d -m 1024m -p 8100:8100 ghjjhg567/ironman:latest
雖然我們限制設為1G, 但實際上容器超出限制一倍,也就是2G時,docker daemon才會強制關閉容器。
若想直接指定Container內存時,則使用下面指令
$ docker run --name ironman -d -m 1024m --memory-swap 1024m -p 8100:8100 ghjjhg567/ironman:latest
若無服務在Container前台運行時,可以利用attach進入Container內
$ docker attach ironman
若有服務在Container前台運行,則使用exec進入Container內
$ docker exec -it ironman bash
$ docker rmi $(docker images -a | awk '/^<none>/ { print $3 }')
這邊的print $3是指輸出image的ID,Image的Id為第三列。
$ docker rm $(docker ps -a | awk '/Exited/ { print $1 }')
這邊的print $1是指輸出container的ID,Container的id為第一列。
$ docker system prune
$ docker logs ironman
若想持續觀察,可以配合tail使用
$ docker logs ironman --tail=10 -f
這邊我們寫一個Dockerfile,From nignx並幫他安裝curl,用來進行Health check。
/ironman_2020/nginx/Dockerfile
FROM nginx
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
HEALTHCHECK --interval=5s --timeout=3s \
CMD curl -fs http://localhost/ || exit 1
此外健康檢查與entrypoint相同,只能出現一次,若寫多個則只會支援最後一個健康檢查。
這邊我們先透過上面的Dockerfile建立image。
$ docker build -t nginx_curl -f nginx/Dockerfile .
再來則是創建並啟動該container
$ docker run -d --name nginx -p 80:80 nginx_curl
b68c2bb00e0bb8f86eafa67dcfd73e803774bd76af3a36605ef22bd4ef6c1fd7
那這時候能透過docker cli看到該container狀態
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b68c2bb00e0b nginx_curl "nginx -g 'daemon of…" 10 seconds ago Up 10 seconds (healthy) 0.0.0.0:80->80/tcp nginx
透過inspect更能看到每次health check的log
$ docker inspect nginx
[
{
"Id": "b68c2bb00e0bb8f86eafa67dcfd73e803774bd76af3a36605ef22bd4ef6c1fd7",
"Created": "2020-09-23T11:59:38.3687223Z",
"Path": "nginx",
"Args": [
"-g",
"daemon off;"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 14417,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-09-23T11:59:38.7072088Z",
"FinishedAt": "0001-01-01T00:00:00Z",
"Health": {
"Status": "healthy",
"FailingStreak": 0,
"Log": [
{
"Start": "2020-09-23T12:07:03.6173236Z",
"End": "2020-09-23T12:07:03.7313876Z",
"ExitCode": 0,
"Output": "<!DOCTYPE html>\n<html>\n<head>\n<title>Welcome to nginx!</title>\n<style>\n body {\n width: 35em;\n margin: 0 auto;\n font-family: Tahoma, Verdana, Arial, sans-serif;\n }\n</style>\n</head>\n<body>\n<h1>Welcome to nginx!</h1>\n<p>If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.</p>\n\n<p>For online documentation and support please refer to\n<a href=\"http://nginx.org/\">nginx.org</a>.<br/>\nCommercial support is available at\n<a href=\"http://nginx.com/\">nginx.com</a>.</p>\n\n<p><em>Thank you for using nginx.</em></p>\n</body>\n</html>\n"
},
{
"Start": "2020-09-23T12:07:08.7082906Z",
"End": "2020-09-23T12:07:08.8826371Z",
"ExitCode": 0,
"Output": "<!DOCTYPE html>\n<html>\n<head>\n<title>Welcome to nginx!</title>\n<style>\n body {\n width: 35em;\n margin: 0 auto;\n font-family: Tahoma, Verdana, Arial, sans-serif;\n }\n</style>\n</head>\n<body>\n<h1>Welcome to nginx!</h1>\n<p>If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.</p>\n\n<p>For online documentation and support please refer to\n<a href=\"http://nginx.org/\">nginx.org</a>.<br/>\nCommercial support is available at\n<a href=\"http://nginx.com/\">nginx.com</a>.</p>\n\n<p><em>Thank you for using nginx.</em></p>\n</body>\n</html>\n"
},
....etc
這章節學了許許多多進階的docker 技巧,那在下一章節則會介紹如何使用script啟動繁瑣的docker containers,請各位讀者期待。