1. 方便 多平臺(tái)的開發(fā)部署
2. 方便 修改 PHP 版本
3. 方便 修改 PHP 擴(kuò)展
FROM centos:7
# install yum-utils
RUN yum -y install yum-utils
# install libevent
RUN yum -y install libevent libevent-devel
# install php8.1 libs
RUN yum -y install epel-release
RUN yum -y install https://mirrors.aliyun.com/remi/enterprise/remi-release-7.rpm
RUN yum-config-manager --enable remi-php81
RUN yum -y install php-cli php-event php-posix php-pcntl php-zip php-openssl php-devel php-gd php-mbstring php-curl php-xml php-simplexml php-fileinfo php-sodium php-pear php-bcmath php-json php-mysqlnd php-redis php-amqp php-imagick --skip-broken
# copy project
RUN mkdir /app
COPY ./ /app
RUN chmod -R 777 /app/public /app/runtime
# install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
RUN composer install --no-dev --working-dir=/app
# clean all
RUN yum clean all
ENTRYPOINT ["php", "/app/start.php", "start"]
修改 Dockerfile 中的 "RUN yum-config-manager --enable remi-php81" 行中的 "remi-php81" 即可。 該信息表示 PHP 的版本, 如 使用 PHP8.0, 將其修改 "remi-php80"。
添加或刪除 Dockerfile 中的 "RUN yum -y install php-cli..." 行中的 PHP 擴(kuò)展即可。PHP 擴(kuò)展格式為 php-擴(kuò)展名, 如 添加 redis 擴(kuò)展, 在該行增加 "php-redis"。(當(dāng)前 Dockerfile 中已添加了該擴(kuò)展)
(1)按需安裝擴(kuò)展,若教程中的擴(kuò)展您不需要,請(qǐng)刪除
(2)按需安裝 composer 及依賴,若您代碼中已安裝依賴,請(qǐng)刪除或注釋教程中 install composr 部分
(3)若安裝過程中出現(xiàn)超時(shí)問題,請(qǐng)配置鏡像加速,具體參見:https://www.runoob.com/docker/docker-mirror-acceleration.html
1. 將 Dockerfile 放入應(yīng)用跟目錄
2. 運(yùn)行制作鏡像(鏡像名稱按 開發(fā)者/應(yīng)用:版本):
docker build --rm -t developer/app:1.0 .
1. 使用鏡像創(chuàng)建容器:
docker run -d --restart=always --name=app -p 18787:18787 developer/app:1.0
參數(shù)說明:
-d:后臺(tái)方式運(yùn)行
--restart=always:自啟動(dòng)
--name=app:容器服務(wù)名稱
-p 18787:18787:映射端口(將外部端口映射到容器內(nèi)部服務(wù)端口)
developer/app:1.0:鏡像名稱
2. 容器服務(wù)操作
(1) 查看容器狀態(tài)
docker ps -a
(2) 進(jìn)入容器
docker exec -it app /bin/bash
(3) 重啟服務(wù)
docker restart app
(4) 關(guān)閉服務(wù)
docker stop app
(5) 容器狀態(tài)
docker stats
這里沒啥沒有安裝數(shù)據(jù)庫mysql啊
將如下代碼放在 # clean all 上面(上面教程已補(bǔ)充):
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
RUN composer install --no-dev --working-dir=/app
需要在代碼中連接mysql的配置處指定,非容器或Dockerfile處。
若通過內(nèi)網(wǎng)連接mysql,將連接mysql的host換做內(nèi)網(wǎng)地址(非127.0.0.1),win上使用ipconfig查看,centos上使用ifconfig查看;公網(wǎng)連接直接使用公網(wǎng)ip即可。
FROM php:8.2-fpm-alpine
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
curl -sSL https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions -o - | sh -s \
sockets pcntl zip ffi pdo_mysql gd event opcache redis uuid yaml apcu @composer
VOLUME /var/www
WORKDIR /var/www
用install-php-extensions安裝拓展可能會(huì)更好一些;
version: "3.1"
services:
php:
restart: always
container_name: php
build:
context: ./
volumes:
- ./:/var/www
ports:
- "8001:8001"
- "8002:8002"
- "8003:8003"
- "8004:8004"
environment:
TZ: ${TIME_ZONE}
logging:
driver: json-file
options:
max-size: "20m"
max-file: "10"
tty: true
networks:
- backend
redis:
restart: always
container_name: redis
image: redis:7-alpine
ports:
- "6379:6379"
environment:
TZ: ${TIME_ZONE}
networks:
- backend
mysql:
restart: always
container_name: mysql
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD}
TZ: ${TIME_ZONE}
volumes:
- ./runtime/mysql:/var/lib/mysql
ports:
- "3306:3306"
networks:
- backend
networks:
backend:
driver: bridge
然后再結(jié)合一個(gè)docker-compose編排啟動(dòng),可能會(huì)更簡單
.env如下
TIME_ZONE=Asia/Shanghai
MYSQL_PASSWORD=123456
docker中部署workerman服務(wù)的話,需要在docker中做官方推薦的linux內(nèi)核調(diào)優(yōu)嗎?還是只在docker宿主機(jī)中作內(nèi)核參數(shù)調(diào)優(yōu)就行了
是需要做優(yōu)化的,但是目前docker的系統(tǒng)鏡像,有些內(nèi)核參數(shù)是被移除了的,無法按照workman官方文檔的內(nèi)核優(yōu)化配置去處理。具體可參見:http://www.wtbis.cn/q/4503。
若對(duì)性能有較高的要求,還是建議直接部署到宿主機(jī)上,使用supervisord統(tǒng)一管理。
如果想便于部署和做環(huán)境隔離,使用docker部署是不錯(cuò)的選擇。目前已經(jīng)在多個(gè)項(xiàng)目的生產(chǎn)環(huán)境中使用docker部署,線上沒出過什么問題。但具體的使用,還是看你這邊的業(yè)務(wù)場(chǎng)景。
我主要是看到官方文檔上說:優(yōu)化linux內(nèi)核也是重中之重,以下優(yōu)化每一項(xiàng)都非常非常重要,請(qǐng)務(wù)必按逐一完成。所以我就想著docker中怎么配置 ,查了一圈發(fā)現(xiàn)官方?jīng)]有給什么好的解決方案,我在docker-compose.yml中使用了sysctl,但是net.core.netdev_max_backlog這個(gè)參數(shù)又報(bào)錯(cuò)。所以這塊如果使用docker不進(jìn)行內(nèi)核調(diào)優(yōu),又擔(dān)心會(huì)影響性能,挺糾結(jié)
當(dāng)你開始糾結(jié)時(shí),表示已經(jīng)有了選擇。所以不用糾結(jié)了,還是直接部署到宿主機(jī)上吧。哈哈 ~0,,0~
這個(gè)容器怎么訪問外部的mysql,應(yīng)該要改配置吧
可能build的時(shí)候要指定一下
或者在dockerfile里面寫好配置
具體怎么弄呢?
需要在代碼中連接mysql的配置處指定,非容器或Dockerfile處。
若通過內(nèi)網(wǎng)連接mysql,將連接mysql的host換做內(nèi)網(wǎng)地址(非127.0.0.1),win上使用ipconfig查看,centos上使用ifconfig查看;公網(wǎng)連接直接使用公網(wǎng)ip即可。
打包成docker 鏡像,如何通過-e 參數(shù)讀取外部輸入的變量呢,
比如,webman 服務(wù)打包成docker鏡像,使用阿里云mysql,將myqli 地址和密碼 使用-e
MYSQL_ROOT_PASSWORD=123456
這種方式在webman 打包的時(shí)候如何使用,謝謝
可以用過 php 的 getenv 方法獲取環(huán)境變量:
懂了,啟動(dòng)日期的時(shí)候 -e DB_NAME = db_name 指定參數(shù),會(huì)把DB_NAME的值寫入到docker 容器內(nèi)部的環(huán)境變量里,$_ENV['DB_NAME'] 這樣去取值就行了
大佬 我在使用這個(gè)方案部署的時(shí)候前面都成功 到了安裝php擴(kuò)展的時(shí)候 那些鏡像返回的地址都是404
一個(gè)擴(kuò)展也安裝不上 最后報(bào)錯(cuò)退出了 你知道什么原因嗎?我是macos系統(tǒng)
因?yàn)閏entos7已經(jīng)不準(zhǔn)備維護(hù),所以很多軟件源都取消了對(duì)centos的鏡像支持。后續(xù)若有需要,我會(huì)出一個(gè)debian的。
謝謝,部署成功,但是我-v映射到/app卻啟動(dòng)不了,我是想做個(gè)開發(fā)的容器,我還得再研究研究
確保目錄映射正確,如外部代碼路徑為:"/home/docker/app",則使用 "-v /home/docker/app:/app" 映射。
若還是無法啟動(dòng),可使用 "docker logs -f 容器名" 或 查看runtime下的workman日志 來定位具體問題,若始終無法解決,請(qǐng)反饋。
大佬我是docker新手,目前本地可以跑起來了。
但是dockerfile不知道怎么配置。請(qǐng)幫我看看
看文檔就是要php環(huán)境和compose,我是這樣寫的
FROM php:8.2-alpine
RUN curl -sS https://getcomposer.org/installer | php
RUN mv composer.phar /usr/local/bin/composer
WORKDIR /app
COPY . /app
EXPOSE 3001
CMD [ "php", "/app/start.php","start"]
未安裝服務(wù)所需的php擴(kuò)展(非composer安裝的模塊);在 執(zhí)行 mv composer.phar /usr/local/bin/composer 后給 /usr/local/bin/composer 增加可執(zhí)行權(quán)限。
因?yàn)槲业膖p源碼有修改所以直接吧第三方插件復(fù)制進(jìn)去了所以不用安裝composer了,而且就是安裝composer,非常非常慢,已經(jīng)配置了阿里云的鏡像加速還是慢,請(qǐng)問大佬有什么方法可以提速嗎?還有就是hub.docker.com進(jìn)不去了有些鏡像都不知道怎么用,請(qǐng)問有可以代替的其他網(wǎng)站嗎?
FROM php:8.2-alpine
RUN docker-php-ext-install pcntl
RUN docker-php-ext-install mysqlnd
RUN pecl install redis && docker-php-ext-enable redis
WORKDIR /app
COPY . /app
EXPOSE 8000
CMD php webman start
謝謝解決了哈哈哈
FROM php:8.2-alpine
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add gcc g++ autoconf make
RUN pecl install igbinary lzf zstd \
&& docker-php-ext-enable igbinary lzf zstd \
&& pecl install redis \
&& docker-php-ext-enable redis
RUN docker-php-ext-install pdo pdo_mysql
RUN docker-php-ext-install pcntl
WORKDIR /app
COPY . /app
EXPOSE 8000
CMD php webman start
D:\wnmp\docker\webman-docker>docker build --rm -t developer/app:1.0 .
Sending build context to Docker daemon 17.27MB
Step 1/12 : FROM centos:7
---> eeb6ee3f44bd
Step 2/12 : RUN yum -y install yum-utils
---> Running in 448015c975e5
failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "/bin/sh": stat /bin/sh: no such file or directory: unknown
第二步就報(bào)錯(cuò)了,告辭