1. 程式人生 > 實用技巧 >docker基礎總結

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映象檔案

  • 構建步驟

    1. docker build 將dockerFile構建成為一個映象
    2. docker run 執行映象
    3. docker push 釋出進行 ---》 (DockerHub 或 阿里雲映象倉庫)
  • 基礎知識

    1. 表示註釋

    2. 指令都是大寫
    3. 目前市場已經把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
    
    1. 構建

      ## 使用當前目錄(最後的點)的dockerfile 構架映象
      docker build -f mycentos.dockerfile -t mycentos:0.1 .
      
      ## 構建映象時若Dockerfile存在於當前目錄下,不需要-f指定檔案
      docker build -t mycentos:0.1 .
      
    2. 研究一個映象的構建歷史

      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. 名稱空間(一個大專案有多個映象構成,專案名為一個名稱空間)
    2. 倉庫(存放映象),1個倉庫隸屬於一個名稱空間

日誌

## 檢視容器指定行數10行的日誌 -t timestamp   -f follower-output
docker logs -tf --tail 10 [容器id]

容器程序

## 檢視容器內部的程序資訊
docker top [容器id]