>  기사  >  백엔드 개발  >  Docker를 통해 Swoft 개발 환경을 구축하는 방법

Docker를 통해 Swoft 개발 환경을 구축하는 방법

不言
不言원래의
2018-07-26 10:26:143141검색

이 문서의 내용은 Docker를 통해 Swoft 개발 환경을 구축하는 방법에 대한 내용입니다. 필요한 친구들이 참고할 수 있기를 바랍니다. 本篇文章给大家分享的内容是关于如何通过Docker搭建一个swoft开发环境 ,内容很详细,有需要的朋友可以参考一下,希望可以帮助到你们。

Swoft<br>首个基于 Swoole 原生协程的新时代 PHP 高性能协程全栈组件化框架,内置协程网络服务器及常用的协程客户端,常驻内存,不依赖传统的 PHP-FPM,全异步非阻塞 IO 实现,以类似于同步客户端的写法实现异步客户端的使用,没有复杂的异步回调,没有繁琐的 yield,有类似 Go 语言的协程、灵活的注解、强大的全局依赖注入容器、完善的服务治理、灵活强大的 AOP、标准的 PSR 规范实现等等,可以用于构建高性能的Web系统、API、中间件、基础服务等等。

前言

Swoft 是一个在 Swoole 之上构建的一个高性能协程 PHP 全栈框架,而 SwoolePHPer 里面是一个高级技能,所以在相关的环境安装上也给许多人造成了很大的困扰,Swoft 更是如此,本文将通过 Docker 以一种极其简单的方式解决运行环境和开发环境的部署。

Docker

从百科上可以看到,Docker 是一个开源的的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口,也可以理解为我们可以将我们的代码和运行环境打包到一个容器中,打包好的容器可以发布到任何流行的Linux机器上,这里指的Linux机器其实并不准确,得益于Docker for Windows项目和Hyper-V的发展,Docker也可以以不错的状态运行在Windows 10系统上,但笔者不建议将 Docker for Windows 用于生产环境上。

Docker 名词概念

这里对 Docker 常用的的一些名词进行简单的阐述和解释,以便新手对于下文的理解

  • DockerfileDockerfileDocker镜像 的描述文件,通过 docker build 命令来构建成为 镜像

  • 镜像(Image),通过 Dockerfile 构建得到,包含操作系统及运行环境

  • 容器(Container),容器是运行起来的镜像,可理解为镜像是Docker生命周期中的构建和打包阶段,而容器则是启动和执行阶段

  • 镜像仓库(Repository),用于储存构建好的 Docker镜像 的仓库,可理解为类似于 Git 的仓库

安装 Docker

Docker 的安装流程并不复杂,本节将介绍 LinuxWindows 10 系统下的安装流程,而 Mac 系统上并不建议采用 Docker 环境来运行或开发 Swoft 项目,因为在 Mac for Docker 上共享磁盘的性能极其的差,会导致 Swoft 在启动阶段耗时极长。

Linux 上安装 Dockerdocker-compose

Linux 上通过 yumapt-get 来 安装 Docker 的流程可谓是相当简单
CentOS:yum install docker -y
Ubuntu:apt-get install docker-engine -y
只需要根据系统的区别,在终端执行上面的一行命令即可完成 Docker 的安装,在安装完成之后我们需要执行一下 service docker start 命令来启动一下 Docker 服务。

在安装完 Docker 之后,我们还需要安装一下 docker-compose 以便于后续对 Docker 的使用
CentOS:yum install python-pip -y && pip install --upgrade pip && pip install -U docker-compose
Ubuntu:apt-get install python-pip -y && pip install --upgrade pip && pip install -U docker-compose
只需要根据系统的区别,在终端执行上面的一行命令即可完成 docker-compose

Swoft<br>최초의 Swoole 기반 네이티브 PHP 코루틴의 새로운 시대 고성능 코루틴 전체 스택 구성 요소 프레임워크, 내장 코루틴 네트워크 서버 및 일반적으로 사용되는 코루틴 클라이언트는 메모리에 상주하며 기존 PHP-FPM, 완전 비동기 비차단 IO에 의존하지 않습니다. Go와 유사하게 복잡한 비동기 콜백 없이, 번거로운 수율 없이 비동기 클라이언트의 사용을 구현하기 위해 동기 클라이언트와 유사한 작성 방법을 사용하는 구현 언어 코루틴, 유연한 주석, 강력한 글로벌 종속성 주입 컨테이너, 완전한 서비스 거버넌스, 유연하고 강력한 AOP 및 표준 PSR 표준 구현 등을 활용하여 고성능 웹 시스템, API, 미들웨어, 기본 서비스 등을 구축할 수 있습니다. 🎜

머리말

🎜SwoftSwoole A입니다. 고성능 코루틴 PHP 풀스택 프레임워크를 그 위에 구축하고 SwoolePHPer의 고급 기술이므로 관련 환경에 설치 또한 많은 사람들, 특히 Swoft에게 큰 문제를 일으켰습니다. 이 기사에서는 Docker를 사용하여 매우 간단한 배포 방법으로 실행 환경 및 개발 환경의 문제를 해결합니다. 🎜

Docker

🎜백과사전에서 볼 수 있듯이 Docker는 오픈 소스입니다. 애플리케이션 컨테이너 엔진을 사용하면 개발자는 애플리케이션과 종속성을 휴대용 컨테이너에 패키징한 다음 널리 사용되는 Linux 시스템에 게시할 수 있습니다. 또한 컨테이너를 완전히 사용할 수 있습니다. 샌드박스 메커니즘은 없습니다. 코드와 실행 환경을 컨테이너로 패키징할 수 있다는 것도 이해할 수 있습니다. 패키징된 컨테이너는 널리 사용되는 모든 Linux 시스템에 게시될 수 있습니다. 여기서 언급되는 Linux 시스템은 다음과 같습니다. 실제로는 정확하지 않습니다. Docker for Windows 프로젝트와 Hyper-V의 개발 덕분에 Docker는 Windows 10에서도 양호한 상태로 실행될 수 있습니다. 하지만 저자는 프로덕션 환경에서 Windows용 Docker를 사용하는 것을 권장하지 않습니다. 🎜

Docker 명사 개념

🎜다음은 Docker에서 일반적으로 사용되는 일부 명사에 대한 간략한 설명입니다. , 초보자가 다음을 이해할 수 있도록 🎜
  • 🎜Dockerfile, DockerfileDocker 이미지 설명 파일인 경우 <code>docker build 명령을 사용하여 image🎜
  • 🎜image(Image)로 빌드합니다. ), 운영 체제 및 운영 환경🎜
  • 🎜Container(Container)를 포함하여 Dockerfile이 생성됩니다. 이미지는 Docker가 수명주기의 빌드 및 패키징 단계인 반면 컨테이너는 시작 및 실행 단계🎜
  • 🎜Mirror Warehouse( Repository), 빌드를 저장하는 데 사용됨 좋은 Docker 이미지 웨어하우스는 Git🎜

Docker 설치

🎜 Docker 설치 과정은 복잡하지 않습니다. 이 섹션에서는 Linux 및 <code>Windows 10 설치 프로세스는 code> 시스템 하에 있으며 Docker 환경을 사용하여 실행하거나 개발하는 것은 권장하지 않습니다 Mac system> 프로젝트의 Swoft, Docker용 Mac의 공유 디스크 성능이 극도로 낮아 Swoft가 발생하기 때문입니다. code> 시작하는 데 시간이 매우 오래 걸립니다. 🎜

LinuxDockerdocker-compose

설치 🎜Linux에 전달 프로세스 yumapt-get을 사용하여 Docker를 설치하는 것은 매우 간단합니다
CentOS: yum install docker -y<br>Ubuntu: <code>apt-get install docker-engine -y
시스템 차이에 따라 터미널에서 위 명령줄만 실행하면 됩니다.Docker 설치가 완료되면 <code>service docker start 명령을 실행하여 Docker 서비스를 시작해야 합니다. 🎜🎜Docker를 설치한 후 후속 Docker 사용을 용이하게 하려면 docker-compose도 설치해야 합니다.
CentOS: yum install python- pip -y && pip install --upgrade pip && pip install -U docker-compose
Ubuntu:apt-get install python-pip -y && pip install --upgrade pip && pip install -U docker -compose
docker-compose 설치를 완료하려면 시스템 차이에 따라 터미널에서 위 명령줄만 실행하면 됩니다. 🎜

In Windows 10 上安装 Dockerdocker-compose

我们直接到 Docker 官网下载对应的安装包 https://store.docker.com/edit...,非登录用户我们会看到 Please Login to Download ,意思是要我们先登录 Docker 账号好再下载,我们直接点击按钮到登录页面完成账号注册或登录即可在上面的链接页面通过点击 Get Docker 下载,注意这个账号后面我们在使用时也会用到。
下载完安装包后可直接运行安装包进行安装,整个过程可以说是傻瓜式的,持续的下一步即可,注意安装前需先开启系统的 Hyper-V,开启流程相对简单可参考其它文章 https://segmentfault.com/a/11... ,注意 Hyper-V 是与 VMware 是冲突的,两者不能并存,只能择其一,如果你必须要使用虚拟机的话,比如 Vagrant 之类的工具,亦可在虚拟机内运行一个 Linux 系统,然后根据本文关于 Linux 系统 的安装流程处理,在虚拟机内运行 Docker 作为开发环境。
最新版的 Docker 安装包已经包含了 docker-compose 了,也就无需再做多余的操作。
安装完成后,重启电脑,当你看到任务栏的 小鲸鱼(Docker Icon) 显示着 Docker is running 即表示 Docker 启动成功了。

Docker를 통해 Swoft 개발 환경을 구축하는 방법

我们需要右键 Docker,点击 Sign in / Create Docker ID 登录我们刚才注册的 Docker ID,以便获得我们可以从 DockerHub 中获取公共镜像的权限。

由于我们是用于开发使用,所以我们还需要授权一下共享目录的权限,右键 Docker 并点击 Settings,设置界面切换到 Shared Drives,勾选你项目代码所在的 磁盘盘符,并点击右下角的 Apply 即可完成授权。

Swoft 开发环境

修改官方默认 <span style="font-size: 16px;">docker-compose.yml</span> 文件

我们通过命令 git clone https://github.com/swoft-cloud/swoftGithub克隆(clone) Swoft 项目,并使用项目自带的 docker-compose.yml 文件来实现一个用于开发的环境,docker-compose.ymldocker-compose 的编排配置文件, 我们看一下官方默认文件的内容:

version: '3'
services:
    swoft:
        container_name: swoft
        image: swoft/swoft
        ports:
            - "80:80"
        volumes:
            - ./:/var/www/swoft
        stdin_open: true
        tty: true
        command: php /var/www/swoft/bin/swoft start

这是一个相对简单的编排文件,仅仅只有 swoft 一个服务,也没有关联过多的内容,关于 docker-compose.yml 的文件格式我们这里不做过多的解释,可自行查找相关的内容进行阅读理解。
简单的解读此文件的内容可以理解为,使用了swoft/swoft官方镜像并设置了容器名称为swoft,绑定容器内的80端口与宿主机的80端口,设置./当前目录与容器内的/var/www/swoft目录为共享目录,开启与容器的交互式终端并于启动编排文件时启动Swoft服务。
我们可以注意到默认编排文件上的 command 配置了 php /var/www/swoft/bin/swoft start,也就是启动 Swoft 服务的命令,但如果仅 克隆(clone) 项目并执行 docker-compose up 来尝试启动 容器 的话,我们会得到一个失败的结果,因为尚未执行 composer install 来加载 Composer 的依赖而缺少 vendor 文件夹和 autoload 等相关文件,导致无法正确运行 Swoft 实例,我们再看默认的编排文件设置了 stdin_open: truetty: true 两个参数,分别对应 docker 命令上的 -i-t 两个参数,简单的理解就是 -i 开启了 输入(input)功能,-t 开启了一个连接容器里面的 交互式终端(terminal) ,我们可以利用这两个参数,并将编排文件的 command 行改为 command: /bin/bash ,使容器启动后不是直接启动 Swoft 服务,而是由我们手动通过 交互式终端(terminal) 进入容器内去启动。
下面是一个更改后的 docker-compose.yml 파일 예:

version: '3'
services:
    swoft:
        container_name: swoft
        image: swoft/swoft
        ports:
            - "80:80"
        volumes:
            - ./:/var/www/swoft
        stdin_open: true
        tty: true
        command: /bin/bash

启动开发环境容器

此时我们在编排文件的所在目录启动一个 终端(Shell), 然后执行 docker-compose up -d-d 的意思是以守护模式(Daemon Mode) 运行,便于我们在同一个 终端(Shell) 进入到容器内,命令执行后我们可以看到 Starting swoft ... done 即表示启动容器成功。
如果在执行启动命令时得到一下错误,则说明宿主机的80端口已经被占用了,更改 docker-compose.yml 文件内的 80:80 为其它未被占用的端口即可,注意第一个80指的是宿主机的端口,第二个80指的是容器内的端口,也就是说我们只需要更改第一个即可

ERROR: for swoft Cannot start service swoft: b'driver failed programming external connectivity on endpoint swoft(dab0f4d00620e2f5c07e33084ca5cac6f08cb48018d6b737eadc035e5aa0b597): Bind for 0.0.0.0:80 failed: port is already allocated'

进入开发环境容器

通过执行 docker ps 命令可以查看启动的容器信息,下面为示例信息:

CONTAINER ID  IMAGE               COMMAND                 CREATED             STATUS             PORTS               NAMES
f22173763374  swoft/swoft:latest  "docker-php-entrypoin"  About a minute ago  Up About a minute  0.0.0.0:80->80/tcp  swoft

得知 容器ID(Container ID)f22173763374容器名称(Container Name)swoft,我们可以执行 docker exec -it f22173763374 bashdocker exec -it swoft bash 通过 交互式终端(terminal) 进入到容器内。

如执行时报错 the input device is not a TTY.  If you are using mintty, try prefixing the command with 'winpty',可在 docker exec 命令前面增加 winpty 命令解决,即 winpty docker exec -it swoft bash

运行以及开发调试

安装 <span style="font-size: 16px;">Composer</span> 依赖及生成<span style="font-size: 16px;">自动加载(Autoload)</span>文件

通过 docker exec 命令进入容器后,我们留意到光标左侧的内容变为 root@f22173763374: 即为已进入容器内,其中 f22173763374 为对应的 容器ID(Container ID)
由于 Swoft 官方镜像 swoft/swoft 配置的工作目录为 /var/www/swoft,而 docker-compose.yml 又将项目当前目录关联了容器 /var/www/swoft 目录,即通过 docker exec 进入的目录已经为 /var/www/swoft 目录,即项目目录,所以我们可以直接执行 composer install 命令来加载 Composer 的依赖并生成 自动加载(Autoload) 文件。
考虑到国内的网络环境,我们在执行 composer install 命令前可以先执行 composer config -g repo.packagist composer https://packagist.phpcomposer.com 命令配置 Composer 中国镜像源 加速安装速度。

启动 <span style="font-size: 16px;">Swoft</span> 服务

安装完 Composer 依赖后,便可以执行 php bin/swoft start 启动服务了,当你看到

root@f22173763374:/var/www/swoft# php bin/swoft start
                         Server Information
********************************************************************
* HTTP | host: 0.0.0.0, port: 81, type: 1, worker: 1, mode: 3
* TCP  | host: 0.0.0.0, port: 8099, type: 1, worker: 1 (Enabled)
********************************************************************
Server has been started. (master PID: 15, manager PID: 16)
You can use CTRL + C to stop run.

即意味着你的 Swoft 以及启动成功了,我们可以打开浏览器访问一下 http://127.0.0.1:80,当你看到下图即大功告成了!

Docker를 통해 Swoft 개발 환경을 구축하는 방법

如果你绑定宿主机的端口不是80,则改成对应的即可;
如果访问看到的是 Redis connection failure host=127.0.0.1 port=6379 则说明缺少 Redis 服务,最简单直接的就是直接在当前容器内安装 Redis Server,直接执行 apt install -y redis-server && service redis-server start 即可完成安装以及启动操作了;

코드를 수정하여 유효하게 만드세요

SwoftPHP-FPM 模式下的开发会有一点差异,在PHP-FPM模式下直接改变代码内容,再访问对应的代码便能得到变更后的内容,是因为PHP-FPM模式下每一次请求都会重新加载PHP代码,而 Swoft持久化运行的,也就意味着代码在服务启动之后,接受的请求都无需重新加载,这个模式的变化可以使得 Swoft 的大量代码可被重复使用,而无需重新加载和重新实例化,大大提升性能的其中一点原因之一。
这样的变更对开发会造成一定程度的影响,也就是说在 Swoft 下,你需要 重启 Worker重启服务 才能使变更的代码生效,但是得益于 Swoft热重载 功能,可以自动检查代码变更并自动 重启 Worker,我们只需通过项目根目录下的 .env 文件更改 AUTO_RELOAD 项为 true 即可,如项目根目录下没有 .env 文件,可直接复制 .env.example 文件为 .env 并作出对应的更改即可,有一点需要注意的是仅在改变 app 目录下的代码才会被 热重载 功能重载,改变其它代码不会被重载,这是由于不同代码是处于不同的生命周期导致的,仅 WorkerStart 之后加载的代码才能被重载,关于这部分的内容我们将在后续涉及到 Swoft 的生命周期 나중에 자세히 설명하겠습니다.

관련 권장 사항:

Docker 컨테이너에서 예약된 작업 crontab 구성(DaoCloud + Docker + Laravel5)

위 내용은 Docker를 통해 Swoft 개발 환경을 구축하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.