CentOS8 Docker安装RNM,docker-compose编排容器部署hyperf3.1

   本文将介绍如何在 CenterOS8 上通过docker-compose构建完整 Hyperf 项目。

环境

系统版本与Docker版本

~ cat /etc/redhat-release
CentOS Linux release 8.5.2111~ docker version
Client: Docker Engine - Community
 Version:           24.0.7
 API version:       1.43
 Go version:        go1.20.10
 Git commit:        afdd53b
 Built:             Thu Oct 26 09:09:18 2023
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          24.0.7
  API version:      1.43 (minimum version 1.12)
  Go version:       go1.20.10
  Git commit:       311b9ff
  Built:            Thu Oct 26 09:08:20 2023
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.26
  GitCommit:        3dd1e886e55dd695541fdcd67420c2888645a495
 runc:
  Version:          1.1.10
  GitCommit:        v1.1.10-0-g18a0cb0
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

docker-compose 安装

cd /Software
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

➜  /Software docker-compose --version
docker-compose version 1.29.2, build 5becea4c

一、构建基础环境

1、秒级安最新版本 MySQL 8.2.0

源码安装笔记繁琐,不推荐;RPM 安装见 《CenterOS 安装 最新 MySQL8.2 及配置》,建议使用 Docker 安装容器化。

docker search mysql

~  docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
72a69066d2fe: Pull complete 
93619dbc5b36: Pull complete 
99da31dd6142: Pull complete 
626033c43d70: Pull complete 
37d5d7efb64e: Pull complete 
ac563158d721: Pull complete 
d2ba16033dad: Pull complete 
688ba7d5c01a: Pull complete 
00e060b6d11d: Pull complete 
1c04857f594f: Pull complete 
4d7cfa90e6ea: Pull complete 
e0431212d27d: Pull complete 
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest

查看 MySQL 版本:

docker inspect mysql

2、秒级安装 Redis

 docker search redis

/Software docker pull redis  
Using default tag: latest
latest: Pulling from library/redis
a2abf6c4d29d: Pull complete 
c7a4e4382001: Pull complete 
4044b9ba67c9: Pull complete 
c8388a79482f: Pull complete 
413c8bb60be2: Pull complete 
1abfd3011519: Pull complete 
Digest: sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest

3、拉取 hyperf 镜像

/Software docker pull hyperf/hyperf:8.3-alpine-vedge-swoole-v5.1.1
8.3-alpine-vedge-swoole-v5.1.1: Pulling from hyperf/hyperf
b790c763077d: Pull complete 
dbd2c6f17540: Pull complete 
6285d2914257: Pull complete 
03926d10715f: Pull complete 
Digest: sha256:f4ddfff84cd3085a5e2e1e4cdbd5e281f55d803d6bf7f63e7e5801e6994291d5
Status: Downloaded newer image for hyperf/hyperf:8.3-alpine-vedge-swoole-v5.1.1
docker.io/hyperf/hyperf:8.3-alpine-vedge-swoole-v5.1.1

4、拉取 Nginx

/Software docker pull nginx  
Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Already exists 
a9edb18cadd1: Pull complete 
589b7251471a: Pull complete 
186b1aaa4aa6: Pull complete 
b4df32aa5a72: Pull complete 
a0bcbecc962e: Pull complete 
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

5、构建 web 服务镜像 (workplace-back)

1)编写 Dockerfile


mkdir /var/www/docker/docker-file/hyperf
cd /var/www/docker/docker-file/hyperf
vim Dockerfile

# Default Dockerfile
#
# @link     https://www.hyperf.io
# @document https://hyperf.wiki
# @contact  group@hyperf.io
# @license  https://github.com/hyperf/hyperf/blob/master/LICENSE

#FROM hyperf/hyperf:8.0-alpine-v3.16-swoole
FROM hyperf/hyperf:8.3-alpine-vedge-swoole-v5.1.1
LABEL maintainer="Hyperf Developers <group@hyperf.io>" version="1.0" license="MIT" app.name="Hyperf"

##
# ---------- env settings ----------
##
# --build-arg timezone=Asia/Shanghai
ARG timezone

ENV TIMEZONE=${timezone:-"Asia/Shanghai"} \
    APP_ENV=prod \
    SCAN_CACHEABLE=(true)

# update
RUN set -ex \
    # show php version and extensions
    && php -v \
    && php -m \
    && php --ri swoole \
    #  ---------- some config ----------
    && cd /etc/php* \
    # - config PHP
    && { \
        echo "upload_max_filesize=128M"; \
        echo "post_max_size=128M"; \
        echo "memory_limit=1G"; \
        echo "date.timezone=${TIMEZONE}"; \
    } | tee conf.d/99_overrides.ini \
    # - config timezone
    && ln -sf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \
    && echo "${TIMEZONE}" > /etc/timezone \
    # ---------- clear works ----------
    && rm -rf /var/cache/apk/* /tmp/* /usr/share/man \
    && echo -e "\033[42;37m Build Completed :).\033[0m\n"

WORKDIR /var/www/workplace-back

# Composer Cache
# COPY ./composer.* /opt/www/
#RUN composer install --no-dev --no-scripts

COPY . /var/www/workplace-back
#RUN composer install --no-dev -o && php /var/www/workplace-back/bin/hyperf.php

EXPOSE 9501 9601

#ENTRYPOINT ["php", "/var/www/workplace-back/bin/hyperf.php", "start"]
#ENTRYPOINT ["php", "/var/www/workplace-back/bin/hyperf.php", "server:watch"]
ENTRYPOINT ["php", "/var/www/workplace-back/bin/hyperf.php", "start"]

2)构建 workplace-back:v1.0

cd /var/www/docker/docker-file/hyperf
docker build -t workplace-back:v1.0 .

查看镜像:

编写 docker-compose.yml:

6、容器 docker-compose 编排

准备工作:

安装好 php8.3 (建议)以及 composer ,请见《CenterOS 源码编译安装 PHP 8.3.1及性能优化以及 Laravel 10.3.1 部署》文章。

cd /Software
mkdir -p /var/www/docker/docker-compose
cd /var/www/docker/docker-compose
vim docker-composer.yml


version: "3"
services:
  workplace-back:
    image: workplace-back:v1.0
    container_name: workplace-back
    dns:
      - 192.168.130.1
    privileged: true
    user: root
    restart: always
    ports:
      - "9501:9501"
    volumes:
      - /var/www/workplace-back:/var/www/workplace-back
    networks:
      - yc_network
    environment: #设置容器的环境变量
      - TZ=Asia/Shanghai
    working_dir: /var/www/
    depends_on:
      - redis
      - mysql
      - nginx
    stdin_open: true
    tty: true
    expose:
      - "9501"
      - "9601"
  redis:
    image: redis:latest
    privileged: true
    container_name: redis
    restart: always
    ports:
      - "6380:6379"
    volumes:
      - /usr/local/docker/redis/redis.conf:/etc/redis/redis.conf
      - /usr/local/docker/redis/data:/data
    networks:
      - yc_network
    dns:
     - 192.168.130.1
    command: redis-server /etc/redis/redis.conf
 mysql:
    image: mysql:latest
    privileged: true
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: '123456'
      MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
      MYSQL_DATABASE: 'workplat_staging'
      MYSQL_USER: 'dyp'
      MYSQL_PASSWORD: '123456'
    ports:
      - "3307:3306"
    volumes:
      - /usr/local/docker/mysql/init:/docker-entrypoint-initdb.d
      - /usr/local/docker/mysql/log:/var/log/mysql
      - /usr/local/docker/mysql/data:/var/lib/mysql
      - /usr/local/docker/mysql/conf:/etc/mysql/conf.d
    networks:
      - yc_network
    dns:
      - 192.168.130.1
    command: --default-authentication-plugin=caching_sha2_password #解决外部无法访问
    #   command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
    restart: always
  nginx:
    image: nginx:latest
    restart: always
    hostname: nginx
    container_name: nginx
    privileged: true
    ports:
      - 81:80
      - 443:443
    volumes:
      - /usr/local/docker/nginx/html:/usr/local/nginx/html
      - /usr/local/docker/nginx/conf:/usr/local/nginx/conf
      - /usr/local/docker/nginx/cert:/usr/local/nginx/cert
      - /usr/local/docker/nginx/logs:/usr/local/nginx/logs
      - /usr/local/docker/nginx/conf/vhosts:/usr/local/nginx/conf/vhosts
    networks:
      - yc_network
    dns:
      - 192.168.130.1
networks:
  yc_network:

在宿主机安装 hyperf3.1:

cd /var/www && composer create-project hyperf/hyperf-skeleton workplace-back 

.
.
.

启动查看构建的 workplace-back 容器:

  cd /var/www/docker/docker-compose && docker-compose up

查看容器启动情况:

➜  docker-compose docker ps                            
CONTAINER ID   IMAGE                 COMMAND                   CREATED         STATUS         PORTS                                                                      NAMES
e7a73b3d351d   workplace-back:v1.0   "php /var/www/workpl…"   5 minutes ago   Up 5 minutes   0.0.0.0:9501->9501/tcp, :::9501->9501/tcp, 9601/tcp                        workplace-back
0d356ed6a5ce   nginx:latest          "/docker-entrypoint.…"   26 hours ago    Up 5 minutes   0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:81->80/tcp, :::81->80/tcp   nginx
ff38319d97f3   redis:latest          "docker-entrypoint.s…"   26 hours ago    Up 5 minutes   0.0.0.0:6380->6379/tcp, :::6380->6379/tcp                                  redis
19c13afd692b   mysql:latest          "docker-entrypoint.s…"   26 hours ago    Up 5 minutes   33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp                       mysql

查看 docker-compose 情况:

➜  docker-compose docker-compose ps
     Name                   Command               State                                   Ports                                 
--------------------------------------------------------------------------------------------------------------------------------
mysql            docker-entrypoint.sh --def ...   Up      0.0.0.0:3307->3306/tcp,:::3307->3306/tcp, 33060/tcp                   
nginx            /docker-entrypoint.sh ngin ...   Up      0.0.0.0:443->443/tcp,:::443->443/tcp, 0.0.0.0:81->80/tcp,:::81->80/tcp
redis            docker-entrypoint.sh redis ...   Up      0.0.0.0:6380->6379/tcp,:::6380->6379/tcp                              
workplace-back   php /var/www/workplace-bac ...   Up      0.0.0.0:9501->9501/tcp,:::9501->9501/tcp, 9601/tcp   

进入容器查看项目:

➜  docker-compose docker exec -it workplace-back /bin/bash
e7a73b3d351d:/var/www# ls
workplace-back
e7a73b3d351d:/var/www# cd workplace-back/
e7a73b3d351d:/var/www/workplace-back# ls
Dockerfile          README.md           bin                 composer.lock       deploy.test.yml     phpstan.neon        runtime             vendor
LICENSE             app                 composer.json       config              docker-compose.yml  phpunit.xml         test
e7a73b3d351d:/var/www/workplace-back# 

接口测试:

➜  workplace-back curl http://192.168.130.127:9501/
{"method":"GET","message":"Hello Hyperf."}#

  至此,CentOS8 环境 使用 Docker 安装 Redis、Nginx、MySQL 最新版本8.2.0;并通过 docker-compose 编排容器,部署hyperf3.1 项目已全部讲解完毕。

本作品采用《CC 协议》,转载必须注明作者和本文链接
ThinkQ
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 2

实际上docker现在已经自带docker compose,如果习惯docker-compose写法

#!/bin/bash

# 建议位置在  /usr/local/bin
docker compose $*

别忘了添加可执行权限 sudo chmod +x docker-compose

参考 docker compose alias

3个月前 评论
ThinkQ (楼主) 3个月前

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