Docker基本介绍及使用

相关网站

  1. Docker官网
  2. Docker Hub官网:
  3. 技术文档
  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 : 显示完整的镜像描述
  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 同时使用;
    • -v: 挂在目录,进行映射
    • -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 top 容器ID 查看容器内运行的进程
  9. docker inspect 容器ID 查看容器细节
  10. docker exec -it 容器ID bashShell 进入容器
  11. 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 安装扩展

PHP 安装扩展

  1. 第一种:在构建前,在 .env 文件的 PHP_EXTENSIONS 参数添加

     PHP_EXTENSIONS=pdo_mysql,mysqli,mbstring,gd,curl,opcache,redis

    更多可安装扩展可查看注释

  2. 第二种:进入 PHP 的 Docker 容器

     docker exec -it php71 sh
     install-php-extensions xdebug-2.9.7

支持的扩展列表

Extension PHP 5.5 PHP 5.6 PHP 7.0 PHP 7.1 PHP 7.2 PHP 7.3 PHP 7.4 PHP 8.0 PHP 8.1
amqp &check; &check; &check; &check; &check; &check; &check; &check; &check;
apcu &check; &check; &check; &check; &check; &check; &check; &check; &check;
apcu_bc &check; &check; &check; &check; &check;
ast &check; &check; &check; &check; &check; &check; &check;
bcmath &check; &check; &check; &check; &check; &check; &check; &check; &check;
bz2 &check; &check; &check; &check; &check; &check; &check; &check; &check;
calendar &check; &check; &check; &check; &check; &check; &check; &check; &check;
cmark &check; &check; &check; &check; &check;
csv &check; &check; &check; &check;
dba &check; &check; &check; &check; &check; &check; &check; &check; &check;
decimal &check; &check; &check; &check; &check; &check; &check;
ds &check; &check; &check; &check; &check; &check;
enchant* &check; &check; &check; &check; &check; &check; &check; &check; &check;
ev &check; &check; &check; &check; &check; &check; &check; &check; &check;
excimer &check; &check; &check; &check; &check; &check;
exif &check; &check; &check; &check; &check; &check; &check; &check; &check;
ffi &check; &check; &check;
gd &check; &check; &check; &check; &check; &check; &check; &check; &check;
gearman &check; &check; &check; &check; &check; &check; &check; &check;
geoip &check; &check; &check; &check; &check; &check; &check;
geospatial &check; &check; &check; &check; &check; &check; &check; &check; &check;
gettext &check; &check; &check; &check; &check; &check; &check; &check; &check;
gmagick &check; &check; &check; &check; &check; &check; &check; &check; &check;
gmp &check; &check; &check; &check; &check; &check; &check; &check; &check;
gnupg &check; &check; &check; &check; &check; &check; &check; &check; &check;
grpc &check; &check; &check; &check; &check; &check; &check; &check; &check;
http &check; &check; &check; &check; &check; &check; &check; &check; &check;
igbinary &check; &check; &check; &check; &check; &check; &check; &check; &check;
imagick &check; &check; &check; &check; &check; &check; &check; &check; &check;
imap &check; &check; &check; &check; &check; &check; &check; &check; &check;
inotify &check; &check; &check; &check; &check; &check; &check; &check; &check;
interbase &check; &check; &check; &check; &check; &check;
intl &check; &check; &check; &check; &check; &check; &check; &check; &check;
ioncube_loader &check; &check; &check; &check; &check; &check; &check;
jsmin &check; &check; &check; &check; &check; &check; &check;
json_post &check; &check; &check; &check; &check; &check; &check; &check; &check;
ldap &check; &check; &check; &check; &check; &check; &check; &check; &check;
lzf &check; &check; &check; &check; &check; &check; &check; &check; &check;
mailparse &check; &check; &check; &check; &check; &check; &check; &check;
maxminddb &check; &check; &check; &check; &check;
mcrypt &check; &check; &check; &check; &check; &check; &check; &check; &check;
memcache &check; &check; &check; &check; &check; &check; &check; &check; &check;
memcached &check; &check; &check; &check; &check; &check; &check; &check; &check;
mongo &check; &check;
mongodb &check; &check; &check; &check; &check; &check; &check; &check; &check;
mosquitto &check; &check; &check; &check; &check; &check; &check;
msgpack &check; &check; &check; &check; &check; &check; &check; &check; &check;
mssql &check; &check;
mysql &check; &check;
mysqli &check; &check; &check; &check; &check; &check; &check; &check; &check;
oauth &check; &check; &check; &check; &check; &check; &check; &check; &check;
oci8 &check; &check; &check; &check; &check; &check; &check; &check; &check;
odbc &check; &check; &check; &check; &check; &check; &check; &check; &check;
opcache &check; &check; &check; &check; &check; &check; &check; &check; &check;
opencensus &check; &check; &check; &check; &check; &check; &check;
parallel* &check; &check; &check; &check;
pcntl &check; &check; &check; &check; &check; &check; &check; &check; &check;
pcov &check; &check; &check; &check; &check; &check; &check;
pdo_dblib &check; &check; &check; &check; &check; &check; &check; &check;
pdo_firebird &check; &check; &check; &check; &check; &check; &check; &check; &check;
pdo_mysql &check; &check; &check; &check; &check; &check; &check; &check; &check;
pdo_oci &check; &check; &check; &check; &check; &check; &check;
pdo_odbc &check; &check; &check; &check; &check; &check; &check; &check; &check;
pdo_pgsql &check; &check; &check; &check; &check; &check; &check; &check; &check;
pdo_sqlsrv* &check; &check; &check; &check; &check; &check; &check;
pgsql &check; &check; &check; &check; &check; &check; &check; &check; &check;
propro &check; &check; &check; &check; &check; &check; &check;
protobuf &check; &check; &check; &check; &check; &check; &check; &check;
pspell &check; &check; &check; &check; &check; &check; &check; &check; &check;
pthreads* &check; &check; &check;
raphf &check; &check; &check; &check; &check; &check; &check; &check; &check;
rdkafka &check; &check; &check; &check; &check; &check; &check; &check;
recode &check; &check; &check; &check; &check; &check;
redis &check; &check; &check; &check; &check; &check; &check; &check; &check;
seaslog &check; &check; &check; &check; &check; &check; &check; &check; &check;
shmop &check; &check; &check; &check; &check; &check; &check; &check; &check;
smbclient &check; &check; &check; &check; &check; &check; &check; &check; &check;
snmp &check; &check; &check; &check; &check; &check; &check; &check; &check;
snuffleupagus &check; &check; &check; &check; &check; &check; &check;
soap &check; &check; &check; &check; &check; &check; &check; &check; &check;
sockets &check; &check; &check; &check; &check; &check; &check; &check; &check;
solr &check; &check; &check; &check; &check; &check; &check; &check; &check;
sqlsrv* &check; &check; &check; &check; &check; &check; &check;
ssh2 &check; &check; &check; &check; &check; &check; &check; &check; &check;
stomp &check; &check; &check; &check; &check; &check; &check;
swoole &check; &check; &check; &check; &check; &check; &check; &check;
sybase_ct &check; &check;
sysvmsg &check; &check; &check; &check; &check; &check; &check; &check; &check;
sysvsem &check; &check; &check; &check; &check; &check; &check; &check; &check;
sysvshm &check; &check; &check; &check; &check; &check; &check; &check; &check;
tensor &check; &check; &check; &check;
tidy &check; &check; &check; &check; &check; &check; &check; &check; &check;
timezonedb &check; &check; &check; &check; &check; &check; &check; &check; &check;
uopz &check; &check; &check; &check; &check; &check; &check;
uploadprogress &check; &check; &check; &check; &check; &check; &check;
uuid &check; &check; &check; &check; &check; &check; &check; &check; &check;
vips* &check; &check; &check; &check; &check; &check; &check;
wddx &check; &check; &check; &check; &check; &check;
xdebug &check; &check; &check; &check; &check; &check; &check; &check; &check;
xhprof &check; &check; &check; &check; &check; &check; &check; &check; &check;
xlswriter &check; &check; &check; &check; &check; &check;
xmldiff &check; &check; &check; &check; &check; &check; &check; &check; &check;
xmlrpc &check; &check; &check; &check; &check; &check; &check; &check; &check;
xsl &check; &check; &check; &check; &check; &check; &check; &check; &check;
yaml &check; &check; &check; &check; &check; &check; &check; &check; &check;
yar &check; &check; &check; &check; &check; &check; &check; &check; &check;
zip &check; &check; &check; &check; &check; &check; &check; &check; &check;
zookeeper &check; &check; &check; &check; &check; &check; &check; &check; &check;
zstd &check; &check; &check; &check; &check; &check; &check; &check; &check;

问题

  1. Windows 系统第一次构建 PHP 出现如下问题
    Docker基本介绍及使用
    大概的问题是由于 dnmp/services/php/extensions/install.sh 文件的 行分隔符CRLF,需要更改为 LF,或者 设置/编辑器/代码样式
    Docker基本介绍及使用

参考

github-dnmp
PHP扩展

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!