iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 9
0
DevOps

Docker獸 究極進化 ~~ Kubernetes獸系列 第 9

Day-9 熟悉 Docker 進階功能

前言

此篇會將一些筆者覺得較為進階的Docker使用方式教給大家,或許有些技巧並不常用,但透過這些進階功能,能夠讓大家的容器化之路有更多的武器能夠使用。

Entrypoint vs CMD

雖說Day-5已經提及,但這邊還是在講述一次給大家知道。

CMD

cmd命令時所指定的參數,不能由Container啟動時執行的參數所替代。

若在Dockerfile中執行

CMD["Jack"]

此時我們啟動Container

$ docker run container echo Tim

這時在Container前台會輸出 echo Jack.

Entrypoint

Entrypoint所指定的參數,能經由Container啟動時執行的參數所替代。

ENTRYPOINT ["Jack"]

此時我們啟動Container

$ docker run container echo Tim

這時在Container前台會輸出 echo Tim.

Resources

Get all container status

docker stats

Limit CPU

-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

Limit memory

-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

Enter docker container

attach

若無服務在Container前台運行時,可以利用attach進入Container內

$ docker attach ironman

exec

若有服務在Container前台運行,則使用exec進入Container內

$ docker exec -it ironman bash

Remove wired images/containers

Remove none images

$ docker rmi $(docker images -a | awk '/^<none>/ { print $3 }')

這邊的print $3是指輸出image的ID,Image的Id為第三列。

Remove exited containers

$ docker rm $(docker ps -a | awk '/Exited/ { print $1 }')

這邊的print $1是指輸出container的ID,Container的id為第一列。

Remove unusage resources

$ docker system prune

See container logs

$ docker logs ironman

若想持續觀察,可以配合tail使用

$ docker logs ironman --tail=10 -f

Health Check

Sample Dockerfile

這邊我們寫一個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

Health Check arguments:

  • --interval: 兩次健康檢查之間的時間間隔,預設為30秒。
  • --timeout: 當健康檢查運行超過這時間,則本次檢查視為失敗。
  • --retries: 當健康檢查連續失敗次數多於retries時,則視為unhealth。

此外健康檢查與entrypoint相同,只能出現一次,若寫多個則只會支援最後一個健康檢查。

Testing

這邊我們先透過上面的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,請各位讀者期待。
https://ithelp.ithome.com.tw/upload/images/20200924/20129737aP6iH00088.png


上一篇
Day-8 解析 Docker Network
下一篇
Day-10 撰寫 Docker專用的Script
系列文
Docker獸 究極進化 ~~ Kubernetes獸30

尚未有邦友留言

立即登入留言