前言
初學docker,記錄下,強烈推薦這篇文章理解docker。
知識
git
用過git的同學肯定感受到通過git管理代碼是多麼方便,我認爲git主要作用有
- 本地管理代碼版本:提交,回退,查看修改。如果沒有git,可能會整天擔心,改動這裏,會不會影響原本其他功能?有git,影響了,就回退吧,寫代碼顧慮少了很多。
- 遠程代碼版本同步:聞說,很久以前將代碼部署到服務器是用ftp的,要保證服務器端代碼與本地一致很麻煩..,而git,能百分比保證。
git與docker
- git管理的是代碼,在A主機寫好的代碼,在B主機git pull A機倉庫就能得到完全一致的代碼。
- docker管理的是環境,在A機通過docker能正常運行nginx,php,mysql,通過docker,能很方便地同步到B機中。
- Docker Hub對應 GitHub。
docker
通過docker運行的服務->docker->操作系統,對通過docker運行的服務來說,操作系統是透明的,即不管是什麼操作系統,我照樣運行我的,docker處理了操作系統差異,提供了上層所希望的環境。
獲得鏡像的方式:
- 方式1:Dockerfile —生成—> 鏡像images
- 方式2:Docker pull —獲取–> 鏡像
容器 = 鏡像 + 讀寫層
數據存儲問題:
- 首先,在容器裏做的修改,如
docker cp 文件 <container-id>://路徑
,當容器被刪除後,修改就不存在了。要想保存修改,可以docker commit
生成新鏡像,下次通過新鏡像docker run
就能得到修改後的。
理解1:爲什麼容器被刪除後,修改就不存在了呢?
通過docker info可查看到docker根目錄,centos7下是/var/lib/docker/。當通過鏡像生成容器,會生成/var/lib/docker/container/容器id 目錄,複製過來的文件就保存在類似這些臨時目錄中,當容器刪除了,目錄不存在,修改自然不存在了。(實際複製過來的文件不是保存到/var/lib/docker/overlay2/的某個目錄中去了,內部原理不理解,暫時不管了)理解2:
docker cp 文件 ....
這個操作,實際作用的是某一隻讀層,不能理解爲cp命令是對容器操作,因爲容器 = 鏡像 + 讀寫層,鏡像也有隻讀層!理解到這個,當看到在Dockerfile裏出現COPY命令就不會覺得奇怪了。- 但如果面對數據庫數據的修改,這麼多修改,不可能每次都commit吧,此時可通過
volume
解決,它的作用是實現持久化存儲。通過docker run -v 主機目錄:容器目錄
,-v
參數作主機目錄與容器目錄的映射
- 首先,在容器裏做的修改,如
docker-compose
:管理多容器應用
命令
容器生命週期管理
create,start,run
docker create
爲 指定鏡像添加了一個可讀寫層(Read-Write-Layer),此時容器並未運行,處於Created
狀態。- 通過
pstree -a | grep docker
查看,可知,未佔進程。 - 可通過
-p
參數指定端口映射,類似參數屬於這個命令
- 通過
docker start
爲容器文件系統創建了一個進程隔離空間。注意,每一個容器只能夠有一個進程隔離空間。docker run = docker create + docker start
,類似git pull = git fetch + git merge
docker create [-p..] <image-id> docker start <container-id> docker run [-p..] <image-id>
停止相關
docker stop <container-id> ## 向運行中容器發送SIGTERM信號,linux信號15 docker kill <container-id> ## 發送SIGKILL信號,linux信號9 docker pause <container-id> ## 利用了cgroups的特性將運行中的進程空間暫停
移除容器的可讀寫層,只能對非運行態容器執行
docker rm <container-id>
容器操作
列出docker容器
docker ps ## 列出運行中容器 docker ps -a ## 列出所有容器
獲取容器/鏡像的元數據。
docker inspect <image-id/container-id>
本地鏡像管理
列出所有頂層(top-level)鏡像。頂層鏡像:創建容器時使用的鏡像或直接pull下來的鏡像
docker images
列出所有鏡像,即列出所有可讀層
docker images -a
移除鏡像的一個可讀寫層
docker rmi <image-id> ## 只能移除頂層 -f <image-id> ## 強制刪除中間層
根據Dockerfile生成本地鏡像
docker build -t 標籤 Dockerfile所在目錄(上下文) docker build -t hello_docker .
容器rootfs命令
容器與主機間數據拷貝
docker cp 主機目錄/文件 <container-id>://目錄 docker cp index.html 6d61b7cf92c5://usr/share/nginx/html
將容器的可讀可寫層轉換爲只讀層
docker commit -m "提交信息" <container-id> [tag]
鏡像倉庫
從Docker Hub中查看鏡像
docker search php
從鏡像倉庫中拉取或者更新指定鏡像
docker pull php
登錄
docker login
將本地的鏡像上傳到鏡像倉庫,要先登陸到鏡像倉庫
docker push 鏡像
info相關
docker info
docker version
docker <命令> --help 查看指定命令的介紹和參數
Dockerfile
這東西涉及很多~,簡單理解,Dockerfile被用了生成鏡像,Dockerfile裏的每一行都是所生成鏡像裏的一層
兩個簡單例子(引用自慕課docker教程,鏈接在此:
生成輸出hello docker的鏡像,Dockerfile內容如下:
# 引入基礎鏡像,alpine是極小的linux環境,即生成的鏡像會非常小 FROM alpine:latest # 鏡像作者 MAINTAINER kbellx # 命令 CMD echo "Hello Docker"
生成帶有nginx服務器的鏡像
# 引入ubuntu鏡像 FROM ubuntu MAINTAINER kbellx # 在ubuntu環境下,鏡像環境,非主機環境 RUN apt-get update # 安裝nginx RUN apt-get install -y nginx # 複製Dockerfile同級目錄下index.html文件到鏡像目錄 COPY index.html /var/www/html # 指明docker run 鏡像,所執行的命令的路徑,參數等 ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"] # 暴露鏡像80端口 EXPOSE 80