Docker問答錄系列——Docker引擎相關問題(一)

2021-02-13 奇妙的Linux世界
本系列文章總結了一些初學Docker時比較常見問題的解決方法,解決思路大多遵循Docker官方的最佳實踐的原則而進行的解答。文中內容絕對乾貨,強烈學習Docker的讀者一讀!本次主要介紹Docker引擎基礎概念相關方面的一些問題。
Docker引擎相關問題
宿主如果和容器系統不同的話,那不是和虛擬機一樣,一層層的調用,那麼 Docker 和虛擬機還有什麼差別? 

要把 Windows 和 Linux 分清楚,更要把內核(kernel)和用戶空間(userland)分清楚。

容器內的進程是直接運行於宿主內核的,這點和宿主進程一致,只是容器的 userland 不同,容器的 userland 由容器鏡像提供,也就是說鏡像提供了 rootfs。

假設宿主是 Ubuntu,容器是 CentOS。CentOS 容器中的進程會直接向 Ubuntu 宿主內核發送 syscall,而不會直接或間接的使用任何 Ubuntu 的 userland 的庫。

這點和虛擬機有本質的不同,虛擬機是虛擬環境,在現有系統上虛擬一套物理設備,然後在虛擬環境內運行一個虛擬環境的作業系統內核,在內核之上再跑完整系統,並在裡面調用進程。

還以上面的例子去考慮,虛擬機中,CentOS 的進程發送 syscall 內核調用,該請求會被虛擬機內的 CentOS 的內核接到,然後 CentOS 內核訪問虛擬硬體時,由虛擬機的服務軟體截獲,並使用宿主系統,也就是 Ubuntu 的內核及 userland 的庫去執行。

而且,Linux 和 Windows 在這點上非常不同。Linux 的進程是直接發 syscall 的,而 Windows 則把 syscall 隱藏於一層層的 DLL 服務之後,因此 Windows 的任何一個進程如果要執行,不僅僅需要 Windows 內核,還需要一群服務來支撐,所以如果 Windows 要實現類似的機制,容器內將不會像 Linux 這樣輕量級,而是非常臃腫。看一下微軟移植的 Docker 就非常清楚了。

所以不要把 Docker 和虛擬機弄混,Docker 容器只是一個進程而已,只不過利用鏡像提供的 rootfs 提供了調用所需的 userland 庫支持,使得進程可以在受控環境下運行而已,它並沒有虛擬出一個機器出來。

參考:

https://www.docker.com/what-docker

視頻筆記: Windows Server 和 Docker - John Starks


Docker 資料好少啊?網上的命令怎麼不能用? 

首先,做技術工作,請珍惜生命,遠離百度;


其次,不翻牆、不用Google、不看英文資料,那請轉行,沒法混。

然後是回答問題,Docker的資料其實很豐富,特別是官方文檔講解非常詳細。

https://docs.docker.com/

另外,Docker有豐富的鏡像庫,Docker Hub,特別是官方(Official)的鏡像可以直接在生產環境中使用,製作比較精良。

https://hub.docker.com/explore/

所有的官方鏡像都有 Dockerfile,以及在github上有全部生成鏡像的配套文件,遵循了Dockerfile的最佳實踐,這些也是很好地學習資料。

另外,在 YouTube 的 Docker 官方頻道下有幾百個視頻講座,從初級到高級用戶都能從裡面學到很多東西。

https://www.youtube.com/user/dockerrun


如何選擇 Docker 書籍? 


Docker 屬于敏捷開發的產品,並且處於高速創新階段,每年都會有幾個版本發布。Docker 的版本號結構,目前是 <大版本號>.<小版本號>.<補丁版本號> 的結構。目前 大版本號 基本為 1,小版本號在一直變化。Docker 基本會保持 3 個小版本號 之內的兼容性(如果一個特性宣布廢棄,一般會在 3 個版本後才徹底移除)。

因此在購買 Docker 圖書的時候,應該遵循這樣的原則:觀察一下當前的 Docker 版本號,選擇不要晚於 2 個小版本的 Docker 書籍。 比如寫這段文字時為 1.12.5,那麼就不要購買介紹 Docker 1.9 及其以前版本的書籍了,否則看到的很多東西將會過時而無法使用,或者已經不必如此繁瑣有更簡單的方式去實現了。

總說看官方文檔,可是 Docker 官網文檔經常被牆,看不了怎麼辦? 

首先感謝偉大的牆及其先祖。

然後,我們可以本地運行 Docker 官方文檔的網站,以 docker 的方式:

$ docker run -d -p 80:4000 docs/docker.github.io

這樣訪問 Docker 宿主的 80 埠,如 http://localhost,就會看到官網文檔了。

對於那些訪問不了我的問答錄的童鞋,同樣可以用這樣的方式來本地運行:

$ docker run -d -p 80:80 twang2218/blog.lab99.org

然後就可以訪問本地 80 埠看到最新的問答錄了。

Docker 1.8以後版本都有什麼改進麼? 


每個版本發布時,官方博客 https://blog.docker.com都會有專門文章描述這個版本最主要的改進。

https://blog.docker.com/2015/11/docker-1-9-production-ready-swarm-multi-host-networking/

https://blog.docker.com/2016/02/docker-1-10/

https://blog.docker.com/2016/04/docker-engine-1-11-runc/

https://blog.docker.com/2016/06/docker-1-12-built-in-orchestration/


Docker Toolbox、Compose、Machine等等軟體總是下載不來怎麼辦? 

首先感謝偉大的牆,然後有條件的可以翻牆下載。

另外,對於不方便翻牆的童鞋們,我上傳了一份到百度雲上,鑑於百度雲這山寨貨文件完整性無法保證,我 zip 壓縮了不同系統的工具。所以較大,不要太介意,慢慢下載 🙂。

連結: https://pan.baidu.com/s/1o7V5scM 密碼: tzxc

ZIP 文件內包含了 md5sum.txt 以及 sha256sum.txt,下載後可以用其確認文件完整性。

校驗 

解壓縮後,在命令行進入到包含 md5sum.txt 的目錄後,執行:

$ md5sum -c md5sum.txt

docker-for-mac-1.12.3.dmg: OK

docker-toolbox-1.12.3.pkg: OK

boot2docker-1.12.3.iso: OK

如果結果都是 OK,說明校驗成功。


內容 

docker-VERSION.tgz: Docker 靜態編譯的一組可執行文件(比如 Jenkins 裡使用這裡面的 docker 命令行工具)

docker-compose-VERSION: Docker Compose 可執行文件

docker-machine-VERSION: Docker Machine 可執行文件

md5sum.txt: 校驗文件

docker-mac-VERSION.zip: macOS 系統(推薦使用 Docker for Mac)

boot2docker.iso,更新新版本時可能會需要。

docker-for-mac-VERSION.dmg: Docker for Mac 安裝文件

docker-toolbox-VERSION.pkg: Docker Toolbox for Mac 安裝文件(如果只需要單機 Docker 環境則不需要裝 Docker Toolbox)

md5sum.txt: 校驗文件

boot2docker-VERSION.iso: Docker Machine 建立本地虛擬機時所需的 boot2docker.iso,更新新版本時可能會需要。

docker-VERSION.zip: Docker Windows 命令行客戶端

docker-compose-VERSION.exe: Docker Compose 可執行文件

docker-machine-VERSION.zip: Docker Machine 可執行文件

docker-toolbox-VERSION.exe: Docker Toolbox for Windows 安裝程序

docker-for-windows-VERSION.msi: Docker for Windows (對於 Windows 10 Build 10586 以後的版本)

md5sum.txt: 校驗文件

相關信息頁面請訪問:https://coding.net/u/twang2218/p/docker-downloader/git

如果發現下載有問題,歡迎提交issue,或者 fork 並 提交 Pull Request


是直接用 yum / apt-get 安裝 Docker 嗎? 

很多人問到 docker, docker.io, docker-engine 甚至 lxc-docker 都有什麼區別?

其中,RHEL/CentOS 軟體源中的 Docker 包名為 docker;Ubuntu 軟體源中的 Docker 包名為 docker.io;而很古老的 Docker 源中 Docker 也曾叫做 lxc-docker。這些都是非常老舊的 Docker 版本,並且基本不會更新到最新的版本,所以不要使用作業系統軟體源中的 Docker。

正確的方法應該是添加 Docker 官方的 apt/yum 源,然後再進行安裝。Docker 官方源中支持 Ubuntu、Debian、CentOS、OpenSUSE等。另外,也可以使用 Docker 官方提供的腳本進行安裝。

curl -fsSL https://get.docker.com/ | sh

如果訪問官方源太慢,可以使用國內的鏡像源安裝:

使用阿里雲的安裝腳本:

curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -

使用DaoCloud的Docker安裝腳本:

curl -sSL https://get.daocloud.io/docker | sh

怎麼修改了 /etc/default/docker 後不起作用? 


改動真的生效了麼?在宿主上運行一下 ps -ef | grep docker 看看,自己做的那些配置有麼?沒有的話就說明沒有生效。那麼就要檢查原因了,除了簡單的忘記了重啟 Docker 服務外,還有可能修改錯了配置文件。

最近兩年處於 upstart/SysinitV 到 systemd 的過渡期,所以配置服務的方式對於不同的系統是不一樣的,要看自己使用的是什麼作業系統,以及什麼版本。

對於 upstart 的系統(Ubuntu 14.10或以前的版本,Debian 7或以前的版本),配置文件可能在

Ubuntu/Debian: /etc/default/docker

而對於 systemd 的系統(Ubuntu 15.04及以後的版本,Debian 8及以後的版本,CentOS/RHEL 7),配置文件則一般在 /etc/systemd/system/ 下的 docker.service 中。如果已經用命令 systemctl enable docker 啟用了 Docker 服務,那麼配置文件應該在:

/etc/systemd/system/multi-user.target.wants/docker.service

具體位置不同系統不同,而且要注意 upstart 的服務配置文件和 systemd 的配置文件的格式也不同,不要混淆亂配:

參考官網文檔:


https://docs.docker.com/engine/admin/configuring/#ubuntu
https://docs.docker.com/engine/admin/systemd/

來源:大橋下的蝸牛

原文:http://t.cn/RI8whG6

題圖:來自谷歌圖片搜索

版權:本文版權歸原作者所有


更多精彩熱文:


相關焦點

  • docker 門外初體驗——docker 安裝(一)
    文章目錄系列文章目錄前言一、docker是什麼?
  • Docker系列教程01-使用Docker鏡像
    今天先帶大家學習Docker鏡像相關的基礎知識。Docker鏡像簡介1、什麼是鏡像?docker search 語法docker search 語法例如,搜索mysql相關的鏡像,命令如下:2.433 MBweb_repo latest 4986bf8c1536 2 weeks ago 2.43這裡帶latest標籤的鏡像與0.9版本的鏡像是一樣的,都是兩周前的版本,然而1.0的鏡像是一分鐘以前的
  • 雲計算核心技術Docker教程:docker Stack介紹
    Docker在進行多服務部署和管理時通常會使用Docker Stack來解決大規模部署管理問題,Docker引擎在1.12 版本集成了Docker Swarm, 內置新的容器編排工具docker stack,通過提供期望狀態、滾動升級、簡單易用、擴縮容、健康檢查等特性簡化了應用的管理
  • Docker系列教程02-操作Docker容器
    本章帶大家學習容器相關的重要操作,包括創建容器、啟動容器、終止容器、進入容器後執行操作、刪除容器及通過導入導出容器實現容器遷移、容器與宿主機之間數據拷貝等。[root@qll251 ~]# docker run -it ubuntu /bin/bashroot@8b18b6758bb6:/#docker run相當於執行了兩個步驟:將鏡像放入容器中(docker create),然後啟動容器(docker start)。
  • 【Docker】系列教程02-操作Docker容器
    本章帶大家學習容器相關的重要操作,包括創建容器、啟動容器、終止容器、進入容器後執行操作、刪除容器及通過導入導出容器實現容器遷移、容器與宿主機之間數據拷貝等。~]# docker run -it ubuntu /bin/bashroot@8b18b6758bb6:/#docker run相當於執行了兩個步驟:將鏡像放入容器中(docker create),然後啟動容器(docker start)。
  • 如何開始docker - docker架構及創建容器
    安裝docker很簡單,啟動服務以後要怎麼開始使用呢?docker架構傳統的虛擬機架構是 物理機 -> 宿主機作業系統 -> Hypervisor支持 -> 虛擬機作業系統 -> 應用程式docker架構是 物理機 -> 宿主機作業系統 -> docker引擎 ->
  • Docker集群管理之Docker Compose
    Docker主機創建好之後,接下來就該考慮Docker容器部署的問題了。本篇中我們將通過分析Docker Compose的源碼,了解Docker Compose的工作原理。預告:9月1日晚上8點整,杜航將通過在線培訓的方式詳細探討《Docker集群管理三劍客》,報名地址請點擊這裡與容器技術同樣受到關注的微服務架構也在潛移默化的改變著應用的部署方式,其提倡將應用分割成一系列細小的服務,每個服務專注於單一業務功能,服務之間採用輕量級通信機制相互溝通。
  • docker的/var/run/docker.sock參數
    註:關於上述docker-compose.yml的作用和相關實戰,請參考《kafka的Docker鏡像使用說明(wurstmeister/kafka)》;預備知識搞清楚/var/run/docker.sock參數的前提是了解docker的client+server架構,如下是執行docker version命令的結果:
  • docker容器的啟動方式
    .一致的運行環境:開發過程中一個常見的問題是環境一致性問題。由於開發環境、測試環境、生產環境不一 致,導致有些bug 並未在開發過程中被發現。而Docker 的鏡像提供了除內核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現「這段代碼在我機器上沒問題啊」這類問題。
  • 雲計算核心技術Docker教程:Docker容器使用
    docker 客戶端非常簡單 ,我們可以直接輸入 docker 命令來查看到 Docker 客戶端的所有命令選項。可以通過命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。
  • linux - docker 命令權限問題
    普通用戶運行docker ps 出現權限問題Got permission denied while trying to connect to the Docker daemonsocket at unix:///var/run/docker.sock: Get 。。。。
  • 雲計算核心技術Docker教程:docker-compose up命令介紹
    在下載安裝Docker Compose後通過創建 Dockerfile 文件就可以使用Docker Compose命令構建和啟動應用了,本文主要介紹docker-compose up命令。命令格式:docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]
  • Docker常用命令就該這麼學!
    Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然後發布到任何流行的 Linux或Windows 機器上,也可以實現虛擬化。
  • 雲計算核心技術Docker教程:Docker鏡像使用
    當運行容器時,使用的鏡像如果在本地中不存在,docker 就會自動從 docker 鏡像倉庫中下載,默認是從 Docker Hub 公共鏡像源下載。我們可以使用 docker images 來列出本地主機上的鏡像。
  • 雲計算核心技術Docker教程:Dockerfile文件EXPOSE命令詳解
    在 Dockerfile 中寫入這樣的聲明有兩個好處,一個是幫助鏡像使用者理解這個鏡像服務的守護埠,以方便配置映射;另一個用處則是在運行時使用隨機埠映射時,也就是 docker run -P 時,會自動隨機映射 EXPOSE 的埠。
  • 不懂這些知識點,你還好意思說懂 Docker?
    作者 | 唐華敏(華敏)  阿里雲容器平臺技術專家本文整理自《CNCF x Alibaba 雲原生技術公開課》第 15 講,點擊「閱讀原文」
  • 雲計算核心技術Docker教程:build 命令詳解
    來源:TechWeb.com.cnDockerfile是一個用來構建鏡像的文本文件,在docker客戶端命令行中我們可以通過docker build 命令使用Dockerfile文件來創建鏡像。使用URL github.com/creack/docker-firefox 的 Dockerfile 創建鏡像:docker build github.com/creack/docker-firefox也可以通過 -f Dockerfile 文件的位置:
  • 雲計算核心技術Docker教程:Docker Machine 使用 - TechWeb
    使用docker-machine命令,可以啟動、審查、停止、重啟託管的docker 也可以升級Docker客戶端和守護程序並配置docker客戶端和宿主機通信。Docker Machine 也可以集中管理所以得docker主機。
  • 雲計算核心技術Docker教程: Docker 安裝 Redis
    本文介紹通過docker安裝redis。1.我們用 docker search redis 命令來查看可用版本:2.取最新版的 Redis 鏡像,這裡我們拉取官方的最新版本的鏡像:$ docker pull redis:latest
  • ​Docker 數據卷的管理及自動構建docker鏡像
    /www.nmtui.com" >/data/index.html[root@docker01 ~]# curl 10.0.0.100http://www.nmtui.com設置共享卷,使用同一個卷啟動一個新的容器[root@docker01 ~]# docker run -d -p 8080:80 -v /data:/