相關網站
安裝 Docker
Docker介紹
為什麼要使用 Docker
- 更高效的利用系統資源
- 更快速的啟動時間
- 一致的執行環境
- 持續交付和部署
- 更輕鬆的遷移
- 更輕鬆的維護和擴充套件
對比傳統虛擬機器總結
特性 | 容器 | 虛擬機器 |
---|---|---|
啟動 | 秒級 | 分鐘級 |
硬碟使用 | 一般為 MB | 一般為 GB |
效能 | 接近原生 | 弱於 |
系統支援量 | 單機支援上千個容器 | 一般幾十個 |
Docker是一個Client-Server結構的系統,Docker守護程式執行在主機上, 然後通過Socket連線從客戶端訪問,守護程式從客戶端接受命令並管理執行在主機上的容器。 容器,是一個執行時環境,就是我們前面說到的集裝箱。
Docker 架構圖
基礎概念
Docker 分為三個基本概念 映象
,容器
,倉庫
映象
Docker 映象(Image)就是一個只讀的模板。映象可以用來建立 Docker 容器,一個映象可以建立很多容器。
Docker 映象都是隻讀的,當容器啟動時,一個新的可寫層被載入到映象的頂部,這一層通常被稱作“容器層”,“容器層”之下的都叫“映象層”。
常用命令
docker images
檢視當前映象- -a :列出本地所有的映象(含中間映像層)
- -q :只顯示映象ID。
- –digests :顯示映象的摘要資訊
- –no-trunc :顯示完整的映象資訊
docker search nginx
查詢https://hub.docker.com
的映象- –no-trunc : 顯示完整的映象描述
- -s : 列出收藏數不小於指定值的映象。
- –automated : 只列出 automated build型別的映象;
docker pull nginx:latest
拉去遠端映象到本地docker rmi -f nginx:latest
刪除本地映象docker rmi -f 映象名1:TAG 映象名2:TAG
刪除多個映象docker rmi -f $(docker images -qa)
刪除所有映象
docker system df
檢視映象、容器、資料卷所佔用的空間。
容器
Docker 利用容器(Container)獨立執行的一個或一組應用。容器是用映象建立的執行例項。
它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺。
可以把容器看做是一個簡易版的 Linux 環境(包括root使用者許可權、程式空間、使用者空間和網路空間等)和執行在其中的應用程式,容器的定義和映象幾乎一模一樣,也是一堆層的統一視角,唯一區別在於容器的最上面那一層是可讀可寫的。
按照 Docker 最佳實踐的要求,容器不應該向其儲存層內寫入任何資料,容器儲存層要保持無狀態化。所有的檔案寫入操作,都應該使用 資料卷(Volume)、或者 繫結宿主目錄,在這些位置的讀寫會跳過容器儲存層,直接對宿主(或網路儲存)發生讀寫,其效能和穩定性更高。
常用命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
依據映象建立容器- OPTIONS說明(常用):有些是一個減號,有些是兩個減號
- –name=”容器新名字”: 為容器指定一個名稱;
- -d: 後臺執行容器,並返回容器ID,也即啟動守護式容器;
- -i:以互動模式執行容器,通常與 -t 同時使用;
- -t:為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
- -P: 隨機埠對映;
- -p: 指定埠對映,有以下四種格式
ip:hostPort:containerPort ip::containerPort hostPort:containerPort containerPort
docker ps [OPTIONS]
列出當前正在執行的容器- -a :列出當前所有正在執行的容器+歷史上執行過的
- -l :顯示最近建立的容器。
- -n:顯示最近n個建立的容器。
- -q :靜默模式,只顯示容器編號。
- –no-trunc :不截斷輸出。
docker start 容器Id
啟動容器docker restart 容器Id
重啟容器docker stop 容器Id
停止容器docker kill 容器ID
強制停止容器docker rm 容器ID
刪除已經停止的容器docker rm -f $(docker ps -a -q)
刪除所有容器docker ps -a -q | xargs docker rm
刪除所有容器
docker logs -f -t --tail 容器ID
檢視容器日誌- -t 是加入時間戳
- -f 跟隨最新的日誌列印
- –tail 數字 顯示最後多少條
docker top 容器ID
檢視容器內執行的程式docker inspect 容器ID
檢視容器細節docker exec -it 容器ID bashShell
進入容器docker cp 容器ID:容器內路徑 目的主機路徑
拷貝容器內檔案到本地
倉庫
倉庫(Repository)是集中存放映象檔案的場所。
倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。
最大的公開倉庫是 Docker Hub(https://hub.docker.com/),
存放了數量龐大的映象供使用者下載。國內的公開倉庫包括阿里雲 、網易雲 等
Dockerfile
Dockerfile是用來構建 Docker映象
的構建檔案,是由一系列命令和引數構成的指令碼。
構建三步驟
- 編寫 Dockerfile 檔案
- docker build
- docker run
約定
1:每條保留字指令都必須為大寫字母且後面要跟隨至少一個引數
2:指令按照從上到下,順序執行
3:#表示註釋
4:每條指令都會建立一個新的映象層,並對映象進行提交
常用命令
ARG
設定環境變數FROM
基礎映象,當前新映象是基於哪個映象的MAINTAINER
映象維護者的姓名和郵箱地址RUN
容器構建時需要執行的命令EXPOSE
當前容器對外暴露出的埠WORKDIR
指定在建立容器後,終端預設登陸的進來工作目錄,一個落腳點ENV
用來在構建映象過程中設定環境變數ADD
將宿主機目錄下的檔案拷貝進映象且ADD命令會自動處理URL和解壓tar壓縮包COPY
類似ADD,拷貝檔案和目錄到映象中。將從構建上下文目錄中 <源路徑> 的檔案/目錄複製到新的一層的映象內的 <目標路徑> 位置VOLUME
容器資料卷,用於資料儲存和持久化工作CMD
指定一個容器啟動時要執行的命令,Dockerfile 中可以有多個 CMD 指令,但只有最後一個生效,CMD 會被 docker run 之後的引數替換ENTRYPOINT
指定一個容器啟動時要執行的命令,ENTRYPOINT 的目的和 CMD 一樣,都是在指定容器啟動程式及引數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
Linux & mac
自行百度
Compose 模板檔案
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
container_name
指定容器名稱。預設將會使用 專案名稱_服務名稱_序號 這樣的格式。version: "3" services: php72: build: context: . args: PHP_VERSION: 7.2 container_name: php72
environment
設定環境變數。你可以使用陣列或字典兩種格式。
只給定名稱的變數會自動獲取執行 Compose 主機上對應變數的值,可以用來防止洩露不必要的資料。version: "3" services: php72: build: context: . args: PHP_VERSION: 7.2 container_name: php72 environment: TZ: "$TZ" # 時區設定 WEB_ENV: "local" # 環境變數設定
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
networks
配置容器連線的網路。version: "3" services: php72: build: context: . args: PHP_VERSION: 7.2 networks: static-network: ipam: config: - subnet: 172.20.0.0/16
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: #使用配置的網路
ports
暴露埠資訊。使用宿主埠:容器埠 (HOST:CONTAINER) 格式,或者僅僅指定容器的埠(宿主將會隨機選擇埠)都可以version: "3" services: nginx: image: nginx:alpine container_name: nginx ports: - 8080:80 - 443:443
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 日誌
restart
指定容器退出後的重啟策略為始終重啟。該命令對保持服務始終執行十分有效,在生產環境中推薦配置為 always 或者 unless-stopped。version: "3" services: nginx: image: nginx:alpine container_name: nginx ports: - 8080:80 - 443:443 restart: always
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
構建,建立,啟動服務,並放在後臺執行
build
可以隨時在專案目錄下執行 docker-compose build 來重新構建服務。restart
重啟專案中的服務。start
啟動已經存在的服務容器。stop
停止已經處於執行狀態的容器,但不刪除它。通過 docker-compose start 可以再次啟動這些容器。up
它將嘗試自動完成包括構建映象,(重新)建立服務,啟動服務,並關聯服務相關容器的一系列操作。連結的服務都將會被自動啟動,除非已經處於執行狀態。預設情況,docker-compose up
啟動的容器都在前臺,控制檯將會同時列印所有容器的輸出資訊,可以很方便進行除錯。
當通過 Ctrl-C 停止命令時,所有容器將會停止。
如果使用docker-compose up -d
,將會在後臺啟動並執行所有的容器。一般推薦生產環境下使用該選項。
操作容器
使用工具連線 MySql
環境:Windows
Docker:Docker Desktop for Windows
連線工具:Navicat
- 主機地址是本地迴路地址
- 本地的埠對映 3307:3306,
- 賬號密碼使用 root,可自行配置自己的賬戶,密碼
- 通過連線本地的 3307 埠訪問docker-mysql
使用工具連線 Redis
環境: Windows
工具:RedisClient
- host 本機迴路地址
- 埠對映 6380:6379
連線 RabbitMQ
瀏覽器通過訪問地址直接連線
域名:127.0.0.1
埠對映情況
ports: - 15672:15672 # 15672 mq 預設管理介面ui埠 - 5672:5672 # 5672 client端通訊口
RabbitMQ 預設賬號密碼
guest
執行專案
dnmp/config/nginx/conf.d 新增配置檔案
本地 Host 檔案新增
127.0.0.1 home.kukewang.li
配置專案的
Mysql
,Redis
,在各自的配置檔案或專案根目錄的.env
檔案裡[DATABASE] TYPE = mysql HOSTNAME = mysql # mysql 容器的名字 DATABASE = database_name #資料庫 USERNAME = root # 使用者,可自行新增使用者 PASSWORD = root_password # 密碼 HOSTPORT = 3306 # 埠 [REDIS] HOST = redis # redis 容器的名字 PORT = 6379 # 埠 PASSWORD = # 密碼,無密碼不填
重啟
Nginx
服務docker-compose restart nginx
通過域名進行訪問
nginx 我這邊埠對映 8080:80
PHP 安裝擴充套件
git 倉庫
- 參考 github-dnmp
- 更改 Nginx:1.16.0 + MySql:5.6.44 + PHP:7.1.31(PHP7.2,PHP7.3) + Redis:5.0.6
碼雲
本作品採用《CC 協議》,轉載必須註明作者和本文連結