docker基礎總結
概念
映象、容器、倉庫三大概念
Docker 方便開發者同時打包應用和相應的依賴環境到一個container中,方便遷移
docker的設計大量參考了git
docker命令全流程
![image-20201216131402718](/Users/yanglujian/Library/Application Support/typora-user-images/image-20201216131402718.png)
docker 命令
歷史
對比以前的VMWARE整機虛擬化技術,更輕。
統一了開發,測試,運維環境。
開發人員打包好自己開發的軟體 和 軟體依賴的環境(基礎資料,依賴軟體等),打包成一個映象發給測試使用即可
docker的實現是依靠UnionFS(Union File System), 該檔案系統使用了分層的思想。將基礎的服務進行分層共享。如同搭建積木一樣,不同的發行版基礎的bootFS(系統啟動相關)是一樣的,而rootFS(檔案系統/root /etc /ops等等)大致一樣,所以這些層可以共享,其餘的映象只要新增自己需要的層即可,
基本組成
client操作docker daemon, 從Registry拉取Image,執行容器和管理容器
映象下載下來後是readonly, 當run成容器後,就在上面鋪了一層writable層,
鋪完後可以在打包成一個映象
安裝環境
## 核心要求 uname -r 系統核心版本 3.10以上 ## 系統版本 cat /etc/os-release
工作路徑
/var/lib/docker
配置映象加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://cmh3y065.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
容器cpu監控
docker stats
視覺化管理工具
-
portainer
docker run -d -p 8088:9000 \ > --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
映象
Docker 執行容器前需要本地存在對應的映象,如果不存在,會從預設映象倉庫下載(預設從Docker Hub),可以配置使用自定義的映象倉庫, 查詢映象版本號可以去docker-hub中查詢
runoob@runoob:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
# REPOSITORY: 映象倉庫源
# TAG:映象標籤(版本), 同一個倉庫源可以有個TAG,代表倉庫源的不同版本
pull 映象拉取
##TAG 是映象的標籤,往往是版本號,預設是latest, 版本需要在網頁版上查詢
docker pull IMAGE:TAG
docker pull mysql:5.7 ## 5.7版本是存在的
##指定倉庫地址
docker pull [倉庫地址] IMAGE:TAG
e.g 網易蜂巢
docker pull hub.c.163.com/public/ubuntu:18.04
inspect 映象檢視
##列出映象
docker images
docker image ls
##檢視詳細資訊。 製作者,各層數字摘要
docker inspect centos:7
search 映象搜尋
##搜尋官方提供帶nginx的映象,預設docker-hub中查詢
docker search --filter=is-official=true nginx
##搜尋收藏數超過4的
docker search --filter=stars=4 tensorflow
其他引數
tag 映象標籤
## 給映象打標籤
docker tag [image_id] 映象名:版本標籤
## 刪除映象標籤
docker rmi [image]:tag
rm & prune 映象刪除清理
## 使用標籤刪除映象,只刪除指定標籤
docker rmi centos:7
## 使用映象ID刪除,先刪除image對應的tag,然後刪除映象,無法刪除有對應執行容器的image
## 因為同一個映象會對應不同的標籤,所以需要先刪除標籤
docker rmi 標籤
docker rmi [映象ID]
docker rmi -f 映象 ## -f強制刪除,不管依賴
## 有對應容器的映象刪除
docker rmi 容器ID
## 清理映象,清理臨時的遺留映象檔案層
docker image prune -f
## 獲取所有的image ID, docker images -q
## 刪除所有的image
docker rmi 'docker images -q'
commit映象
## 思路和git一致,
## pull映象後,在可讀映象上面鋪了一層writable層,即做了修改,commit後儲存到本地倉庫
docker commit -m="Comment" -a="author" 容器id 目標映象:[TAG]
映象儲存載入 save load
- 可以將映象打包到檔案,磁碟介質拷貝
- 使用docker save --help 檢視命令詳情
容器
容器是映象的執行例項,映象是靜態只讀檔案,容器有可寫檔案層。
inspect 容器引數
## 檢視容器執行配置引數,網路,資料卷等
docker inspect 容器名
ps 容器檢視
## 檢視docker正在執行的所有容器以及執行結束的容器
docker ps -a
## 檢視正在執行的容器,不顯示stop狀態的容器
docker ps
run 容器建立執行
## 立即進入
-i 容器標準輸入保持開啟,互動模式interaction
-t 開啟tty偽終端對接標準輸入 terminal
--name 給容器起名
-P 容器隨機繫結宿主機的空閒埠
-p 主機埠:容器埠
docker run -itd --name=[自定義名] [映象版本] [進入容器的初始化指令]
e.g docker run -itd --name=cli centos:7 /bin/bash
exit命令退出後,容器停止
## 後臺執行 -d deamon容器以後臺程序形式執行,此時不需要加/bin/bash,手動進入
docker run -id --name=cli2 centos:7
## 進入容器
docker exec -it cli2 /bin/bash
exit命令退出後,容器繼續執行,若使用docker attach命令進入容器,退出後容器停止執行
## 啟動容器常見的坑
docker run -d centos 命令執行後發現docker ps 沒有看到對應的容器執行
因為容器執行必須要有一個前臺程序,如/bin/bash, 當容器發現沒有程序執行時候就會自動停止執行
## 用完即刪的容器 -rm
docker run -it --rm tomcat:9.0
start stop restart 容器停止啟動
docker stop cli2
docker start cli2
docker restart cli2
rm -f 刪除容器
## running狀態的容器不能被刪除
## 獲取所有容器的執行id
docker ps -aq
## 刪除所有的容器
docker rm `docker ps -aq`
## 刪除指定容器
docker rm 容器ID
import/export匯入匯出快照
## 匯出快照到檔案
docker export [containerId] > file.tar
## 匯入為映象
cat file.tar | docker import - ImageRepostory(映象)
docker cp 檔案複製
## 常用於將容器內的檔案拷貝到宿主機上
docker cp a2ebd63f6e44:/Hello-docker.java ./
## 宿主機往容器內cp,往往用卷
提交容器到映象
## 容器提交成為映象
docker commit mycentos7 test_image:v1
檢視容器日誌
## 容器繫結宿主機埠後,檢視埠對應應用產生的日誌
docker logs -f [容器id]
檢視容器資訊
docker inspect [容器id]
Docker Volumn
資料卷(Data Volumes):容器內資料對映到本地主機環境,類似linux的mount操作
- 容器之間共享資料,解耦資料和應用
- 資料持久化,不依賴容器(防災)
配置資料卷
## 1.絕對路徑 2.目錄自動建立if not exist 3.一個容器可以掛載多個目錄
docker run... -v 宿主機目錄/檔案:容器內目錄/檔案 -v.. -v..
e.g
docker run -it --name=cli -v /root/data:/root/data_container centos:7 /bin/bash
## 2.mysql容器
docker run -d -p 3306:3306
-v /home/mysql/conf:/etc/mysql/conf.d
-v /home/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
資料卷容器
-
概念
通過--volumn-from引數,繼承父容器的全部的資料卷,從而不用-v引數來一個一個對映
-
優點
多個容器共享一份資料卷
容器C3建立了資料卷,C1和C2 使用--volumn-from繫結C3, 那麼也綁定了資料卷,此時C3奔潰資料卷的繫結關係依舊存在。 方便每次使用-v依次掛載
## 自動分配的資料卷檢視: docker inspect c3 ==> mounts節點
docker run -it --name=c3 -v /volumn centos:7
## 建立c1, c2的資料卷指向c3
docker run -it --volumes-from [容器id或name] --name c1 ylj/centos /bin/bash
docker run -it --volumes-from [容器id或name] --name c2 ylj/centos /bin/bash
具名掛載和匿名掛載資料卷
-
所有容器的資料卷在-v沒有指定宿主機的對映地址的前提下 預設都在下面這個路徑中建立
/var/lib/docker/volumes/卷名/
-
匿名掛載(資料卷不命名)
docker run -d -P --name nginx01 -v /etc/nginx nginx ## 匿名掛載 檢視掛載的卷 [root@VM-0-11-centos _data] docker volume ls DRIVER VOLUME NAME local 905e238d2ee583ac26c87ccb135c9e42c4ec6f7f7bb92cf0f8e4332b4064fa78
-
具名掛載
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx ## 匿名掛載 檢視掛載的卷 [root@VM-0-11-centos _data]# docker volume ls DRIVER VOLUME NAME local juming-nginx
-
幾種掛載方式區別
-v 路徑 ## 直接帶路徑表示是容器內的路徑 -v 卷名:容器內路徑 ## 具名掛載,資料卷在/var/lib/docker/volumes/卷名/ -v /宿主機路徑:容器內路徑 ## 指定路徑掛載 前面帶的是絕對路徑
-
卷的許可權設定(ro , rw)
## 掛載卷,同時設定卷只讀屬性(ro), 則在容器內部就不能修改資料卷內容 ## 掛載只讀許可權的資料卷,只能在宿主機中對資料捲進行修改 docker run -it --name nginx02 -P -v juming02:/etc/nginx:ro nginx
Docker Network
- 詳情見獨立章節
DockerFile
DockFile 是用來構建docker映象的構建檔案。docker daemen程式會讀取構建檔案,按照構建檔案的描述組長一個docker映象檔案
-
構建步驟
- docker build 將dockerFile構建成為一個映象
- docker run 執行映象
- docker push 釋出進行 ---》 (DockerHub 或 阿里雲映象倉庫)
-
基礎知識
-
表示註釋
- 指令都是大寫
- 目前市場已經把jar包和war包交付 --> docker映象交付
-
-
基本指令
FROM # 基礎映象 centos MAINTAINER # 映象維護者,姓名+郵箱 RUN # 映象構建時 需要執行的命令 ADD # 構建tomcat映象的話需要新增tomcat壓縮包 WORKDIR # 設定當前的工作目錄 VOLUME # 設定卷 EXPOSE # 對外埠 CMD # 指定這個容器啟動的時候要執行的命令,只有最後一個會生效 ENTRYPOINT # 指定這個容器啟動的時候要執行的命令,可以多個追加 ONBUILD # 當構建一個被繼承DockerFile 這個時候就會執行ONBUILD的指令 COPY # 類似ADD,將檔案拷貝到映象彙總 ENV # 構建時設定環境變數
-
例項
FROM centos ## 指定基礎映象 MAINTAINER yanglujian<[email protected]> ENV MYPATH /usr/local ## 設定環境變數 WORKDIR $MYPATH ## 設定工作目錄,建立容器後預設進入 RUN yum -y install vim ## 安裝vim RUN yum -y install net-tools ## 安裝網路工具 ifconfig EXPOSE 80 CMD echo $MYPATH CMD echo "----end----" CMD /bin/bash
-
構建
## 使用當前目錄(最後的點)的dockerfile 構架映象 docker build -f mycentos.dockerfile -t mycentos:0.1 . ## 構建映象時若Dockerfile存在於當前目錄下,不需要-f指定檔案 docker build -t mycentos:0.1 .
-
研究一個映象的構建歷史
docker history [映象id]
-
-
CMD作用
## dockerfile檔案內容 FROM centos ## 基礎映象 CMD ["ls","-a"] ## 建立容器時自動執行 ## 構建映象 docker build -f docker-cmd-test.dockerfile -t cmdtest . ## 執行映象,若有多個cmd,只有最後一個cmd會生效, docker run cmdtest(映象名或映象id) ## 這裡run容器 後面不加命令會執行上面的CMD命令 ## 情況1: docker run cmdtest -l ## 解析: 映象中的CMD不會執行,而是會被-l替換掉 ## 修改: docker run cmdtest ls -al 則會正常執行
-
ENTRYPOINT(注意和CMD命令區分)
## dockerfile檔案內容 FROM centos ENTRYPOINT ["ls","-a"] ## 構建映象 docker build -f docker-entrypoint-test.dockerfile -t entrypoint-test . ## 情況1: docker run entrypoint-test -l ## 解析: 此時 -l 會追加在ls -a命令後面,最終執行ls -a -l命令
-
構建自定義tomcat映象的dockerFile檔案
FROM centos ## 基礎映象 MAINTAINER yanglujian<[email protected]> ## 該檔案維護人員 COPY readme.txt /usr/local/readme.txt ## 拷貝檔案到映象 ADD jdk-8u201-linux-x64.tar.gz /usr/local/ ## 解壓檔案到指定目錄 ADD apache-tomcat-8.5.42.tar.gz /usr/local/ RUN yum -y install vim ## 安裝vim ENV MYPATH /usr/local WORKDIR $MYPATH ## 指定工作目錄 ENV JAVA_HOME /usr/local/jdk1.8.0_201 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.42 ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.42 ## 指定環境變數PATH ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin ## 暴露8080埠 EXPOSE 8080 ## 啟動容器自動執行 CMD /usr/local/apache-tomcat-8.5.42/bin/startup.sh && tail -f /url/local/apache-tomcat-8.5.42/bin/logs/catalina.out
執行
## -d 後臺執行 -p 埠對映 --name 重新命名 ## -v 目錄對映 1.webapps(方便釋出包) 2.日誌目錄(方便查詢日誌) [root@VM-0-11-centos ~]# docker run -d -p 9090:8080 --name yljtomcat -v /home/ylj/build/tomcat/test:/usr/local/apache-tomcat-8.5.42/webapps/test\ > -v /home/ylj/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-8.5.42/logs diytomcat:0.1
DockerHub
-
檢視是否登入
vim ~/.docker/config.json ## 阿里雲映象倉庫登入 sudo docker login --username=ylj_2019 registry.cn-hangzhou.aliyuncs.com
-
基本概念
- 名稱空間(一個大專案有多個映象構成,專案名為一個名稱空間)
- 倉庫(存放映象),1個倉庫隸屬於一個名稱空間
日誌
## 檢視容器指定行數10行的日誌 -t timestamp -f follower-output
docker logs -tf --tail 10 [容器id]
容器程序
## 檢視容器內部的程序資訊
docker top [容器id]