第一本docker書筆記
- 第一本docker書筆記
- 1. 簡介
- 2. 安裝Docker
- 3. Docker入門
- 3.1 確保Docker已經就緒
- 3.2 運行我們的第一個容器
- 3.3 使用第一個容器
- 3.4 容器命名
- 3.5 重新啓動已經停止的容器
- 3.6 附着到容器上
- 3.7 創建守護容器
- 3.8 容器內部都在幹些什麼
- 3.9 查看容器內的進程
- 3.10 在容器內部運行進程
- 3.11 停止守護式容器
- 3.12 自動重啓容器
- 3.13 深入容器
- 3.14 刪除容器
- 3.15 小結
- 4. 使用Docker鏡像和倉庫
- 4.1 什麼是Docker鏡像
- 4.2 列出鏡像
- 4.3 拉取鏡像
- 4.4 查找鏡像
- 4.5 構建鏡像
- 4.6 將鏡像推送到Docker Hub
- 4.7 刪除鏡像
- 4.8 運行自己的Docker Registry
- 4.9 其他可選Registry服務
- 4.10 小結
- 5. 在測試中使用Docker
- 6. 使用Docker構建服務
- 7. 使用Fig編配Docker
- 8. 使用Docker API
- 9. 獲得幫助和對Docker進行改進
第一本docker書筆記
筆記是從xmind中導出,看xmind格式會更方便,免費資源地址
1. 簡介
1.1 Docker簡介
-
Docker是一個能夠把開發的應用程序自動部署到容器的開源引擎。
-
1.1.1 提供一個簡單、輕量的建模方式
-
1.1.2 職責的邏輯分離
- 開發人員只需要關心容器中運行的應用程序,而運維人員只需要關心如何管理容器
- 加強開發人員寫代碼環境與程序要部署的生產環境的一致性。
-
1.1.3 快速高效的開發生命週期
-
1.1.4 鼓勵使用面向服務的組件
- 推薦單個容器只運行一個應用程序或進程。
1.2 Docker組件
-
1.2.1 Docker客戶端和服務器
-
1.2.2 Docker鏡像
-
鏡像是Docker世界的基石,用戶基於鏡像來運行自己的容器。鏡像體積很小,非常便攜,易於分享、存儲和更新。
-
鏡像是Docker生命週期中的構建部分,它是基於聯合文件系統的一種層次的結構,由一些列指令一步一步構建出來。
-
公共鏡像
- Docker公司運營的公共鏡像叫Docker Hub,用戶可以註冊、分享並保存自己的鏡像。
- 也可以保存用戶私有的鏡像,組織或團隊內部可見
-
私有鏡像
-
-
1.2.3 Registry
- 保存用戶構建的鏡像。
- 架設私有Registry,保存在防火牆後面。
-
1.2.4 容器
- 容器是基於鏡像啓動,容器中可以運行一個或多個進程。
- 容器是Docker啓動或者執行階段。
- 容器就是一個鏡像格式、一系列標準的操作,一個執行環境。
- Docker借鑑了標準集裝箱的概念,Docker運輸軟件。每個容器都包含一個軟件鏡像,並且可以對軟件鏡像進行一些操作。
1.3 我們能用Docker做什麼
- 加速本地開發和構建流程,使其更加高效、更加輕量化。本地開發人員可以構建、運行並分享Docker容器。
- 能夠讓獨立服務或者應用程序在不同的環境中,得到相同的結果。
- 用Docker創建隔離的環境來進行測試。
- 提供軟件即服務的應用程序。
- 高性能、超大規模的宿主機部署。
1.4 Docker與配置管理
- Docker和配置管理工具可能都需要部署。
1.5 Docker的技術組件
- Docker可以運行與任何安裝現代Linux內核的x64主機上。
- 一個原生的Linux容器格式,libcontainer或者lxc
- Linux內核的命名空間(namespace),用於隔離文件系統、進程和網絡。
- 文件系統隔離:每個容器都有自己的root文件系統
- 進程隔離:每個容器都運行在自己的進程環境中。
- 網絡隔離:容器間的虛擬網絡接口和IP地址都是分開的。
- 資源隔離和分組:使用cgroups將cpu和內存之類的資源獨立分配給每個容器。
- 寫時複製:文件系統是通過寫時複製創建的,這就意味着文件系統是分層的、快速的,而且佔用的磁盤空間更小。
- 日誌:容器產生的STDOUT、STDERR和STDIN這些IO流都會被收集並記入日誌,用來進行日誌分析和故障排錯。
- 交互式shell:用戶可以創建一個僞tty終端,將其連接到STDIN,爲容器提供一個交互式shell。
1.6 本書的內容
- 安裝Docker、嘗試使用Docker容器、構建Docker鏡像、管理並共享Docker鏡像、運行、管理更復雜的Docker容器、將Docker容器的部署納入測試流程、構建多容器的應用程序和環境、介紹使用Figer進行Docker編配的基礎,探索Docker的API。
1.7 Docker資源
- Hub、官方網站、博客、文檔、入門指南、GitHub源代碼、Forge、StackOverFlow問答主頁。
2. 安裝Docker
2.1 安裝Docker的先決條件
- 64位CPU架構的計算機、Linux3.8或更高版本內核、內核必須支持一種合適的存儲驅動、內核必須支持並開啓cgroup和命名空間功能。
2.2 在unbutu中安裝Docker
- uname -a 檢查內核版本和cpu架構
- DeviceMapper提供了一種將塊設備映射到高級虛擬設備的方法,它支持自動精簡配置,可以在一個文件系統中存儲多臺虛擬設備(Docker鏡像中的層)。
2.9 Docker守護進程
3. Docker入門
3.1 確保Docker已經就緒
- docker info
3.2 運行我們的第一個容器
-
docker --help
-
docker run創建和啓動容器
- docker run -i -t ubuntu /bin/bash
- -i - 保證容器中的STDIN是開啓的,標準輸入
- -t - 爲要創建的Docker容器分配一個僞tty終端
- 首先docker會檢查本地是否存在ubuntu鏡像,如果本地還沒有該鏡像的話,那麼docker會連接官方維護的Docker Hub Registry,查看是否有鏡像。如果有,下載保存到本地。隨後,Docker在文件系統內部用這個鏡像創建了一個新容器。該容器擁有自己的網絡、IP地址,以及一個用來和宿主機進行通信的橋接網絡接口。最後,我們告訴新容器需要運行/bin/bash命令啓動容器內的shell。
3.3 使用第一個容器
-
hostname、cat /etc/hosts、ip a
- exit退出
-
docker ps -a 列出所有容器
-
docker ps列出運行中的容器
- docker ps -l
-
3.4 容器命名
-
–name
- 唯一、docker rm移除同名容器
3.5 重新啓動已經停止的容器
- docker start/restart ID/name
3.6 附着到容器上
-
docker attach ID/name
- exit容器也會停止
3.7 創建守護容器
- -d - 容器後臺運行
3.8 容器內部都在幹些什麼
-
docker logs ID/name
-
docker logs -ft ID/name
-
docker logs --tail 10 ID/name
- docker logs --tail 0 -f ID/name
-
-
3.9 查看容器內的進程
- docker top ID/name
3.10 在容器內部運行進程
- docker exec在容器內部額外啓動新進程。
- sudo docker exec -d ID/name touch /etc/new_config_file
- sudo docker exec -t -i ID/name /bin/bash
3.11 停止守護式容器
- docker stop ID/name
3.12 自動重啓容器
-
docker run --restart=always/–restart=on-failure:5
- 無論如何都重啓
- 退出代碼爲非0是,最多重啓5次
3.13 深入容器
-
docker inspect
-
docker inspect -f/-format ID/name
-
docker inspect --format=’’{{.State.Running}}’ ID/name ID/name
- 支持go語言模板
-
-
3.14 刪除容器
-
docker rm
-
運行中的容器不能刪除,docker stop/kill
- docker rm ‘docker ps -a -q’ 刪除所有容器
-
3.15 小結
4. 使用Docker鏡像和倉庫
4.1 什麼是Docker鏡像
-
這樣的文件系統稱爲鏡像。
-
鏡像是由文件系統疊加而成。
-
最底端是一個引導文件系統,即bootfs。
- 啓動容器後,引導層被卸載,以備流出更多的內存供initrd磁盤鏡像使用。
-
第二層是root文件系統rootfs,它可以是一種或多種操作系統。
- root永遠是隻讀狀態。
-
聯合加載(併發加載)技術會在root層上加載更多的只讀文件系統,最終的文件系統會包含所有的底層文件和目錄。
-
-
一個鏡像可以放到另一個鏡像的頂部,下面的是父鏡像(parent image),最底部的鏡像稱爲基礎鏡像(base image)。
-
當從一個鏡像啓動容器時,Docker會在該鏡像的最頂層加載一個讀寫文件系統,我們想在Docker中運行的程序就是在這個讀寫層中執行的。
-
寫時複製
- 第一次啓動容器,讀寫層是空的,當文件系統發生變化時,所有的變化都會應用到這一層上。如果想修改一個文件,這個文件首先會從該讀寫層下面的只讀層複製到該讀寫層。該文件的只讀版本依然存在,但是已經被讀寫層中的該文件副本所隱藏。
- 每個只讀鏡像層永遠都不會變化,當創建一個容器時,Docker都會構建一個鏡像棧,並在棧的最頂端加一個讀寫層。讀寫層+下面的鏡像層+配置數據=容器。鏡像的分層框架,使我們可以快速構建鏡像並運行包含我們自己的應用程序和服務的容器。
4.2 列出鏡像
-
docker images
-
/var/lib/docker
- /var/lib/docker/containers
-
-
鏡像從倉庫下載,保存在倉庫中,默認的Registry是有Docker提供的Docker Hub。
-
Tag標籤
-
爲了區分同一個殘酷中的不同鏡像
-
每個標籤對組成特定鏡像的一些鏡像層進行標記
- 這種機制使得在同一個倉庫中可以存儲多個鏡像。
-
-
-
倉庫
-
用戶倉庫User Repository
-
普通用戶貢獻
- 用戶名/倉庫名
-
-
頂層倉庫Top-level repository
-
Docker內部的人和由選定的能提供優質基礎鏡像的廠商管理。
- 倉庫名
-
-
4.3 拉取鏡像
-
docker pull image
- docker pull image:tag
4.4 查找鏡像
-
docker search image
-
倉庫名
-
鏡像描述
-
用戶評價
-
是否官方
- 自動構建
-
-
-
-
4.5 構建鏡像
-
4.5.1 創建Docker Hub賬號
-
4.5.2 用Docker的commit命令創建鏡像
- docker commit -m “提交信息” --author=“creator” newContainerId user/repository:tag
-
4.5.3 用Dockerfile構建鏡像
-
構建環境/上下文
-
build context
- 構建是將構建上下文和該上下文中的文件和目錄上傳到Docker守護進程,這樣Docker守護進程就能直接訪問你想在鏡像中存儲的任何代碼、文件或者其它數據。
-
-
Dockerfile
···
FROM ubuntu:14.04
MAINTAINER James Turnbull “[email protected]”
RUN apt-get update
RUN apt-get install -y nginx
RUN echo ‘Hi, I am in your container’ > /usr/share/nginx/html/index.html
EXPOSE 80
···-
指令和參數,指令都必須爲大寫字母,且後面跟一個參數
-
Docker從基礎鏡像運行一個容器
-
執行一條指令,對容器做出修改
-
執行類似docker commit的操作,提交一個新的鏡像層
-
Docker再基於剛提交的鏡像運行一個新的容器
- 執行Dockerfile下一個指令,知道所有的指令的執行完畢。
-
-
-
-
FROM base image
- 基於哪個鏡像構建
-
MAINTAINER name email
-
-
-
4.5.4 基於Dockerfile構建新鏡像
- docker build -t=“repository/image:tag” .
-
4.5.5 指令失敗時會怎樣
- 可以基於該可以使用的鏡像運行一個具備交互功能的容器,使用最後創建的鏡像對爲什麼指令失敗進行調試。
-
4.5.6 Dockerfile和構建緩存
-
每一步的構建過程都會將結果提交爲鏡像,之前的鏡像層看做緩存
-
第4步驟失敗,直接從第4步開始
-
如果之前的構建步驟改變了
- docker build --no-cache -t=“repository/image:tag” .
-
-
-
-
4.5.7 基於構建緩存的Dockerfile模板
-
4.5.8 查看新鏡像
-
docker images
- docker history ID
-
-
4.5.9 從新鏡像啓動容器
-
docker run -d -p 80 --name satic_web jamtur01/static_web nginx -g “daemon off;”
-
-d後臺啓動
-
-P
- 對外公開在Dockerfile中EXPOSE指令中設置的所有端口,並綁定到隨機端口上
-
-p 80:80
- 和本地的80端口綁定
-
-p 127.0.0.1::80
- 和本地的127.0.0.1這個ip的隨機端口綁定
-
-p 127.0.0.1:8080:80
- 和本地的127.0.0.1這個ip的80端口綁定
-
-p 80
- 隨機映射到49153~65535上
-
-
-
4.5.10 Dockerfile指令
-
CMD
-
容器啓動時需要運行的指令
-
RUN命令會覆蓋CMD指令
-
多條CMD只有最後一條會執行
- CMD ["/bin/true"]
-
-
-
-
ENTRYPOINT
-
ENTRYPOINT+CMD
- 即可以運行默認的命令,也可以支持通過docker run爲該命令指定可覆蓋的選項或者標誌
-
ENTRYPOINT ["/usr/sbin/nginx"]
CMD ["-h"]
-
-
WORKDIR
-
在鏡像中創建一個新容器,在容器內部設置一個工作目錄,ENTRYPOINT和CMD會在這個目錄下執行
- WORKDIR /opt/webapp/db
-
-w
-
指令覆蓋工作目錄
- docker run -ti -w /var/log ubuntu pwd
-
-
-
ENV
-
在鏡像構建過程設置環境變量
-
ENV TARGET_DIR /opt/app
-
-e
-
運行時設置環境變量
- docker run -ti -e “WEB_PORT=8080” unbuntu env
-
-
-
-
-
USER
-
指定該鏡像會以什麼樣的用戶去運行。
-
USER UID:GID
- docker run -ti -u
-
-
-
VOLUME
-
用來向基於鏡像創建的容器添加捲。一個卷是可以存在於一個或者多個容器內的特定的目錄,這個目錄可以繞過聯合文件系統,並提供如下共享或者對數據進行持久化的功能。
-
可以在容器間共享和重用
-
一個容器可以是不是必須和其他容器共享卷
-
對卷的修改是立時生效的
-
對卷的修改不會對更新鏡像產生影響
- 卷會一直存在直到沒有任何容器再使用它
-
-
-
-
添加到鏡像而不是提交到鏡像,並且可以共享
- 測試容器和內部的應用程序代碼、管理日誌、處理容器內部的數據庫
-
VOLUME ["/opt/project", “/data"]
- 掛載點
-
-
ADD
-
將構建環境下的文件和目錄複製到鏡像中。
-
ADD source.lic /opt/dest.lic
- /結尾是目錄,非/結尾是文件
-
ADD url /opt/dest.lic
-
目錄或文件不存在都會自動創建,模式是0755,UID和GID是0
-
會使得構建緩存失效
-
-
-
COPY
-
只關心在構建上下文中複製本地文件,不會去做提取和解壓工作。
-
源路徑必須是一個與當前構建環境相對的文件或者目錄,本地文件都存放到和Dockerfile同一個目錄下。目的位置則必須是容器內部的一個絕對路徑。
- UID GID是0
-
-
ONBUILD
-
爲鏡像添加觸發器。
-
會在構建過程中插入新指令,這些指令跟在FROM之後。
- ONBUILD ADD . /app/src
-
-
docker inspect ID
-
只會繼承一次,孫子不能執行
-
-
4.6 將鏡像推送到Docker Hub
-
docker push 用戶ID/imageName
-
自動構建
- 將GitHub或者BitBucket賬號連接到Docker Hub
4.7 刪除鏡像
-
docker rmi userId/imageName userId/imageName2
- docker rmi ‘docker images -a -q’
4.8 運行自己的Docker Registry
-
4.8.1 從容器運行Registry
- sudo docker run -p 5000:5000 registry
-
4.8.2 測試新Registry
-
sudo docker tag id localhost:5000/userId/image
-
docker push localhost:5000/userId/image
- docker run -ti localhost:5000/userId/image /bin/bash
-
-
4.9 其他可選Registry服務
4.10 小結
5. 在測試中使用Docker
5.1 使用Docker測試靜態網站
-
5.1.1 Sample網站的初始Dockerfile
-
mkdir sample && cd sample && touch Dockerfile
- cd sample mkdir nginx && cd nginx && wget global.conf && wget nginx.conf && cd …
···- FROM ubuntu:14.04
MAINTAINER geguirong “[email protected]”
ENV REFRESHED_AT 2020-03-30
RUN apt-get update
RUN apt-get -y -q install nginx
RUN mkdir -p /var/www/html
ADD nginx/global.conf /etc/nginx/conf.d/
ADD nginx/nginx/conf /etc/nginx/nginx.conf
EXPOSE 80
···
- FROM ubuntu:14.04
- cd sample mkdir nginx && cd nginx && wget global.conf && wget nginx.conf && cd …
-
daemon off阻止nginx進入後臺,強制其在前臺運行,爲了保持Docker容器的活躍狀態,需要其中的進程不能中斷。默認nginx會以守護進程方式運行,會導致容器只是短暫運行。
-
-
5.1.2 構建Sample網站和Nginx鏡像
-
docker build -t geguirong/nginx .
- docker history
-
-
5.1.3 從Sample網站和Nginx鏡像構建容器
-
cd sample && mkdir website && cd website && mkdir index.html && cd …
-
docker run -d -p 80 --name website -v $PWD/website:/var/www/html/website geguirong/nginx nginx
-
http://localhost:port
- This is a test website.
-
-
-
-v指令運行我們將宿主機的目錄作爲卷,掛載到容器裏。
- 如果目的目錄不存在,Docker會自動創建一個。同時可以加上rw或者ro來指定目錄的讀寫狀態。
-
卷是在一個或者多個容器內被選定的目錄,可以繞過分層的聯合文件系統,爲Docker提供持久化數據或者共享數據。
- 希望同時對代碼做開發和測試。
- 代碼改動頻繁,不想在開發過程中重構鏡像。
- 希望在多個容器間共享代碼。
-
這意味着對卷的修改會直接生效,並繞過鏡像。當提交或者創建鏡像時,卷不被包含在鏡像裏,卷可以在容器間共享。
-
-
5.1.4 修改網站
-
vi $PWD/website/index.html直接生效
- 環境是相同的,只是代碼不一樣。
-
5.2 使用Docker構建並測試Web應用程序
- 5.2.1 構建Sinatra應用程序
- 5.2.2 創建Sinatra容器
- 5.2.3 構建Redis鏡像和容器
- 5.2.4 連接到Redis容器
- 5.2.5 連接Redis
- 5.2.6 讓Docker容器互連
- 5.2.7 使用容器連接來通信
5.3 Docker用於持續集成
- 5.3.1 構建Jenkins和Docker服務器
- 5.3.2 創建新的Jenkins作業
- 5.3.3 運行Jenkins作業
- 5.3.4 與Jenkins作業有關的下一步
- 5.3.5 Jenkins設置小結
5.4 多配置的Jenkins
- 5.4.1 創建多配置作業
- 5.4.2 測試多配置作業
- 5.4.3 Jenkins多配置作業小結
5.5 其他選擇
- 5.5.1 Drone
- 5.5.2 Shippable
5.6 小結
6. 使用Docker構建服務
6.1 構建第一個應用
- 6.1.1 Jekyll基礎鏡像
- 6.1.2 構建Jekyll基礎鏡像
- 6.1.3 Apache鏡像
- 6.1.4 構建Jekylll Apache鏡像
- 6.1.5 啓動Jekylll網站
- 6.1.6 更新Jekyll網站
- 6.1.7 備份Jekyll卷
- 6.1.8 擴展Jekyll示例網站
6.2 使用Docker構建一個Java應用服務
- 6.2.1 WAR文件的獲取器
- 6.2.2 獲取WAR文件
- 6.2.3 Tomecat7應用服務器
- 6.2.4 運行WAR文件
- 6.2.5 基於Tomcat應用服務器的構建服務
6.3 多容器的應用棧
- 6.3.1 Node.js鏡像
- 6.3.2 Redis基礎鏡像
- 6.3.3 Redis主鏡像
- 6.3.4 Redis從鏡像
- 6.3.5 創建Redis後端集羣
- 6.3.6 創建Node容器
- 6.3.7 捕獲應用日誌
- 6.3.8 Node程序棧的小結
6.4 不使用SSH管理Docker容器
6.5 小結
7. 使用Fig編配Docker
7.1 Fig
- 7.1.1 安裝Fig
- 7.1.2 獲取示例應用
- 7.1.3 fig.yml文件
- 7.1.4 運行Fig
- 7.1.5 使用Fig
- 7.1.6 Fig小結
7.2 Consul、服務發現和Docker
- 7.2.1 構建Consul鏡像
- 7.2.2 在本地測試Consul容器
- 7.2.3 使用Docker運行Consul集羣
- 7.2.4 啓動具有自啓動功能的Consul節點
- 7.2.5 啓動其餘節點
- 7.2.6 配合Consul,在Docker裏運行一個分佈式服務
7.3 其他編配工具和組件
- 7.3.1 Fleet和etcd
- 7.3.2 Kubernetes
- 7.3.3 Apache Mesos
- 7.3.4 Helios
- 7.3.5 Centurion
- 7.3.6 Libswarm
7.4 小結
8. 使用Docker API
8.1 DockerAPI
8.2 初識Remote API
8.3 測試Docker Remote API
- 8.3.1 通過API來管理Docker鏡像
- 8.3.2 通過API管理Docker容器
8.4 改進TProv應用
8.5 對Docker Remote API進行認證
- 8.5.1 建立證書授權中心
- 8.5.2 創建服務器的證書籤名請求和密鑰
- 8.5.3 配置Docker守護進程
- 8.5.4 創建客戶端證書和祕鑰
- 8.5.5 配置Docker客戶端開啓認證功能
8.6 小結
9. 獲得幫助和對Docker進行改進
9.1 獲得幫助
- 9.1.1 Docker用戶和開發郵件列表
- 9.1.2 IRC上的Docker
- 9.1.3 GitHub上的Docker
9.2 報告Docker的問題
9.3 搭建構建環境
- 9.3.1 安裝Docker
- 9.3.2 安裝源代碼和構建工具
- 9.3.3 檢出源代碼
- 9.3.4 貢獻文檔
- 9.3.5 構建開發環境
- 9.3.6 運行測試
- 9.3.7 在開發環境中使用Docker
- 9.3.8 發起pull request
- 9.3.9 批准合併和維護者
9.4 小結
XMind: ZEN - Trial Version