Docker-Compose Linux系统本地部署(一) Php+Nginx

147 阅读1分钟

这里Windows系统用docker-compose,Linux使用命令要使用docker compose

安装Docker+docker-compose

docker官网:www.docker.com/

github安装docker-compose:github.com/docker/comp…

docker compose 安装成功后,给执行权限sudo chmod +x <docker-compose目录>

docker --versiondocker compose --version可以确认是否安装成功

拉取镜像

docker pull <镜像名称:版本> 

这里建议去DockerHub官网去找

registry.hub.docker.com/

1708591591887.png 我们找到php和nginx,进入详情页面可以找自己想用的版本(nginx同理) 1708591906681.png 这里我用的是: 1708591794759.png

Dockerfile

我们需要一个Dockerfile文件(可供参考)

查阅命令文档:docs.docker.com/reference/d…

# 表示基于php:8.3.3-fpm镜像进行构建
FROM php:8.3.3-fpm
COPY . /var/www
WORKDIR /var/www
# 至此开始下面的三条命令用以在fpm生成的容器中安装composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin
# 下面是所需扩展(安装zip前必须有libzip-dev,故安装libzip-dev的命令在zip之前)
RUN apt-get update
RUN apt-get install -y libzip-dev
RUN docker-php-ext-install pdo_mysql
RUN pecl install redis
RUN docker-php-ext-enable redis
RUN docker-php-ext-install zip
# 至此,fpm容器就可以进行composer 的安装操作啦

该文件可以通过命令docker build .构建成一个新的镜像,镜像中会由上至下执行Dockerfile文件中写入的命令(“.”表示当前目录下的Dockerfile文件)

docker-compose.yml

使用docker compose up 命令启动时,需要当前目录存在一个docker-compose.yml文件,当容器启动时推荐命令后加入 -d ,表示后台执行

查阅命令文档:docs.docker.com/compose/com…

version: "3.8"
services:
  php:
    container_name: my-docker-api-php
    user: root
    build: .
    ports:
     - "8038:8000"
    volumes:
     - .:/var/www
    command: 'php artisan serve --host=0.0.0.0'
    networks:
     - my-docker-api

  nginx:
    container_name: my-docker-api-nginx
    image: "nginx:latest"
    ports:
     - "80:80"
    volumes:
     - ./nginx.conf:/etc/nginx/conf.d/default.conf
    networks:
     - my-docker-api

networks:
  my-docker-api:
    driver: bridge

volumes:
  esData:
    driver: local
解析
  1. 该文件中,指定了版本version:3.8,这个版本可以根据自己docker-compose的版本去选择

    1708592836090.png

    1708592747471.png

  2. 加入了两个服务,并定义了网络my-docker-api,各个服务可以连接的关键就在于他们在同一个网络下

  3. container_name参数为每个服务做了自定义容器名

  4. php中build命令表示我不使用现有的镜像,而是运行当前目录的Dockerfile文件为我构建一个镜像(“.”表示当前目录下的Dockerfile文件)

  5. 使用ports参数为每个服务定义了映射端口,表示宿主机ip映射容器ip<宿主机ip>:<容器ip>

  6. 为了不丢失数据,需要volumes参数(用于定义数据卷)对服务器使用过程中的数据进行映射(数据持久化),如上所示,我使用了本地的nginx配置文件去映射nginx容器中的配置文件以确保每次启动都不需要重新配置,php同理,我将本地所有数据与/var/www所有数据进行映射,这样在容器中进行更改时,就会同步到本地我们指定的目录或文件

配置文件

server {
    listen 80;
    server_name localhost;

    location / {
        proxy_pass http://my-docker-api-php:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

:在各个服务中所有的主机都要用本网络下的服务容器名替换(后面的mysql和elasticsearch连接还会运用到),故proxy_pass参数的http:// 后使用了本地php服务的容器名my-docker-api-php,端口设置服务端口8000而不是宿主机映射的8038

  1. 最外层的volumes参数的作用是自定义一个数据卷名称,下面是定义和不定义的区别(会在自定义的基础上加入当前目录名的前缀用以区分命名):

1708594115466.jpg

执行命令启动

docker compose up -d