Docker 專題總結

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 
    

    //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<[email protected]>
    
    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 來查看下默認生成的容器卷對應的宿主機目錄,通過新建文件和 修改,實現容器卷同步