日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

从一个实例,一窥docker进程管理

發布時間:2025/3/21 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从一个实例,一窥docker进程管理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在Docker中,進程管理的基礎是Linux內核的PID命名空間技術。在不同的PID命名空間下,可以有相同的PID。

Linux內核為所有的PID命名空間維護了一個樹狀的數據結構,最頂層是系統初始化時創建的root namespace(根命名空間), 父節點可以看到子節點中的進程,并可以通過信號等方式對子節點中的進程產生影響。反過來,子節點不能看到父節點名空間中的任何內容,也不可能通過kill或ptrace影響父節點或其他名空間中的進程。

在docker中有一個很特殊的進程——PID為1的進程,這也是docker的主進程,通過Dockerfile中的 ENTRYPOINT 和/或 CMD指令指定。當主進程退出的時候,容器所擁有的PIG命名空間就會被銷毀,容器的生命周期也會結束docker最佳實踐建議的是一個container一個service,并不強制要你一個container一個線程。有的服務,會催生更多的子進程,比如Apache和uwsgi,這是完全OK的。

PID1進程需要對自己創建的子進程負責,當主進程沒有設計好,不能優雅地讓子進程退出,就會照成很多問題,比如數據庫container,如果處理數據的進程沒有優雅地退出,可能會照成數據丟失。如果很不幸,你的主進程就是這種管理不了子進程的那種,docker提供了一個小工具,幫助你來完成這部分內容。你只需要在run創建container的時候提供一個—init flag就行,docker就會手動為你處理好這些問題。

來看一個實例

在docker中,對于CMD和 ENTRYPOINT,支持兩種進程執行方式:exec和shell。

shell的格式是:

CMD "executable param1 param2" 復制代碼

最終PID1進程將是: /bin/sh -c ”executable param1 param2”

Exec的格式是:

CMD ["executable","param1","param2"] 復制代碼

最終的PID1進程是: executable param1 param2

現在有兩個鏡像,Dockerfile分別如下:

  • 鏡像redis:shell
FROM ubuntu:14.04 RUN apt-get update && apt-get -y install redis-server && rm -rf /var/lib/apt/lists/* EXPOSE 6379 CMD "/usr/bin/redis-server" 復制代碼
  • 鏡像redis:exec
FROM ubuntu:14.04 RUN apt-get update && apt-get -y install redis-server && rm -rf /var/lib/apt/lists/* EXPOSE 6379 CMD ["/usr/bin/redis-server"] 復制代碼docker run -d --name myredis1 redis:shell docker run -d --name myredis2 redis:exec 復制代碼

那個docker鏡像更好一點呢?

我們前面講過,PID1進程(主進程)需要對自己的子進程負責,對于redis:shell,它產生的PID1進程是

/bin/sh -c "/usr/bin/redis-server" 復制代碼

也就是說,是/bin/sh這個進程,不是/usr/bin/redis-server!/usr/bin/redis-server只是它創建的一個子進程!

執行命令

docker exec myredis1 ps -ef 復制代碼

可以驗證這種猜測

通過exec方式運行的container的主進程則是我們所期望的。

你可能會覺得,這有什么大不了的呢,問題出現當我們停止container的時候。

停止redis:shell

docker stop myredis1 docker logs myredis1 復制代碼

Stop的時候,docker明顯停頓了一段時間,而且查看日志可以看出,redis沒有做任何保存數據庫的操作,直接被強制退出了。這期間發生了什么?首先,運行stop命令會向容器發送 SIGTERM信號,告訴主進程:你該退出了,感覺收拾收拾。但是,這里的主進程是/bin/sh啊,它怎么可能會有處理redis進程退出的機制?所以redis進程不會馬上退出。 Docker Daemon等待一段時間之后(默認是10s),發現容器還沒有完全退出,這時候就會發送 SIGKILL,將容器強行殺死。在這過程中,redis進程完全不知道自己該退出了,所以他沒有做任何收尾的工作。

停止redis:exec

docker stop myredis2 docker logs myredis2 復制代碼

這一次stop的時候是立即生效了,沒有卡頓延遲現象,從輸出來看,redis進行了shutdown的操作,把該持久化的數據都保存到磁盤了。因為這時候的PID1進程是

/usr/bin/redis-server 復制代碼

它是能夠正確處理SIGTERM信號的。這才是我們所期望的。

總結一下

Docker的主進程(PID1進程)是一個很特殊的存在,它的生命周期就是docker container的生命周期,它得對產生的子進程負責,在寫Dockerfile的時候,務必明確PID1進程是什么。

關注我的微信公眾號

總結

以上是生活随笔為你收集整理的从一个实例,一窥docker进程管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 四虎在线免费观看视频 | 亚洲精品乱 | 国产在线青青草 | 成人区人妻精品一熟女 | 人妻一区二区在线 | 手机看片久久 | 亚洲毛片在线免费观看 | 丁香花高清在线观看完整动漫 | 亚洲爽爽爽 | 天天拍天天操 | 又大又长粗又爽又黄少妇视频 | 免费毛片一区二区三区久久久 | 亚洲九九 | 午夜伊人网 | 美女试爆场恐怖电影在线观看 | 精久久久久久久 | 亚洲一区精品视频 | 91二区| 91欧美激情一区二区三区 | 熟妇高潮一区二区三区在线播放 | 成人动漫在线观看视频 | 久久视 | 亚洲熟妇av日韩熟妇在线 | 精品一二三区久久aaa片 | 琪琪秋霞午夜被窝电影网 | 先锋资源一区二区 | 欧亚一区二区三区 | 男人添女人荫蒂国产 | 熟女俱乐部一区二区视频在线 | 青草精品在线 | 日本一区二区三区在线观看 | 岛国一区二区三区 | 岛国片在线免费观看 | 色天天综合 | 免费在线观看一区二区三区 | 欧美黄色录像视频 | 国产精品视频看看 | 性欧美在线观看 | 日韩在线免费视频 | 欧美巨大另类极品videosbest | 五月激情综合婷婷 | 中文字幕一区二区三区免费视频 | 厕拍极品| 一道本在线观看 | 69视频一区二区三区 | 大尺度激情吻胸视频 | 国产区视频在线观看 | 国产无遮挡又黄又爽在线观看 | 国产只有精品 | 高清亚洲 | 亚洲高清资源 | 性生活视频在线播放 | 一级高清毛片 | 国产精品久久久久久久成人午夜 | 国内自拍欧美 | 日韩一区二区不卡视频 | 色肉色伦交av色肉色伦 | 日韩免费观看一区二区 | 久久久成人精品视频 | 黄色精品一区二区 | 污黄网站在线观看 | 中文字幕一区二区久久人妻网站 | 欧美日韩中文在线观看 | 啪啪免费网址 | 在线视频二区 | 在线1区 | 四十路av| 国产欧美日韩二区 | 国产不卡在线观看 | 91免费福利 | 国产欧美中文字幕 | 欧美精品在线免费观看 | 在线色播 | 一本久道久久 | 精品人妻久久久久一区二区三区 | 亚洲高清视频一区二区 | 国产精品自拍在线 | 美女xx00 | 日韩av免费一区 | 精品无码一区二区三区 | 国产5区| 五月天av在线| 性福网站| 日本公与丰满熄 | 欧美伦理片网站 | 极品少妇在线 | 秋霞欧美一区二区三区视频免费 | av动漫免费看 | 激情综合网五月激情 | 九色91丨porny丨丝袜 | 高清欧美精品xxxxx在线看 | 日韩国产第一页 | 毛片网站在线看 | 口爆吞精一区二区三区 | 人物动物互动39集免费观看 | 欧美色图亚洲视频 | 日本一区二区久久 | 亚洲国产精品视频一区二区 | 91精品视频在线 |