由於興致使然,便想學習一點Docker技術。於是,寫了這篇學習Docker的體會。筆拙,見諒。
第一件事——把網線插上
相信很多人都被官網的《Sample application》的 docker build -t getting-started .
給欺騙了。
fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/main/x86_64/APKINDEX.tar.gz
WARNING: Ignoring http://dl-cdn.alpinelinux.org/alpine/v3.11/main: temporary error (try again later)
ERROR: unable to select packages:
g++ (no such package):
required by: world[g++]
make (no such package):
required by: world[make]
python3 (no such package):
required by: world[python3]
我查閱Github的Issue也走入了誤區,添加了RUN echo -e "http://dl-cdn.alpinelinux.org/alpine/v3.11/main" > /etc/apk/repositories
還是有問題
我於是修改了dockerfile:
# syntax=docker/dockerfile:1
FROM node:12-alpine
RUN ping dl-cdn.alpinelinux.org
# RUN echo -e "http://dl-cdn.alpinelinux.org/alpine/v3.11/main" > /etc/apk/repositories
RUN apk add --no-cache python g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
通過Ping瞭解到網線沒插
於是我註釋了ping
,直接執行
$sudo docker build --network=host -t getting-started .
等待build結束,執行:
$sudo docker run --network=host -dp 3000:3000 getting-started
第二件——學會使用梯子
根據安裝Arch和Gentoo的體驗,由於國內外網路速度差異太大,這裡我找了一些apline的映象供各位參考。
第三件——linux是一個很好的老師
dockerfile的內容以bash操作為主。很多Concept都與linux相關。docker的cli多數和bash以及gcc類似,如ps,rm, build, run, stop 等等
- docker volume就很像簡易版的LVM
- docker compose和cmake的操作近似
第四件——區分Docker Daemon、Images和Container的三者關係
建議參考git的原理
第五件——和學習Java一樣多研究Reference
https://docs.docker.com/reference/
結論
Docker的上手難度低,之前浪費時間看書,現在有點後悔。雖然我已經在開發中使用Docker的Postgres和Memcached作為DB的容器, 但是真正要想玩轉Docker,還是需要理解運維服務的一些技術。很多人都認為Docker是微服務,其實不是他只是微服務的載體。如果說Docker是程序,那麼微服務就是函式。程式可以由多個函式組成,Docker也可以裝入多個微服務。Docker的目的很簡單——有效的利用資源和分配資源。但是我認為Docker存在對記憶體和CPU的依賴性,這會導致我們將來的計算機結構記憶體會更大,CPU核會更多。