宿主机套用 docker 容器中安装 PHP 的开发环境
docker 可以把运行环境整体打包,但是在开发时,IDE 往往还要指定宿主机上的PHP 可执行文件,这样,安装php扩展时,要装两遍,比较麻烦.如果在宿主机上运行容器中的命令? 可以借助 docker exec -it <container_name> <command> <args> 命令, 写个 名为php 的shell 脚本,里面写入这行代码即可.
我用的环境是 wsl 中安装 docker, 很久以前,这个方法似乎很不通, 在 phpsrtom 中指定 php可执行文件时, 会报检测不通过,后来,这个方法又成功了.
从 ubuntu22.04 构建自己的基础镜像,这里主要是安装一些基础依赖,并切换了下镜像源。也可以跳过,直接用 ubuntu22.04 官方源。我之前用官方源时,发现 apt update 时,连接失败。然后我在香港云服务器上通过下面的 Dockfile 创建了个基础镜像。
#================================================================================================= # docker build --force-rm -t zbseoag/ubuntu:22.04 . #================================================================================================= FROM ubuntu:22.04 WORKDIR /home RUN set -eux ;\ apt-get update ;\ apt-get install -y --no-install-recommends --no-install-suggests ca-certificates ;\ cp /etc/apt/sources.list /etc/apt/sources.list.bak ;\ sed -i "s@http://.*archive.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list ;\ sed -i "s@http://.*security.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list
运行容器:
docker run -id --name work --add-host work:127.0.0.1 --network host -v /c:/c -v /d:/d --cap-add SYS_PTRACE --restart unless-stopped zbseoag/ubuntu:22.04
docker exec -it work bash
进入容器后,就像一般使用 ubuntu 一样,安装 php nginx mysql
apt install sudo apt install php-dev nginx mysql_server redis-server composer
在宿主机上创建 php 和 composer 脚本
su root echo 'docker exec -t work php "$@"' > /usr/local/bin/php echo 'docker exec -w $(pwd) -t work composer "$@"' > /usr/local/bin/composer chmod a+x /usr/local/bin/php /usr/local/bin/composer
然后,就可以在宿主机上尝试使用 php -v 查看版本
提交容器为镜像,并推送到 docker hub
docker commit work zbseoag/work:latest docker login docker push zbseoag/work:latest
为了方法更新我的工作镜像,在 .bashrc 中封装一个 shell 函数
function work(){ if [ -z "$1" ];then set -- bash fi case "$1" in run) docker rm -f work 2> /dev/null docker run -id --name work --add-host work:127.0.0.1 --network host -v /c:/c -v /d:/d --cap-add SYS_PTRACE --restart unless-stopped zbseoag/work:latest ;; commit) docker commit work zbseoag/work:latest && docker rm -f work && docker image prune -f work run ;; push) docker push zbseoag/work:latest ;; *) docker exec -w $(pwd) -it work "$@" #运行容器中的命令,比如:启动mysql时, work service mysql start esac }