这里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 --version和docker compose --version可以确认是否安装成功
拉取镜像
docker pull <镜像名称:版本>
这里建议去DockerHub官网去找
我们找到php和nginx,进入详情页面可以找自己想用的版本(nginx同理)
这里我用的是:
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
解析
-
该文件中,指定了版本version:3.8,这个版本可以根据自己docker-compose的版本去选择
-
加入了两个服务,并定义了网络my-docker-api,各个服务可以连接的关键就在于他们在同一个网络下
-
container_name参数为每个服务做了自定义容器名
-
php中build命令表示我不使用现有的镜像,而是运行当前目录的Dockerfile文件为我构建一个镜像(“.”表示当前目录下的Dockerfile文件)
-
使用
ports参数为每个服务定义了映射端口,表示宿主机ip映射容器ip<宿主机ip>:<容器ip> -
为了不丢失数据,需要
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
- 最外层的
volumes参数的作用是自定义一个数据卷名称,下面是定义和不定义的区别(会在自定义的基础上加入当前目录名的前缀用以区分命名):
执行命令启动
docker compose up -d