在Ubuntu 20.04中通过Docker compose搭建用于Laravel应用开发的容器
通过本文,最终会建立
一个app服务运行PHP7.4-FPM
db服务运行MYSQL 5.7
使用app服务来解析PHP代码,最后呈现Laravel应用到最终用户的nginx服务
请预先
初始化Ubuntu配置,
安装好Docker
安装好docker-compose
前面的搞完了,先来下载一个demo 的Laravel应用,已经是有初始状态可以用的了
执行
cd ~
执行
curl -L https://github.com/do-community/travellist-laravel-demo/archive/tutorial-1.0.1.zip -o travellist.zip
接下来解压这个压缩包
执行
unzip travelliist.zip
没有安装这个unzip命令的请执行
sudo apt update sudo apt install unzip
解压后可以看到~文件夹内多了个 travellist-laravel-demo-tutorial-1.0.1文件夹
接着移动这个文件夹到一个新文件夹 一条命令直接也可以创建这个新文件夹 【也可以叫重命名】
执行
mv travellist-laravel-demo-tutorial-1.0.1 travellist-demo
执行
cd travellist-demo
然后开始创建.env文件
laravel的配置文件都在config文件夹中,.env文件被用于设置环境依赖配置。比如密码之类的在发布的时候可有不同设置的值。
该文件也会在版本控制中被排除掉,同时因为该文件可以包含如数据库密码之类的信息,所以不要公共发布本文件。
执行
cp .env.example .env
执行
nano .env
开始编辑.env文件里的设置
首先数据库设置 初始配置是指向本地的 127.0.0.1 ,需要修改指向稍后我们会创建到Docker运行环境的数据库服务。
暂时把服务【一般都是这么命名】命名为db
即 修改
DB_HOST=127.0.0.1 为 DB_HOST=db
然后数据库名travellist 用户名travellist_user 密码password 【如果是想用其他值 自己设置就行】
后面我们在设置docker-compose.yml文件的时候,需要用到这几个值用来配置服务。
然后保存
设置应用的Dockerfile
虽然我们的Mysql 和Nginx服务都是基于Dockerhub下载的默认镜像。 但是我们还是需要做一点新的配置并另存为一个新的镜像
所以接下来创建一个新的Dokcerfile来搞定。
首先是需要基于PHP7.4-FPM的镜像。 然后我们需要配置一些其他的PHP模块 以及 Composer依赖管理工具。
并在该容器中创建一个新用户,用于开发时执行artisan和composer命令。
通过uid设置保证容器中的用户与该宿主机的系统用户一致。
如此任何通过上述命令创建的文件都会附带正确的权限复制到宿主机中。
如此便可以在宿主机中使用宿主机的文本编辑器来开发运行在容器里的应用!
创建一个新的Dockerfile执行:
nano Dockerfile
复制下面的内容到Dockerfile里
FROM php:7.4-fpm # Arguments defined in docker-compose.yml ARG user ARG uid # Install system dependencies RUN apt-get update && apt-get install -y \ git \ curl \ libpng-dev \ libonig-dev \ libxml2-dev \ zip \ unzip # Clear cache RUN apt-get clean && rm -rf /var/lib/apt/lists/* # Install PHP extensions RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd # Get latest Composer COPY --from=composer:latest /usr/bin/composer /usr/bin/composer # Create system user to run Composer and Artisan Commands RUN useradd -G www-data,root -u $uid -d /home/$user $user RUN mkdir -p /home/$user/.composer && \ chown -R $user:$user /home/$user # Set working directory WORKDIR /var/www USER $user
然后保存!
解释一下,上面就是说 我们使用一个基础镜像 php:7.4-fpm
安装完系统包,安装PHP扩展 然后从官方https://hub.docker.com/_/composer站点里复制可以执行的
composer镜像到这个应用镜像里。
一开始设置了使用user 和 uid参数 来创建新系统用户,这些值会被Docker Composer在搭建环境的时候被注入。
最后 我们设置了我们的默认工作文件夹 /var/www 然后切换为刚创建的新用户。这样可以保证我们是以正常用户
的方式链接上的,并且在应用容器里执行composer和artisan命令的时候处于正确的工作文件夹。
设置Nginx 配置和数据库打包文件
通过Docker compose创建运行环境的时候,为了设置或引导启动服务,一般要与服务的容器共享配置或者初始文件。
不过话是这么说,有的时候还是具体情况具体调整。
首先创建一个文件夹并在其中创建些文件来搞定配置及服务容器初始化。
执行
mkdir -p docker-compose/nginx #创建文件夹
nano docker-compose/nginx/travellist.conf
复制下面::
server { listen 80; index index.php index.html; error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; root /var/www/public; location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass app:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } location / { try_files $uri $uri/ /index.php?$query_string; gzip_static on; } }
然后保存。
解释一下,就是配置Nginx监听80端口,然后使用index.php文件作为默认首页。并设置文件夹根目录为
/var/www/public ,并设置Nginx通过9000端口使用app服务处理php文件。
为设置Mysql数据库,需要共享一个数据库打包文件,然后在容器初始化的时候引入它。这个特性是
在该容器中使用的MySQL5.7镜像提供的。
执行
mkdir docker-compose/mysql
执行
nano docker-compose/mysql/init_db.sql
然后
DROP TABLE IF EXISTS `places`; CREATE TABLE `places` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `visited` tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; INSERT INTO `places` (name, visited) VALUES ('Berlin',0),('Budapest',0),('Cincinnati',1),('Denver',0),('Helsinki',0),('Lisbon',0),('Moscow',1),('Nairobi',0),('Oslo',1),('Rio',0),('Tokyo',0);
保存。
这一段就是创建一个place表,然后插入一条示例数据。
应用的Dockerfile和服务初始化配置搞完了。
使用Docker Compose创建多容器环境
Docker Compose可以给运行在Docker上的应用创建多容器环境的。
一般在根目录下创建一个docker-compose.yml文件,里面定义不同服务如app,db,nginx的配置。
基于前面创建的那个Dockerfile搞出来的travellist镜像,它会运行一个容器,该容器使用php-fpm解析php代码,
返回结果由另一个容器中的Nginx服务来处理。
然后mysql服务是由一个运行MySQL 5.7的服务的容器提供的。
这三个容器要由一个叫travellist的网桥连接起来。
应用的文件会通过bind mounts 在app和nginx服务间同步。,这个bing mounts允许宿主机和容器间的双向同步。
执行
nano docker-compose.yml
一般来说格式要定义成这样:
version: "3.7" #标准格式,就是版本定义 services: #紧接着就是服务 networks: #再接着就是网络 travellist: driver: bridge #桥接
可以把没注释的这个骨架给复制到docker-compose.yml中
开始编辑app db nginx服务的代码:
1.首先是app服务的:
app: build: #即告知docker compose需要使用user参数,uid参数及Dockerfile配置在context路径下,生成一个app服务的本地镜像 args: user: tieress uid: 1000 context: ./ dockerfile: Dockerfile #此镜像使用的dockerfile与docker-compose.yml文件同目录 image: travellist #这是容器保存的镜像名 container_name: travellist-app #这是给容器的命名 restart: unless-stopped #总是重启,除非服务停止。 working_dir: /var/www/ #本app容器为了执行artisan命令,需要搞一个工作目录 volumes: #创建一共享卷,在本容器中,同步当前文件夹./的内容到[:] /var/www文件夹【这个目录是nginx容器中的/var/www目录】 - ./:/var/www networks: #配置本服务使用一个叫travellist的网络通信 - travellist
2.接下来是db服务:
因为docker compose会自动加载与docker-compose.yml文件同目录的.env文件,所以我们可以使用先前修改的.env文件中的变量配置
db: image: mysql:5.7 #直接用MysSQL5.7这个官方包 container_name: travellist-db restart: unless-stopped environment: #下面就是使用.env中的配置了 MYSQL_DATABASE: ${DB_DATABASE} MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} MYSQL_PASSWORD: ${DB_PASSWORD} MYSQL_USER: ${DB_USERNAME} SERVICE_TAGS: dev SERVICE_NAME: mysql volumes: #创建一个卷,共享用于初始化应用数据库的数据库dump包文件。 #MySQL镜像会自动引入容器里面存放于docker-entrypoint-initdb.d文件夹下的.sql文件 - ./docker-compose/mysql:/docker-entrypoint-initdb.d networks: - travellist
3.最后是nginx服务:
使用预制的Nginx镜像
nginx: image: nginx:1.19.1-alpine container_name: travellist-nginx restart: unless-stopped ports: - 8000:80 #使用ports定义,创建一个从宿主机8000端口重定向到容器内80端口的重定向。 volumes: #创建两个共享卷 - ./:/var/www #这个会同步当前文件夹到/var/www文件夹,当应用本地修改后,会立即同步到nginx服务容器中。 - ./docker-compose/nginx:/etc/nginx/conf.d #同步nginx配置文件复制到容器中Nginx配置文件夹内。 networks: - travellist
然后保存!
跑起来!
执行
docker-compose build app #生成我们的app镜像
执行
docker-compose up -d #后台运行起来。-d就是后台模式
执行
docker-compose ps #查看运行中的服务
环境跑起来了,接着执行几个命令完成应用的设置。
注:可以通过docker-compose exec 来执行命令,比如
执行 docker-compose exec app ls -l #用于查看应用文件夹内的文件详细信息。
执行
docker-compose exec app composer install #安装应用依赖包
执行
docker-compose exec app php artisan key:generate #生成key 【laravel配置步骤】
然后就可以访问8000端口看网站了。
本地机就是localhost:8000 服务器就是服务器ip:8000 绑定了域名的就是域名:8000
如果测试完了上线直接改端口映射 80:80 443:443这样。
另外
执行
docker-compose logs nginx #可以查看服务生成的logs
执行
docker-compose pause #暂停服务 但是不丢状态
执行
docker-compose unpause #恢复
执行
docker-compose down #停止 会移除全部容器,networks和卷
更多的命令查看 https://docs.docker.com/compose/reference/