Docker 初識 1.0

wsAdmin發表於2020-05-19

一、初始 Docker

1. Docker 概念

  • Docker 是一個開源的應用容器引擎
  • 誕生於2013年初,基於Go語言實現,dotCloud公司出品(後改名Docker Inc)
  • Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後釋出
    到任何流行的Linux機器上.
  • 容器是完全使用沙箱機制,相互隔離
  • 容器效能開銷極低
  • Docker 從 17.03版本之後分為CE(Community Edition:社群版)和EE(Enterprise Edition:企業版)

    小結:Docker 是一種容器技術,主要用於解決軟體跨環境遷移部署問題

2. 安裝 Docker

說明:Docker可以執行在MAC、Windows、CentOS、UBUNTU等作業系統上,以下學習全部基於CentOS7安裝Docker.
Docker官網

# 1、yum 包更新至最新
yum update
# 2、安裝需要的軟體包,yum-util 提供 yum-config-manager功能,另外兩個是devicemapper驅動依賴的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、設定yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4、安裝docker,出現輸入的介面都輸入 y
yum install -y docker-ce
# 5、檢視docker版本,驗證是否安裝成功
docker -v

3. 架構

說明:學習Docker架構能讓我們知道Docker有哪些部分組成也就知道了我們應該怎樣操作Docker

Docker學習筆記

說明:上圖共分為三個部分,客戶端(Clients)、核心部分(Hosts),倉庫(Registries)

核心部分又包括(映象、容器)
  • 映象(Image):Docker 映象(Image),就相當於是一個 root 檔案系統。比如官方映象 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統的 root 檔案系統。
  • 容器(Container):映象(Image)和容器(Container)的關係,就像是物件導向程式設計中的類和物件的關係一樣,映象是靜態的定義,容器是映象執行時的實體。容器可以被建立、啟動、停止、刪除、暫停等。
  • 倉庫(Repository):倉庫可看成一個程式碼控制中心,用來儲存映象。

4. 配置Docker映象加速器

說明:預設情況下,都是從docker hub(https://hub.docker.com/) 上下載Docker映象,但是太慢,所以一般都會配置國內的映象加速器:USTC:中科大映象加速器(https://docker.mirrors.ustc.edu.cn) 、阿里雲、網易雲、騰訊雲

配置不同的加速器可能用到的方法也不盡相同,這裡我們以阿里雲加速器為例:

  1. 登入阿里雲官網(https://www.aliyun.com/)
  2. 點選-控制檯
  3. 搜尋“映象”
  4. 點選搜尋到的“容器映象服務”
  5. 點選“映象加速器”
    Docker 學習筆記
    Docker 學習筆記
  6. 根據操作文件進行操作,將命令貼上至命令列執行即可
  7. 檢視是否配置成功
    命令:cat /etc/docker/daemon.json

二、Docker 命令

說明:如下圖,主要介紹三部分命令;第一部分介紹如何操作Hosts部分中Docker服務(daemon)即後臺守護程式,第二部分介紹如何操作映象(image),第三部分介紹如何操作容器(container)
Docker 學習筆記

1. Docker 服務相關命令

  • 啟動Docker服務
    systemctl start docker
  • 停止Docker服務
    systemctl stop docker
  • 重啟Docker服務
    systemctl restart docker
  • 檢視Docker服務狀態
    systemctl status docker
  • 設定開機啟動Docker服務
    systemctl enable docker

2. Docker 映象相關命令

  • 檢視映象:檢視本地所有的映象
    # 檢視所有映象
    docker images
    # 檢視所有映象的id
    docker images -q
  • 搜尋映象:從Docker Hub官網中查詢需要的映象
    docker search 映象名稱
  • 拉取映象:從Docker倉庫下載映象到本地,映象名稱格式為 名稱:版本號,如果不指定版本號則預設為最新版本。如果不知道映象版本,可以去Docker hub搜尋對應的映象檢視。
    docker pull 映象名稱
  • 刪除映象:刪除本地映象
    # 根據id刪除指定本地映象
    docker rmi 映象id
    # 刪除所有本地映象
    docker rmi `docker images -q`

3. 容器相關命令

說明:前面我們說過映象與容器的關係;容器是透過執行映象檔案來建立的,容器是映象執行時的實體。

  • 檢視容器
    # 檢視正在執行的容器
    docker ps
    # 檢視所有容器
    docker ps -a
  • 建立並啟動容器
    docker run -引數 --name=容器名稱 映象名稱:映象版本 進入容器的初始化指令
    # 例1:建立完成後自動進入容器,並且退出容器後容器自動關閉
    docker run -it --name=c1 centos:7 /bin/bash
    # 例2:建立完成後不會立即進入容器,需要透過鍵入命令的方式進入容器,並且退出容器後容器不會自動關閉,它會繼續在後臺執行
    docker run -id --name=c2 centos:7
    # 引數說明:
    # -i:保持容器執行。通常與 -t 同時使用。加入it這兩個引數後,容器建立後自動進入容器中,退出容器後,容器自動關閉。
    # -t:為容器重新分配一個偽輸入終端,通常與-i同時使用。
    # -d:以守護(後臺)模式執行容器。建立一個容器在後臺執行,需要使用docker exec進入容器。退出後,容器不會關閉。
    # -it:建立的容器一般稱為互動式容器,-id建立的容器一般稱為守護式容器。
    # --name:為建立的容器命名。
    # 如若不寫映象版本號則預設為最新版本
  • 進入容器
    docker exec 引數 容器名稱 初始化命令
    例:docker exec -it c2 /bin/bash
  • 退出容器
    exit;
  • 停止容器
    docker stop 容器名稱或者容器ID
  • 啟動容器
    docker start 容器名稱或者容器ID
  • 刪除容器
    # 如果容器是執行狀態則刪除失敗,需要先停止容器執行才能刪除
    docker rm 容器名稱或者容器ID
  • 檢視容器資訊
    docker inspect 容器名稱或者容器ID

三、Docker 容器的資料卷

1. 資料卷概念及作用

思考:

  • Docker 容器刪除後,在容器中產生的資料還在嗎?
  • Docker 容器和外部機器可以直接交換檔案嗎?
  • 容器之間如何進行資料互動

資料卷:

  • 資料卷是宿主機中的一個目錄或檔案
  • 當容器目錄和資料卷目錄繫結後,雙方不管誰發生變動都會立即同步至另一方
  • 一個資料卷可以繫結多個容器
  • 一個容器也可以繫結多個資料卷


資料卷作用:

  • 容器資料持久化
  • 外部機器和容器間接通訊
  • 容器之間資料交換

2. 配置資料卷

  • 建立啟動容器時,使用-v引數設定資料卷
    docker run -v 宿主機目錄(檔案):容器內目錄(檔案)
    //例1:繫結一個資料卷
    docker run -it --name=c1 -v /root/data:/root/data_container centos:7 /bin/bash
    //例2:繫結多個資料卷
    docker run -it --name=c2 -v /root/data2:/root/data_container2 -v /root/data3:/root/data_container3 centos:7 /bin

    注意:
    1.目錄(檔案)必須是絕對路徑;
    2.如果目錄不存在,會自動建立;
    3.可以繫結多個資料卷

    初學時可以自己在虛擬機器內實踐一下,將虛擬機器作為宿主機,在宿主機內建立多個容器並繫結資料卷,看資料能否交換與持久化

3. 資料卷容器

描述:如上圖,容器C1、C2、C3本質並沒有不同,只是C3與宿主機中的資料卷繫結,C1、C2與C3繫結,這樣一來,C1、C2相當於與資料卷繫結。

//1.首先建立C3容器
docker run -it --name=c3 -v /root/data:/root/volume centos:7
//2.建立C1、C2容器,並使用--volumes-from引數與C3繫結
docker run -it --name=c2 --volumes-from c3 centos:7
docker run -it --name=c1 --volumes-from c3 centos:7

例項:在c2 的/root/volume中建立檔案c.txt,檔案同時會出現在c1、c3與宿主機的/root/data目錄中。可自行操作進行驗證

四、Docker 應用部署

1. MySQL 部署

部署步驟:

  • 搜尋mysql映象
  • 拉取mysql映象
  • 建立容器
  • 操作容器中的mysql
    注意:因為容器內的網路服務和外部機器不能直接通訊,但是,外部機器可以與容器的宿主機通訊,所以,如果需要外部機器訪問容器內服務時,需要將容器中提供服務的埠對映到宿主機的埠上,使外部機器訪問宿主機的該埠,從而間接訪問容器的服務。這種操作成為:埠對映。
  1. 搜尋映象
    docker search mysql
  2. 拉去映象
    docker pull mysql:5.7
  3. 建立映象
    # 在/root目錄下建立mysql目錄用於儲存mysql資料資訊
    mkdir /root/mysql
    # 建立容器的命令
    docker run -id -p 3307:3306 --name=mysql -v /root/mysql/conf:/etc/mysql/conf.d -v /root/mysql/logs:/logs -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
  • 引數說明:
    • -p 3307:3306:將容器的3306埠對映到宿主機的3307埠(並非必須要對映到3307埠)。
    • -v /root/mysql/conf:/etc/mysql/conf.d:將宿主機的/root/mysql/conf目錄與容器的/etc/mysql/conf.d進行繫結掛載,這是mysql的配置目錄。
    • -v /root/mysql/logs:/logs:將宿主機的/root/mysql/logs的目錄與容器的/logs進行繫結掛在,用於存放日誌。
    • -v /root/mysql/data:/var/lib/mysql:將宿主機/root/mysql/data目錄與容器/var/lib/mysql進行繫結掛載,這是資料目錄。
    • -e MYSQL_ROOT_PASSWORD=123456:初始化root使用者的密碼
  1. 進入容器,操作MySQL
    # 進入容器的命令
    docker exec -it mysql /bin/bash
    # 進入MySQL
    mysql -uroot -p123456
    # 列印資料表
    show databases;
  2. 外部機器連線容器中的MySQL
    外部機器連線容器中的MySQL

2. Tomcat 部署

  1. 搜尋tomcat映象
    docker search tomcat
  2. 拉取tomcat映象
    docker pull tomcat
  3. 建立容器,設定埠對映、目錄對映
    # 在/root目錄下建立tomcat目錄用於儲存tomcat資料資訊
    mkdir /root/tomcat
    cd /root/tomcat
    # 建立並執行容器
    docker run -id --name=tomcat -p 8080:8080 -v /root/tomcat:/usr/local/tomcat/webapps tomcat
  • 引數說明:
    • -p 8080:8080:將容器的8080埠對映到主機的8080埠
    • -v /root/tomcat:/usr/local/tomcat/webapps:將主機中Tomcat目錄掛載到容器webapps目錄
  1. 使用外部機器訪問Tomcat:例
    # 在宿主機的tomcat目錄下建立檔案
    mkdir /root/tomcat/test
    # 建立index.html
    vim /root/tomcat/test/index.html
    使用外部機器訪問Tomcat

3. Nginx 部署

  1. 搜尋nginx映象

    docker search nginx
  2. 拉取nginx映象

    docker pull nginx
  3. 建立容器,設定埠對映、目錄對映

    # 在/root目錄下建立nginx目錄用於儲存nginx資料資訊
    mkdir /root/nginx
    mkdir /root/nginx/conf
    cd /root/nginx/conf
    # 在/root/nginx/conf/下建立nginx.conf檔案,貼上下面內容
    vim nginx.conf
    user  nginx; # 設定nginx服務的系統使用使用者
    worker_processes  1; # 工作程式數
    error_log  /var/log/nginx/error.log warn;  # nginx的錯誤日誌
    pid        /var/run/nginx.pid; # nginx啟動時候的pid
    events {
     worker_connections  1024; # 每個程式允許的最大連線數
    }
    http { # http請求配置,一個http可以包含多個server
    
     #定義 Content-Type
     include       /etc/nginx/mime.types;
     default_type  application/octet-stream;
    
     # 日誌格式 此處main與access_log中的main對應
     # $remote_addr:客戶端地址
     # $remote_user:http客戶端請求nginx認證的使用者名稱,預設不開啟認證模組,不會記錄
     # $timelocal:nginx的時間
     # $request:請求method + 路由 + http協議版本
     # status:http reponse 狀態碼
     # body_bytes_sent:response body的大小
     # $http_referer:referer頭資訊引數,表示上級頁面
     # $http_user_agent:user-agent頭資訊引數,客戶端資訊
     # $http_x_forwarded_for:x-forwarded-for頭資訊引數
     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                       '$status $body_bytes_sent "$http_referer" '
                       '"$http_user_agent" "$http_x_forwarded_for"';
    
     #訪問日誌,後面的main表示使用log_format中的main格式記錄到access.log中
     access_log  /var/log/nginx/access.log  main;
    
     #nginx的一大優勢,高效率檔案傳輸
     sendfile        on;
     #tcp_nopush     on;
    
     #客戶端與服務端的超時時間,單位秒
     keepalive_timeout  65;
    
     #gzip  on;
    
     server { #http服務,一個server可以配置多個location
             listen       80; #服務監聽埠
             server_name  localhost; #主機名、域名
    
             #charset koi8-r;
             #access_log  /var/log/nginx/host.access.log  main;
    
             location / {
                 root   /usr/share/nginx/html; #頁面存放目錄
                 index  index.html index.htm; #預設頁面
             }
    
             #error_page  404              /404.html;
    
             # 將500 502 503 504的錯誤頁面重定向到 /50x.html
             error_page   500 502 503 504  /50x.html;
             location = /50x.html { #匹配error_page指定的頁面路徑
                 root   /usr/share/nginx/html; #頁面存放的目錄
             }
    
             # proxy the PHP scripts to Apache listening on 127.0.0.1:80
             #
             #location ~ \.php$ {
             #    proxy_pass   http://127.0.0.1;
             #}
    
             # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
             #
             #location ~ \.php$ {
             #    root           html;
             #    fastcgi_pass   127.0.0.1:9000;
             #    fastcgi_index  index.php;
             #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
             #    include        fastcgi_params;
             #}
    
             # deny access to .htaccess files, if Apache's document root
             # concurs with nginx's one
             #
             #location ~ /\.ht {
             #    deny  all;
             #}
         }
    
     include /etc/nginx/conf.d/*.conf;
    }
    # 建立並執行Nginx容器
    docker run -id --name=nginx -p 80:80 -v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /root/nginx/logs:/var/log/nginx -v /root/nginx/html:/usr/share/nginx/html nginx
  • 引數說明:
    • -p 80:80:將容器的80埠對映到宿主機的80 埠。
    • -v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:將主機下的 /root/nginx/conf/nginx.conf掛載到容器的:/etc/nginx/nginx.conf。配置目錄
    • -v /root/nginx/logs:/var/log/nginx:將主機下的/root/nginx/logs目錄掛載到容器的/var/log/nginx。日誌目錄
  1. 使用外部機器訪問Nginx服務:例
    # 在宿主機的 /root/nginx/html/ 目錄下建立index.html檔案
    cd /root/nginx/html
    vim index.html
    外部機器訪問Nginx服務

4. Redis 部署

  1. 搜尋redis映象
    docker search redis
  2. 拉取redis映象
    docker pull redis:5.0.9
  3. 建立容器,設定埠對映
    docker run -id --name=redis -p 6379:6379 redis:5.0.9
  4. 使用外部機器連線redis
    # 安裝redis並執行 redis-cli.exe 連線宿主機上的redis容器
    redis-cli.exe -h 宿主機IP地址 -p 繫結的宿主機埠

五、Dockerfile

Docker 映象本質是一個分層檔案系統。

1. 映象製作

  1. 容器轉為映象
    docker commit 容器ID 映象名稱:版本號
  2. 映象轉為壓縮檔案
    # 因為映象是不可以傳輸的,所以需要將映象轉為壓縮檔案
    docker save -o 壓縮檔名稱 映象名稱:版本號
  3. 壓縮檔案轉為映象
    # 將由映象生產的壓縮檔案再轉為映象
    docker load -i 壓縮檔名稱

2. Dockerfile

2.1 概述:

Dockerfile是一個文字檔案,它裡面包含了一條條的指令,每一條指令構建一層。Dockerfile基於基礎映象,最終構建出一個新的映象來。對於開發人員來說,可以透過Dockerfile為開發團隊提供一個或多個完全一致的開發環境,便於專案的測試與運維。

2.2 關鍵字:

關鍵字 作用 備註
FROM 指定父映象 指定dockerfile基於那個image構建
MAINTAINER 作者資訊 用來標明這個dockerfile誰寫的
LABEL 標籤 用來標明dockerfile的標籤 可以使用Label代替Maintainer 最終都是在docker image基本資訊中可以檢視
RUN 執行命令 執行一段命令 預設是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,”param2”]
CMD 容器啟動命令 提供啟動容器時候的預設命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD [“command” , “param1”,”param2”]
ENTRYPOINT 入口 一般在製作一些執行就關閉的容器中會使用
COPY 複製檔案 build的時候複製檔案到image中
ADD 新增檔案 build的時候新增檔案到image中 不僅僅侷限於當前build上下文 可以來源於遠端服務
ENV 環境變數 指定build時候的環境變數 可以在啟動的容器的時候 透過-e覆蓋 格式ENV name=value
ARG 構建引數 構建引數 只在構建的時候使用的引數 如果有ENV 那麼ENV的相同名字的值始終覆蓋arg的引數
VOLUME 定義外部可以掛載的資料卷 指定build的image那些目錄可以啟動的時候掛載到檔案系統中 啟動容器的時候使用 -v 繫結 格式 VOLUME [“目錄”]
EXPOSE 暴露埠 定義容器執行的時候監聽的埠 啟動容器的使用-p來繫結暴露埠 格式: EXPOSE 8080 或者 EXPOSE 8080/udp
WORKDIR 工作目錄 指定容器內部的工作目錄 如果沒有建立則自動建立 如果指定/ 使用的是絕對地址 如果不是/開頭那麼是在上一條workdir的路徑的相對路徑
USER 指定執行使用者 指定build或者啟動的時候 使用者 在RUN CMD ENTRYPONT執行的時候的使用者
HEALTHCHECK 健康檢查 指定監測當前容器的健康監測的命令 基本上沒用 因為很多時候 應用本身有健康監測機制
ONBUILD 觸發器 當存在ONBUILD關鍵字的映象作為基礎映象的時候 當執行FROM完成之後 會執行 ONBUILD的命令 但是不影響當前映象 用處也不怎麼大
STOPSIGNAL 傳送訊號量到宿主機 該STOPSIGNAL指令設定將傳送到容器的系統呼叫訊號以退出。
SHELL 指定執行指令碼的shell 指定RUN CMD ENTRYPOINT 執行命令的時候 使用的shell

2.3 案例1

自定義centos7映象:
要求:1. 預設登入路徑為 /usr;2. 可以使用vim
因為官方提供的centos7映象建立容器後不能在容器內使用vim,並且進入容器預設目錄為/

實現步驟:

  • 定義父映象:FROM centos:7
  • 定義作者資訊:MAINTAINER itheima <itheima@itcast.cn>
  • 執行安裝vim命令: RUN yum install -y vim
  • 定義預設的工作目錄:WORKDIR /usr
  • 定義容器啟動執行的命令:CMD /bin/bash
  • 透過dockerfile構建映象:docker bulid –f dockerfile檔案路徑 –t 映象名稱:版本 .
# 在宿主機的/root目錄下建立dockerfile資料夾用於存放dockerfile檔案
mkdir /root/dockerfile

# 建立dockerfile
touch my_sentos7

# 將以下內容寫入 my_sentos7 檔案
FROM centos:7
MAINTAINER ws <18595476026@163.com>
RUN yum install -y vim
WORKDIR /usr
CMD /bin/bash

# 執行構建映象的命令
docker build -f /root/dockerfile/my_sentos7 -t myself_centos7:1.0 .

# 檢視本地映象
docker images

# 透過 myself_centos7:1.0 映象構建容器
docker run -id --name=myself_centos7 myself_centos7:1.0

# 進入容器
docker exec -it myself_centos7 /bin/bash

# 此時預設進入容器的 /usr 目錄,並且可以使用 vim 命令

3. 服務編排

概述:按照一定的業務規則批次管理容器

3.1 Docker Compose 安裝使用

Docker Compose 是一個編排多容器分散式部署的工具,提供命令集管理容器化應用的完整開發週期,包括服務構建,啟動和停止。

使用步驟:

  • 利用 Dockerfile 定義執行環境映象
  • 使用 docker-compose.yml 定義組成應用的各服務
  • 執行 docker-compose up 啟動應用
  1. 安裝 Docker Compose

    # Compose目前已經完全支援Linux、Mac OS和Windows,在安裝Compose之前,需要先安裝Docker。下面我 們以編譯好的二進位制包方式安裝在Linux系統中。 
    curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    # 設定檔案可執行許可權 
    chmod +x /usr/local/bin/docker-compose
    # 檢視版本資訊 
    docker-compose -version
  2. 解除安裝 Docker Compose

    # 二進位制包方式安裝的,刪除二進位制檔案即可
    rm /usr/local/bin/docker-compose

六、Docker 私有倉庫

1. 搭建 Docker 私有倉庫

  1. 拉取私有倉庫映象

    docker pull registry
  2. 啟動私有倉庫容器

    docker run -id --name=registry -p 5000:5000 registry
  3. 驗證是否搭建成功

    # 開啟瀏覽器 輸入地址http://私有倉庫伺服器ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有倉庫 搭建成功
  4. 修改daemon.json

    # 開啟並編輯檔案
    vim /etc/docker/daemon.json
    # 將下面內容新增至檔案中
    {"insecure-registries":["私有倉庫伺服器ip:5000"]}
    # 例:
    {
    "registry-mirrors": ["https://r5w4t6kd.mirror.aliyuncs.com"],//原內容
    "insecure-registries": ["192.168.118.130:5000"]//新增的內容
    }
    # 作用:用於讓 docker 信任私有倉庫地址;注意將私有倉庫伺服器ip修改為自己私有倉庫伺服器真實ip
  5. 重啟 docker 服務

    systemctl restart docker
    docker start registry

2. Docker 私有倉庫-上傳映象

1.標記映象為私有倉庫的映象

# 命令:
docker tag 映象名稱:映象版本號 私有倉庫伺服器IP:5000/映象名稱:映象版本號
# 例:
docker tag centos:7 192.168.118.130:5000/centos:7
  1. 上傳標記的映象
    # 命令:
    docker push 私有倉庫伺服器IP:5000/映象名稱:映象版本號
    # 例:
    docker push 192.168.118.130:5000/centos:7

3. Docker 私有倉庫-拉取映象

  1. 拉取映象
    # 命令:
    docker pull 私有倉庫伺服器ip:5000/centos:7
    # 例:
    docker pull 192.168.118.130:5000/myself_centos7:1.0

學習資料來源

本作品採用《CC 協議》,轉載必須註明作者和本文連結