不懂就问 docker部署

使用docker部署时,源码是打包到容器里还是映射目录出来?宿主机有单独的mysql redis,nginx, 是不是docker只需要装一个php-fpm就可以? 如果代码放在容器里,有什么利弊?代码放在容器里,如何更新代码? 我目前因为vendor目录有些内容修改了,但我又不想将vendor加入git, 所以想用docker进行部署. 没有用过docker,不吝赐教!

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 7

如果你是单机的,你可以选择映射代码目录,也可以选择打包代码到镜像,如果你是要部署到多台服务器,我建议你打包到镜像,方便分发。

代码放在容器里,在你的构建过程中,就是会有拉取代码编译构建的过程,新旧镜像一般通过tag区分进行版本化控制,比如给镜像打tag release-v1.0.1,release-v1.0.2 等等。

代码放在宿主机映射进容器的,那么你更新代码无需去更新镜像,构建脚本里面或者人工直接在代码目录git pull更新代码即可

1年前 评论
忆往昔弹指间 (作者) 1年前
7small7 1年前

在使用 Docker 进行部署时,通常有两种方法可以将源代码放入容器中:

打包源代码到容器中:在这种情况下,你需要使用 Dockerfile 将源代码打包到镜像中。这样,每次你构建镜像时,源代码就会被打包到镜像中。

使用 Docker 的 volume 功能将源代码映射到容器中:在这种情况下,你可以使用 -v 选项将宿主机上的目录映射到容器中。这样,容器中的代码就是宿主机上的代码的副本,当你在宿主机上修改代码时,容器中的代码也会自动更新。

对于第二种方法,你可以使用 -v 选项将宿主机上的目录映射到容器中。例如,如果你想将宿主机上的 /path/to/code 目录映射到容器中的 /app 目录,你可以使用以下命令:

docker run -v /path/to/code:/app ...

这样,容器中的 /app 目录就是宿主机上的 /path/to/code 目录的副本,当你在宿主机上修改代码时,容器中的代码也会自动更新。

在选择打包源代码到容器中还是使用 volume 映射时,你需要考虑以下几点:

如果你希望源代码和运行环境被打包在一起,可以考虑打包源代码到容器中。这样,你可以使用 Docker 镜像快速部署应用,无需考虑源代码和运行环境的配置。

如果你希望源代码可以被简单地更新,可以考虑使用 volume 映射。这样,你可以在宿主机上修改代码,然后容器中的代码也会自动更新。 对于你的第二个问题,如果你的应用使用单独的 MySQL、Redis、nginx 等服务,你可以使用 Docker 部署这些服务,也可以在宿主机上安装这些服务。如果你选择使用 Docker 部署,你可以使用 Docker Compose 来管理容器之间的依赖关系。

如果你的应用只需要 PHP-FPM,那么只需要在 Docker 中部署 PHP-FPM 即可。

最后,如果你的代码放在容器中,要更新代码,你可以使用以下方法之一:

重新构建镜像:你可以修改 Dockerfile,然后使用 docker build 命令重新构建镜像。这样,新的源代码就会被打包到镜像中。

使用 volume 映射:如果你使用了 volume 映射,你可以在宿主机上修改源代码,然后容器中的代码也会自动更新。

使用 Git 或其他版本控制工具:你可以在容器中安装 Git 或其他版本控制工具,然后使用这些工具来更新代码。例如,你可以使用 git pull 命令在容器中更新代码。 对于你的最后一个问题,如果你的 vendor 目录有些内容修改了,但你又不想将 vendor 加入 git,你可以使用以下方法之一:

使用 .gitignore 文件忽略 vendor 目录:你可以在项目的 .gitignore 文件中添加 vendor 目录,这样 git 就不会跟踪 vendor 目录的修改了。

使用 Git 大小写敏感性解决方案:你可以使用 Git 的大小写敏感性解决方案,将 vendor 目录加入 Git,但是使用大写字母 VENDOR 来命名目录。这样,git 就会认为 VENDOR 和 vendor 是两个不同的目录,从而不会跟踪 vendor 目录的修改了。

使用其他版本控制工具:你也可以使用其他版本控制工具,如 Mercurial 或 Subversion,来管理你的项目。这些工具可能不会对文件的大小写敏感,所以你可以将 vendor 目录加入版本控制,而不会有问题。

1年前 评论

我可以给你一个我实际项目中构建应用容器的Dockerfile给你参考,我们使用的是云k8s服务,但基本原理是一样的,只不过k8s替我们完成了容器的自动化管理、扩容、滚动更新功能。

下面的brad/php:8.1这个镜像就是我们基于官方镜像 php:8.1-fpm 做出来的一个基础镜像,里面我们安装了一些我们需要的其他依赖,如PHP扩展bcmath pdo_mysql redis gd zip pcntlzip supervisor openssh-server软件等

FROM brad/php:8.1

COPY ./ /app
WORKDIR /app
COPY ./docker/php-fpm/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
COPY ./docker/php-fpm/php.ini /usr/local/etc/php/php.ini
COPY ./docker/php-fpm/www.conf /usr/local/etc/php-fpm.d/www.conf
COPY ./docker/php-fpm/laravel.ini /usr/local/etc/php/conf.d
COPY ./docker/php-fpm/laravel-worker.conf /etc/supervisor/conf.d
RUN rm -rf /app/docker && chmod +x /usr/local/bin/docker-entrypoint.sh && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["php-fpm"]
1年前 评论
sanders

开发环境肯定是自己将代码挂到容器卷里面方便,如果宿主机上有nginx,那么只部署php-fpm是可以的。

如果是生产环境部署,建议你将代码拷贝到镜像里面,这样发布的时候可以直接升级镜像版本,建立新容器,销毁旧容器,让docker自己管理部署过程。

1年前 评论

开发环境的话,一般代码目录是挂载进去的。会在容器里面执行composer这些操作,在宿主机修改业务代码,由于是挂载的,会同步更新容器内的代码。 生产环境部署的话,一般项目代码都会放在容器内部,在容器内 clone,composer,启动服务等。

1年前 评论

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