Docker基本介紹及使用

善良的死神發表於2021-07-14

相關網站

  1. Docker官網
  2. Docker中文網站
  3. Docker Hub官網:
  4. 技術文件

安裝 Docker

  1. 根據具體環境進行安裝
  2. 映象加速器

Docker介紹

為什麼要使用 Docker

  1. 更高效的利用系統資源
  2. 更快速的啟動時間
  3. 一致的執行環境
  4. 持續交付和部署
  5. 更輕鬆的遷移
  6. 更輕鬆的維護和擴充套件

對比傳統虛擬機器總結

特性 容器 虛擬機器
啟動 秒級 分鐘級
硬碟使用 一般為 MB 一般為 GB
效能 接近原生 弱於
系統支援量 單機支援上千個容器 一般幾十個

Docker是一個Client-Server結構的系統,Docker守護程式執行在主機上, 然後通過Socket連線從客戶端訪問,守護程式從客戶端接受命令並管理執行在主機上的容器。 容器,是一個執行時環境,就是我們前面說到的集裝箱。

Docker 架構圖

基礎概念

Docker 分為三個基本概念 映象容器倉庫

映象

Docker 映象(Image)就是一個只讀的模板。映象可以用來建立 Docker 容器,一個映象可以建立很多容器。
Docker 映象都是隻讀的,當容器啟動時,一個新的可寫層被載入到映象的頂部,這一層通常被稱作“容器層”,“容器層”之下的都叫“映象層”。

常用命令

  1. docker images 檢視當前映象
    • -a :列出本地所有的映象(含中間映像層)
    • -q :只顯示映象ID。
    • –digests :顯示映象的摘要資訊
    • –no-trunc :顯示完整的映象資訊
  2. docker search nginx 查詢 https://hub.docker.com 的映象
    • –no-trunc : 顯示完整的映象描述
    • -s : 列出收藏數不小於指定值的映象。
    • –automated : 只列出 automated build型別的映象;
  3. docker pull nginx:latest 拉去遠端映象到本地
  4. docker rmi -f nginx:latest 刪除本地映象
    • docker rmi -f 映象名1:TAG 映象名2:TAG 刪除多個映象
    • docker rmi -f $(docker images -qa) 刪除所有映象
  5. docker system df 檢視映象、容器、資料卷所佔用的空間。

容器

Docker 利用容器(Container)獨立執行的一個或一組應用。容器是用映象建立的執行例項。
它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺。
可以把容器看做是一個簡易版的 Linux 環境(包括root使用者許可權、程式空間、使用者空間和網路空間等)和執行在其中的應用程式,容器的定義和映象幾乎一模一樣,也是一堆層的統一視角,唯一區別在於容器的最上面那一層是可讀可寫的。

按照 Docker 最佳實踐的要求,容器不應該向其儲存層內寫入任何資料,容器儲存層要保持無狀態化。所有的檔案寫入操作,都應該使用 資料卷(Volume)、或者 繫結宿主目錄,在這些位置的讀寫會跳過容器儲存層,直接對宿主(或網路儲存)發生讀寫,其效能和穩定性更高。

常用命令

  1. docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 依據映象建立容器
    • OPTIONS說明(常用):有些是一個減號,有些是兩個減號
    • –name=”容器新名字”: 為容器指定一個名稱;
    • -d: 後臺執行容器,並返回容器ID,也即啟動守護式容器;
    • -i:以互動模式執行容器,通常與 -t 同時使用;
    • -t:為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
    • -P: 隨機埠對映;
    • -p: 指定埠對映,有以下四種格式
        ip:hostPort:containerPort
        ip::containerPort
        hostPort:containerPort
        containerPort
  2. docker ps [OPTIONS] 列出當前正在執行的容器
    • -a :列出當前所有正在執行的容器+歷史上執行過的
    • -l :顯示最近建立的容器。
    • -n:顯示最近n個建立的容器。
    • -q :靜默模式,只顯示容器編號。
    • –no-trunc :不截斷輸出。
  3. docker start 容器Id 啟動容器
  4. docker restart 容器Id 重啟容器
  5. docker stop 容器Id 停止容器
  6. docker kill 容器ID 強制停止容器
  7. docker rm 容器ID 刪除已經停止的容器
    • docker rm -f $(docker ps -a -q) 刪除所有容器
    • docker ps -a -q | xargs docker rm 刪除所有容器
  8. docker logs -f -t --tail 容器ID 檢視容器日誌
    • -t 是加入時間戳
    • -f 跟隨最新的日誌列印
    • –tail 數字 顯示最後多少條
  9. docker top 容器ID 檢視容器內執行的程式
  10. docker inspect 容器ID 檢視容器細節
  11. docker exec -it 容器ID bashShell 進入容器
  12. docker cp 容器ID:容器內路徑 目的主機路徑 拷貝容器內檔案到本地

倉庫

倉庫(Repository)是集中存放映象檔案的場所。
倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。
最大的公開倉庫是 Docker Hub(https://hub.docker.com/),
存放了數量龐大的映象供使用者下載。國內的公開倉庫包括阿里雲 、網易雲 等

Dockerfile

Dockerfile是用來構建 Docker映象 的構建檔案,是由一系列命令和引數構成的指令碼。

構建三步驟

  1. 編寫 Dockerfile 檔案
  2. docker build
  3. docker run

約定
1:每條保留字指令都必須為大寫字母且後面要跟隨至少一個引數
2:指令按照從上到下,順序執行
3:#表示註釋
4:每條指令都會建立一個新的映象層,並對映象進行提交

常用命令

  1. ARG 設定環境變數
  2. FROM 基礎映象,當前新映象是基於哪個映象的
  3. MAINTAINER 映象維護者的姓名和郵箱地址
  4. RUN 容器構建時需要執行的命令
  5. EXPOSE 當前容器對外暴露出的埠
  6. WORKDIR 指定在建立容器後,終端預設登陸的進來工作目錄,一個落腳點
  7. ENV 用來在構建映象過程中設定環境變數
  8. ADD 將宿主機目錄下的檔案拷貝進映象且ADD命令會自動處理URL和解壓tar壓縮包
  9. COPY 類似ADD,拷貝檔案和目錄到映象中。將從構建上下文目錄中 <源路徑> 的檔案/目錄複製到新的一層的映象內的 <目標路徑> 位置
  10. VOLUME 容器資料卷,用於資料儲存和持久化工作
  11. CMD 指定一個容器啟動時要執行的命令,Dockerfile 中可以有多個 CMD 指令,但只有最後一個生效,CMD 會被 docker run 之後的引數替換
  12. ENTRYPOINT 指定一個容器啟動時要執行的命令,ENTRYPOINT 的目的和 CMD 一樣,都是在指定容器啟動程式及引數
  13. ONBUILD 當構建一個被繼承的Dockerfile時執行命令,父映象在被子繼承後父映象的onbuild被觸發

構建 PHP 環境例項

# 構建環境變數,可自由配置不同 PHP 版本
ARG PHP_VERSION
FROM php:${PHP_VERSION}-fpm

# 替換成 清華大學源加速。真快
COPY ./resources/sources.list /etc/apt/

# 安裝 composer 以及一些 php 擴充套件
RUN curl -sS https://getcomposer.org/installer | php
    && mv composer.phar /usr/local/bin/composer
    && composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
    && apt-get update -y
    && apt-get install -y --no-install-recommends apt-utils
    && apt-get install -qq git curl libmcrypt-dev libjpeg-dev libpng-dev libfreetype6-dev libbz2-dev libzip-dev unzip
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/  --with-jpeg-dir=/usr/include/
    && docker-php-ext-install pdo_mysql zip gd opcache bcmath pcntl sockets

WORKDIR /tmp

# 安裝 redis 擴充套件
ADD ./resources/redis-5.1.1.tgz .
RUN mkdir -p /usr/src/php/ext
    && mv /tmp/redis-5.1.1 /usr/src/php/ext/redis
    && docker-php-ext-install redis

# 以下注釋按需開啟(某些專案需要 npm 啥的)
# 安裝 python3#ADD ./resources/Python-3.8.0.tgz .
#RUN cd /tmp/Python-3.8.0 && ./configure && make && make install && rm -rf /tmp/Python-3.8.0 Python-3.8.0.tgz

# 安裝 nodejs#ADD ./resources/node-v12.13.0-linux-x64.tar.xz .
#RUN ln -s /tmp/node-v12.13.0-linux-x64/bin/node /usr/bin/node
#    && ln -s /tmp/node-v12.13.0-linux-x64/bin/npm /usr/bin/npm

# 安裝 swoole#COPY ./resources/swoole-src-4.4.12.zip .
#RUN cd /tmp && unzip swoole-src-4.4.12.zip
#    && cd swoole-src-4.4.12 && phpize && ./configure
#    && make && make install && rm -rf /tmp/swoole*

ADD ./resources/mcrypt-1.0.3.tgz .
RUN cd /tmp/mcrypt-1.0.3 && phpize && ./configure && make && make install && rm -rf /tmp/mcrypt-1.0.3

ADD ./resources/mongodb-1.6.0.tgz .
RUN cd /tmp/mongodb-1.6.0 && phpize && ./configure && make && make install && rm -rf /tmp/mongodb-1.6.0

ADD ./resources/xdebug-3.0.1.tgz .
RUN cd /tmp/xdebug-3.0.1 && phpize && ./configure && make && make install && rm -rf /tmp/xdebug-3.0.1

CMD php-fpm

Docker-Compose

基本概念

Compose 專案是 Docker 官方的開源專案,負責實現對 Docker 容器叢集的快速編排。
其程式碼目前在 github上開源。
Compose 定位是 「定義和執行多個 Docker 容器的應用」,其前身是開源專案 Fig。

我們知道使用一個 Dockerfile 模板檔案,可以很方便的定義一個單獨的應用容器。然而,在工作中,經常會碰到需要多個容器相互配合來完成某項任務的情況。例如要實現一個 lnmp 專案,除了 Nginx 服務容器本身,往往還需要再加上後端的資料庫服務容器,甚至還包括負載均衡容器等。

Compose 恰好滿足了這樣的需求。它允許使用者通過一個單獨的 docker-compose.yml 模板檔案(YAML 格式)來定義一組相關聯的應用容器為一個專案(project)。

Compose 中有兩個重要的概念:

  • 服務 (service):一個應用的容器,實際上可以包括若干執行相同映象的容器例項。
  • 專案 (project):由一組關聯的應用容器組成的一個完整業務單元,在 docker-compose.yml 檔案中定義。

Compose 的預設管理物件是專案,通過子命令對專案中的一組容器進行便捷地生命週期管理。

安裝

Windows

Docker Desktop for Windows 包括 Compose 以及其他 Docker 應用程式,因此大多數 Windows 使用者不需要單獨安裝 Compose

Docker

Linux & mac

自行百度

Compose 模板檔案

  1. build 指定 Dockerfile 所在資料夾的路徑(可以是絕對路徑,或者相對 docker-compose.yml 檔案的路徑)。Compose 將會利用它自動構建這個映象,然後使用這個映象。
    version: '3'
    services:
         php72:
             build: ./dir
    可以使用 context 指令指定 Dockerfile 所在資料夾的路徑。
    使用 arg 指令指定構建映象時的變數。
    version: "3"
    services:
         php72:
             build:
                 context: .
                 args:
                     PHP_VERSION: 7.2
  2. container_name 指定容器名稱。預設將會使用 專案名稱_服務名稱_序號 這樣的格式。
    version: "3"
    services:
         php72:
             build:
                 context: .
                 args:
                     PHP_VERSION: 7.2
             container_name: php72
  3. environment 設定環境變數。你可以使用陣列或字典兩種格式。
    只給定名稱的變數會自動獲取執行 Compose 主機上對應變數的值,可以用來防止洩露不必要的資料。
    version: "3"
    services:
         php72:
             build:
                 context: .
                 args:
                     PHP_VERSION: 7.2
             container_name: php72
             environment:
                   TZ: "$TZ" # 時區設定
                   WEB_ENV: "local" # 環境變數設定
  4. extra_hosts 類似 Docker 中的 –add-host 引數,指定額外的 host 名稱對映資訊。會在啟動後的服務容器中 /etc/hosts 檔案中新增如下兩條條目。
    version: "3"
    services:
         php72:
             build:
               context: .
               args:
                 PHP_VERSION: 7.2
             container_name: php72
             environment:
                 TZ: "$TZ" # 時區設定
                 WEB_ENV: "local" # 環境變數設定
             extra_hosts:
                 - home.kukewang.li:172.20.128.2
                 - admin.kukewang.li:172.20.128.2
                 - api.kukewang.li:172.20.128.2
                 - api.kukecrm.li:172.20.128.2
  5. networks 配置容器連線的網路。
    version: "3"
    services:
         php72:
             build:
                 context: .
                 args:
                     PHP_VERSION: 7.2
    networks:
         static-network:
             ipam:
                 config:
                     - subnet: 172.20.0.0/16
  6. networks 配置容器連線的網路。
    version: "3"
    services:
         php72:
             build:
               context: .
               args:
                 PHP_VERSION: 7.2
             container_name: php72
             environment:
                 TZ: "$TZ" # 時區設定
                 WEB_ENV: "local" # 環境變數設定
             extra_hosts:
                 - home.kukewang.li:172.20.128.2
                 - admin.kukewang.li:172.20.128.2
                 - api.kukewang.li:172.20.128.2
                 - api.kukecrm.li:172.20.128.2
             networks:
                 static-network: #使用配置的網路
  7. ports 暴露埠資訊。使用宿主埠:容器埠 (HOST:CONTAINER) 格式,或者僅僅指定容器的埠(宿主將會隨機選擇埠)都可以
    version: "3"
    services:
         nginx:
             image: nginx:alpine
         container_name: nginx
         ports:
             - 8080:80
             - 443:443
  8. volumes 資料卷所掛載路徑設定。可以設定為宿主機路徑(HOST:CONTAINER)或者資料卷名稱(VOLUME:CONTAINER)。該指令中路徑支援相對路徑。
    version: "3"
    services:
         nginx:
             image: nginx:alpine
         container_name: nginx
         ports:
             - 8080:80
             - 443:443
         volumes:
             - ./config/nginx/conf.d:/etc/nginx/conf.d  # nginx 配置
             - ./logs/nginx:/var/log/nginx/  # nginx 日誌
  9. restart 指定容器退出後的重啟策略為始終重啟。該命令對保持服務始終執行十分有效,在生產環境中推薦配置為 always 或者 unless-stopped。
    version: "3"
    services:
         nginx:
             image: nginx:alpine
         container_name: nginx
         ports:
             - 8080:80
             - 443:443
         restart: always
  10. working_dir 指定容器中工作目錄。
    version: "3"
    services:
         php72:
             build:
                 context: .
                 args:
                     PHP_VERSION: 7.2
             working_dir:/var/www

讀取變數

Compose 模板檔案支援動態讀取主機的系統環境變數和當前目錄下的 .env 檔案中的變數。

version: "3"
services:
        php72:
            build:
                context: .
                args:
                    PHP_VERSION: 7.2
            volumes:
                - ~/.ssh:/root/.ssh/
                - ${WEB_ROOT}:/var/www:cached
                - ${COMPOSER}/php72:/root/.composer/
                - ${PHP72_INI}:/usr/local/etc/php/php.ini

Compose 啟動

一般使用 docker-compose up -d 構建,建立,啟動服務,並放在後臺執行

  1. build 可以隨時在專案目錄下執行 docker-compose build 來重新構建服務。
  2. restart 重啟專案中的服務。
  3. start 啟動已經存在的服務容器。
  4. stop 停止已經處於執行狀態的容器,但不刪除它。通過 docker-compose start 可以再次啟動這些容器。
  5. up 它將嘗試自動完成包括構建映象,(重新)建立服務,啟動服務,並關聯服務相關容器的一系列操作。連結的服務都將會被自動啟動,除非已經處於執行狀態。預設情況,docker-compose up 啟動的容器都在前臺,控制檯將會同時列印所有容器的輸出資訊,可以很方便進行除錯。
    當通過 Ctrl-C 停止命令時,所有容器將會停止。
    如果使用 docker-compose up -d,將會在後臺啟動並執行所有的容器。一般推薦生產環境下使用該選項。

操作容器

使用工具連線 MySql

  • 環境:Windows

  • Docker:Docker Desktop for Windows

  • 連線工具:Navicat

    Docker

    • 主機地址是本地迴路地址
    • 本地的埠對映 3307:3306,
    • 賬號密碼使用 root,可自行配置自己的賬戶,密碼
    • 通過連線本地的 3307 埠訪問docker-mysql
      Docker

使用工具連線 Redis

  • 環境: Windows

  • 工具:RedisClient

    Docker

    • host 本機迴路地址
    • 埠對映 6380:6379
      Docker

連線 RabbitMQ

  • 瀏覽器通過訪問地址直接連線

  • 域名:127.0.0.1

  • 埠對映情況

      ports:
          - 15672:15672 #  15672 mq 預設管理介面ui埠
          - 5672:5672 # 5672 client端通訊口

    Docker

    RabbitMQ 預設賬號密碼 guest
    Docker

執行專案

  1. dnmp/config/nginx/conf.d 新增配置檔案
    Docker

  2. 本地 Host 檔案新增

     127.0.0.1 home.kukewang.li
  3. 配置專案的 MysqlRedis,在各自的配置檔案或專案根目錄的 .env 檔案裡

     [DATABASE]
     TYPE = mysql
     HOSTNAME = mysql # mysql 容器的名字
     DATABASE = database_name #資料庫
     USERNAME = root # 使用者,可自行新增使用者
     PASSWORD = root_password # 密碼
     HOSTPORT = 3306 # 埠
    
     [REDIS]
     HOST = redis # redis 容器的名字
     PORT = 6379 # 埠
     PASSWORD = # 密碼,無密碼不填
  4. 重啟 Nginx 服務

     docker-compose restart nginx
  5. 通過域名進行訪問

    Docker
    nginx 我這邊埠對映 8080:80

PHP 安裝擴充套件

git 倉庫

  1. 參考 github-dnmp
  2. 更改 Nginx:1.16.0 + MySql:5.6.44 + PHP:7.1.31(PHP7.2,PHP7.3) + Redis:5.0.6
    碼雲
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章