Docker 專題總結

DOONDO發表於2021-03-16

Docker 專題總結

Docker 的基本命令

  • 啟動 Docker

    $ systemctl start docker
    
  • 停止Docker

    $ systemctl stop docker
    
  • 重啟Docker

    $ systemctl restart docker
    
  • 開啟自啟動Docker

    $ systemctl enable docker
    
  • 檢視Docker的概要資訊

    $ docker info
    
  • 檢視Docker的幫助文件

    $ docker --help
    
  • 檢視Docker的版本資訊

    $ docker version
    

Docker 映象的常用命令

  • docker images 列出本機所有映象

    $ docker images
    

    列出本機所有映象 :

    標籤 說明
    REPOSITORY 映象的倉庫源
    TAG 映象的標籤(版本)同一個倉庫有多個TAG的映象,多個版本;我們用REPOSITORY:TAG來定義不同的映象;
    IMAGE ID 映象ID,映象的唯一標識
    CREATE 映象建立時間
    SIZE 映象大小

    列出映象可選引數

    OPTIONS 可選引數:
    -a 顯示所有映象(包括中間層)
    -q 只顯示映象ID
    -qa 可以組合
    --digests 顯示映象的摘要資訊
    --no-trunc 顯示完整的映象資訊
  • docker search 搜尋映象

    $ docker search 
    

    https://hub.docker.com/ 這裡的搜尋效果一樣;

    OPTIONS可選引數:

    可選引數 說明
    --no-trunc 顯示完整的映象描述
    -s 列出收藏數不小於指定值的映象
    --automated 只列出Docker Hub自動構建型別的映象
  • docker pull 下載映象

    docker pull 映象名稱:[TAG]
    

    注意:不加TAG,預設下載最新版本latest

  • 刪除單個映象

    # 1,刪除單個:
    docker rmi 映象名稱:[TAG]
    

    如果不寫TAG,預設刪除最新版本latest

    有映象生成的容器再執行時候,會報錯,刪除失敗;

    我們需要加 -f 強制刪除

  • docker rmi -f 映象名稱1:[TAG] 映象名稱2:[TAG]

    $ docker rmi -f 映象名稱1:[TAG] 映象名稱2:[TAG]
    
  • 刪除全部

    $ docker rmi -f $(docker images -qa)
    

Docker容器常用命令

  • 檢視正在執行的容器

    $ docker ps [OPTIONS]
    
    $ docker ps 檢視正在執行的容器
    
    $ docker ps -a 檢視所有容器
    
    $ docker ps -n 2  顯示最近建立的2個容器
    
    $ docker ps -f status=exited 檢視停止的容器
    

    OPTIONS說明:

    -a :顯示所有的容器,包括未執行的。

    -f :根據條件過濾顯示的內容。

    --format :指定返回值的模板檔案。

    -l :顯示最近建立的容器。

    -n :列出最近建立的n個容器。

    --no-trunc :不截斷輸出。

    -q :靜默模式,只顯示容器編號。

    -s :顯示總的檔案大小。

  • 容器停止退出

    $ exit  	#容器停止退出
    
    $ ctrl + P + Q   #容器不停止退出
    
  • 進入容器

    $ docker attach 容器ID or 容器名 
    
  • 啟動容器

    $ docker start 容器ID or 容器名
    
  • 重啟容器

    $ docker restart 容器ID or 容器名
    
  • 停止容器

    $ docker stop 容器ID or 容器名
    
    #暴力刪除,直接殺掉程式 (不推薦)
    docker kill 容器ID or 容器名
    
  • 刪除容器

    $ docker rm 容器ID  
    
    #如果刪除正在執行的容器,會報錯,我們假如需要刪除的話,需要強制刪除;
    $ docker rm -f 容器ID
    
    #刪除多個容器 
    $ docker rm -f 容器ID1  容器ID2 中間空格隔開
    
    #刪除所有容器
    docker rm -f $(docker ps -qa)
    
  • docker宿主機和容器間檔案拷貝

    #宿主機檔案 copy to 容器內
    docker cp 需要拷貝的檔案或者目錄   容器名稱:容器目錄
    # 比如 docker cp /home/data/001.jpg 6498bcb8d66f /home/data/001.jpg
    
    #容器內 copy to 宿主機
    docker cp 容器名稱:容器目錄    宿主機目錄
    
  • docker 檢視容器日誌

    $ docker logs [OPTIONS] CONTAINER
    #也可以去docker日誌檔案目錄查詢,docker日誌檔案目錄 /var/lib/docker/containers/ 
    

    Options:

    --details 顯示更多的資訊

    -f, --follow 跟蹤實時日誌

      --since string  顯示自某個timestamp之後的日誌,或相對時間,如42m(即42分鐘)
    
      --tail string  從日誌末尾顯示多少行日誌, 預設是all
    

    -t, --timestamps 顯示時間戳

      --until string  顯示自某個timestamp之前的日誌,或相對時間,如42m(即42分鐘)
    
  • docker 檢視容器程式

    $ docker top 容器ID
    
  • docker 進入容器執行命令,直接操作容器,執行完 回到 宿主主機終端;

    我們一般用於 啟動容器裡的應用 比如 tomcat nginx redis elasticsearch等等

    $ docker exec -it 容器名稱 或者 容器ID /bin/bash
    
  • 提交執行時容器成為映象

    docker commit -a='作者' -m='備註' 執行時容器ID 新映象名稱
    
  • 容器埠對映

    # 埠對映;
    $ docker run -it -p 8888:8080 映象ID
    $ docker run -it -P 映象ID
    
  • 建立並啟動容器

    $ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    # 啟動普通容器
    $ docker run --name 別名 映象ID
    # 啟動互動式容器 執行一個容器 取別名 互動模式執行 以及分配一個偽終端
    $ dokcer run -it --name 別名 映象ID 
    # 守護式方式建立並啟動容器,執行完命令後,終端依然再宿主機上;
    $ docker run -di --name 別名 映象ID
    #啟動容器,並執行/bin/bash命令;
    $ docker run -it --name 別名 映象ID  /bin/bash命令
    

    --name="容器新名字":為容器指定一個名稱;

    -i:以互動模式執行容器,通常與-t或者-d同時使用;

    -t:為容器重新分配一個偽輸入終端,通常與-i同時使用;

    -d: 後臺執行容器,並返回容器ID;

    -P: 隨機埠對映,容器內部埠隨機對映到主機的埠

    -p: 指定埠對映,格式為:主機(宿主)埠:容器埠

Docker目錄掛載

  • 簡介:容器目錄掛載,我們可以在建立容器的時候,將宿主機的目錄與容器內的目錄進行對映,這樣我們就可以實現宿主機和容器目錄的雙向自動同步;

  • 作用:前面的 cp 命令來實現資料傳遞,這種方式比較麻煩;我們通過容器目錄掛載,能夠輕鬆實現程式碼上傳,配置修改,日誌同步等需求;

  • 語法:

    #單個目錄掛載
    $ docker run -it -v  /宿主機目錄:/容器目錄 映象名
    
    #多個目錄掛載
    $ docker run -it -v /宿主機目錄:/容器目錄 -v /宿主機目錄2:/容器目錄2  映象名
    
    #掛載目錄只讀:
    $ docker run -it -v  /宿主機目錄:/容器目錄:ro 映象名
    

注意:

如果同步的是多級目錄,可能會出現許可權不足的提示;

這是因為Centos7中的安全模組selinux把許可權禁掉了,我們需要在啟動命令後新增 --privileged=true 來解決掛載的目錄沒有許可權的問題;

Docker tomcat埠對映的坑

問題描述:啟動容器後,外網無法對映訪問 Tomcat

排查思路:

  1. 檢視firewall-cmd --state,新增策略對外開啟指定的埠

    #檢視
    firewall-cmd --list-ports
    firewall-cmd --list-services
    
    #新增策略
    firewall-cmd --add-port=5000/tcp --permanent
    firewall-cmd --remove-port=5000/tcp --permanent
    firewall-cmd --reload
    
  2. 檢視 sysctl net.ipv4.ip_forward 是否轉發 0-未轉發 1-轉發

  3. 檢視容器 tomcat的 webapp目錄下是否存在檔案,講webapp.dist目錄內檔案 拷貝至wepapp

Docker 配置 Tomcat

  • 配置思路:先進行映象的拉取安裝,然後指定埠啟動並進入容器。在本地建立Tomcat 同級目錄,並將容器Tomcat目錄下內容拷貝至宿主機,再進行宿主機與容器之間的掛載,這樣容器與宿主機間的資料關係就同步了。

  • 配置步驟:

    1. 安裝映象並執行容器

      $ docker pull tomcat:8.5.31
      $ docker run -di -p 8888:8080 映象id
      
    2. 宿主機裡home目錄下新建tomcat目錄,複製容器裡conf,webapps到宿主機

      $ docker cp  容器id:/usr/local/tomcat/conf  /home/tomcat/
      $ docker cp  容器id::/usr/local/tomcat/webapps  /home/tomcat/
      
    3. 把容器裡的tomcat裡的webapp,logs,conf掛載到宿主機tomcat目錄下,方便上傳程式碼,同步持久化日誌,以及方便配置tomcat;關掉容器,啟動容器;

      $ docker run -d --name 容器名稱 -p 80:8080 -v /home/tomcat/conf/:/usr/local/tomcat/conf/  
                                               -v /home/tomcat/webapps/:/usr/local/tomcat/webapps/ 
                                               -v /home/tomcat/logs/:/usr/local/tomcat/logs/ 映象名稱
      
    4. 配置tomcat server.xml 以及 同步上傳war包

      <Context path="" docBase="/usr/local/tomcat/webapps/WebTest" debug="0" reloadable="true" /> 
      

Docker 配置 MySQL

  • 簡介:docker安裝MySQL 和 安裝Tomcat 差不太多,這邊主要介紹下配置思路

  • 安裝步驟:

    1. 拉取需要的MySQL映象

      $ docker pull mysql:5.7
      
    2. 建立宿主機掛載目錄,儲存MySQL配置檔案、資料檔案及相關日誌資訊

      $ docker cp  容器id:/etc/mysql/conf.d  /home/mysql/
      $ docker cp  容器id:/var/log  /home/mysql/
      $ docker cp  容器id:/var/lib/mysql  /home/mysql/ 
      
    3. 建立並執行容器,埠指定,目錄掛載

      $ docker run -p 3306:3306  -d  -v /etc/mysql/conf.d/:/home/mysql/conf/ 
      -v /var/log:/home/mysql/log/   -v /var/lib/mysql/:/home/mysql/mysql/ 
      -e MYSQL_ROOT_PASSWORD=123456  映象ID
      
    4. 用sqlyog連線docker裡的資料庫,匯入sql指令碼

  • 注意事項:

    • 執行的專案裡的資料庫連線地址,要寫docker裡的mysql容器所在的虛擬IP地址;容器間通訊IP;

      # 檢視 inspect中的  "IPAddress": "172.17.0.2" 資訊 專案中locahost 替換為容器IPAddress 地址
      $ docker inspect 容器ID 
      

Docker遷移與備份

  • 大公司開發過程中,經常自定義映象,然後commit提交成映象到本地倉庫,但是我們釋出到客戶伺服器的時候,可以用前面講得釋出到hub官方,或者阿里雲,但是有些機密性的專案,是禁止公網儲存的,所以我們只能通過docker映象備份和遷移實現。

  • 實現方式:

    #備份映象
    $ docker save -o 備份映象的名稱  源映象名稱:tag版本
    比如: $ docker save -o mytomcat7.1.tar java1234/tomcat7:7.1
    
    #將打好的tar 進行sftp或網路傳輸 可實現自定義映象的恢復 
    $ docker load -i 映象檔案
    比如:$ docker load -i mytomcat7.1.tar
    

DockerFile

  • 簡介:

    Dockerfile是由一系列命令和引數構成的指令碼,這些命令應用於作業系統(centos或者Ubuntu)基礎映象並最終建立的一個新映象;通過用手工的方式,修改配置檔案,或者新增,刪除檔案目錄的方式,來構建一種新映象;這種手工方式麻煩,容易出錯,而且不能複用;Dockerfile使用指令碼方式來構建自動化,可複用的,高效率的建立映象方式,是企業級開發的首選方式;

    在軟體系統開發生命週期中,採用Dockerfile來構建映象;

    1、對於開發人員:可以為開發團隊提供一個完全一致的開發環境;

    2、對於測試人員:可以直接拿開發時所構建的映象或者通過Dockerfile檔案構建一個新的映象開始工作;

    3、對於運維人員:在部署時,可以實現應用的無縫移植。

  • DockerFile常用指令

    #定義了使用哪個基礎映象啟動構建流程
    FROM image_name:tag
    
    #宣告映象維護者資訊
    MAINTAINER user_info 
    
    #設定環境變數(可以寫多條)
    ENV key value
    
    #構建容器時需要執行的命令(可以寫多條)
    RUN command
    
    #設定終端預設登入進來的工作目錄
    WORKDIR path_dir
    
    #當前容器對外暴露出的埠
    EXPOSE port
    
    #將宿主機的檔案複製到容器內,如果是一個壓縮檔案,將會在複製後自動解壓
    ADD source_dir/file dest_dir/file
    
    #和ADD相似,但是如果有壓縮檔案是不能解壓
    COPY source_dir/file dest_dir/file
    
    #建立一個可以從本地主機或其他容器掛載的掛載點,一般用來存放資料庫和需要保持的資料等
    VOLUME
    
    #指定容器啟動時要執行的命令,假如有多個CMD,最後一個生效
    CMD
    
    #指定容器啟動時要執行的命令
    ENTRYPOINT
    
    #當構建一個被繼承的Dockerfile時執行的命令,父映象在被子映象繼承後父映象的onbuild被觸發。可以把ONBUID理解為一個觸發器。
    ONBUILD
    
  • DockerFile構建自定義CentOS

    #第一步:編寫DockerFile
    
    FROM centos
    MAINTAINER zhangtao<zhangtao2021@126.com>
    
    LABEL name="zhangtao CentOS Image" \
    
        build-date="20210316"
    
    ENV WORKPATH /home/
    WORKDIR $WORKPATH
    
    
    RUN yum -y install net-tools
    RUN yum -y install vim
    
     
    
    EXPOSE 80
    CMD /bin/bash
    
    #2.通過DockerFile構建映象
    構建 docker build -f myCentosDockerFile -t zhangtao/mycentos:1.1 .
    
    #3:測試執行映象
    執行 docker run -it 映象ID
    
    #4.檢視映象歷史
    檢視映象歷史  docker history 映象ID
    

DockerFile通過VOLUME實現容器卷

  • 簡介:前面用啟動命令 -v 宿主機目錄:容器卷目錄 來實現容器卷目錄掛載。但是由於定義Dockerfile的時候,並不能保證在所有的宿主機上都有這樣的特定目錄,所以在Dockerfile定義中,只能指定容器卷目錄;

  • 語法:

    #編寫DockerFile
    
    FROM centos
    
    VOLUME ["/home/v1","/home/v2"]
    
    CMD /bin/bash
    
    #構建
    $ docker build -f myVolumeDockerFile -t zhangtao/myTest:1.1 .
    
    #執行 
    $ docker run -it  映象ID
    
    

    容器執行後,進入home目錄,找到v1,v2兩個容器卷目錄;然後我們通過 docker inspect 容器ID 來檢視下預設生成的容器卷對應的宿主機目錄,通過新建檔案和 修改,實現容器卷同步

相關文章