Docker基本介绍及使用
相关网站
安装 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 : 显示完整的镜像描述
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 同时使用;
- -v: 挂在目录,进行映射
- -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 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: ./dircontext指令指定Dockerfile所在文件夹的路径。
使用arg指令指定构建镜像时的变量。version: "3" services: php72: build: context: . args: PHP_VERSION: 7.2container_name指定容器名称。默认将会使用 项目名称_服务名称_序号 这样的格式。version: "3" services: php72: build: context: . args: PHP_VERSION: 7.2 container_name: php72environment设置环境变量。你可以使用数组或字典两种格式。
只给定名称的变量会自动获取运行 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.2networks配置容器连接的网络。version: "3" services: php72: build: context: . args: PHP_VERSION: 7.2 networks: static-network: ipam: config: - subnet: 172.20.0.0/16networks配置容器连接的网络。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:443volumes数据卷所挂载路径设置。可以设置为宿主机路径(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: alwaysworking_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 安装扩展
第一种:在构建前,在
.env文件的PHP_EXTENSIONS参数添加PHP_EXTENSIONS=pdo_mysql,mysqli,mbstring,gd,curl,opcache,redis更多可安装扩展可查看注释
第二种:进入 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 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| apcu | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| apcu_bc | ✓ | ✓ | ✓ | ✓ | ✓ | ||||
| ast | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||
| bcmath | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| bz2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| calendar | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| cmark | ✓ | ✓ | ✓ | ✓ | ✓ | ||||
| csv | ✓ | ✓ | ✓ | ✓ | |||||
| dba | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| decimal | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||
| ds | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |||
| enchant* | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ev | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| excimer | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |||
| exif | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ffi | ✓ | ✓ | ✓ | ||||||
| gd | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| gearman | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| geoip | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||
| geospatial | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| gettext | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| gmagick | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| gmp | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| gnupg | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| grpc | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| http | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| igbinary | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| imagick | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| imap | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| inotify | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| interbase | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |||
| intl | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ioncube_loader | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||
| jsmin | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||
| json_post | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ldap | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| lzf | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| mailparse | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| maxminddb | ✓ | ✓ | ✓ | ✓ | ✓ | ||||
| mcrypt | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| memcache | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| memcached | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| mongo | ✓ | ✓ | |||||||
| mongodb | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| mosquitto | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||
| msgpack | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| mssql | ✓ | ✓ | |||||||
| mysql | ✓ | ✓ | |||||||
| mysqli | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| oauth | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| oci8 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| odbc | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| opcache | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| opencensus | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||
| parallel* | ✓ | ✓ | ✓ | ✓ | |||||
| pcntl | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| pcov | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||
| pdo_dblib | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| pdo_firebird | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| pdo_mysql | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| pdo_oci | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||
| pdo_odbc | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| pdo_pgsql | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| pdo_sqlsrv* | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||
| pgsql | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| propro | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||
| protobuf | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| pspell | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| pthreads* | ✓ | ✓ | ✓ | ||||||
| raphf | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| rdkafka | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| recode | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |||
| redis | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| seaslog | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| shmop | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| smbclient | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| snmp | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| snuffleupagus | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||
| soap | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| sockets | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| solr | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| sqlsrv* | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||
| ssh2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| stomp | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||
| swoole | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
| sybase_ct | ✓ | ✓ | |||||||
| sysvmsg | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| sysvsem | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| sysvshm | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| tensor | ✓ | ✓ | ✓ | ✓ | |||||
| tidy | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| timezonedb | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| uopz | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||
| uploadprogress | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||
| uuid | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| vips* | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||
| wddx | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |||
| xdebug | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| xhprof | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| xlswriter | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |||
| xmldiff | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| xmlrpc | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| xsl | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| yaml | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| yar | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| zip | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| zookeeper | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| zstd | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
问题
- Windows 系统第一次构建 PHP 出现如下问题

大概的问题是由于dnmp/services/php/extensions/install.sh文件的行分隔符是CRLF,需要更改为LF,或者设置/编辑器/代码样式

参考
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu