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 协议》,转载必须注明作者和本文链接
实际上docker现在已经自带docker compose,如果习惯docker-compose写法
参考 docker compose alias