一预备知识:
Ubuntu18.04
一个有sudo权限的非root用户
步骤一 下载Laravel框架安装依赖
git clone https://github.com/laravel/laravel.git laravel-app
cd laravel-app
使用Docker的composer 镜像 挂载文件夹,
docker run --rm -v $(pwd):/app composer install
-v参数 把当前文件夹挂在到/app
把项目目录属主改为当前用户
sudo chown -R $USER:$USER ~/laravel-app
步骤二 创建 Docker Compose File
vim ~/laravel-app/docker-compose.yml(最后有完整版)
在这里我们将定义三个服务,app,webserver和db。把下面的代码放入文件,并把MYSQL_ROOT_PASSWORD
version: '3' services: #PHP Service app: build: context: . dockerfile: Dockerfile image: digitalocean.com/php container_name: app restart: unless-stopped tty: true environment: SERVICE_NAME: app SERVICE_TAGS: dev working_dir: /var/www networks: - app-network #Nginx Service webserver: image: nginx:alpine container_name: webserver restart: unless-stopped tty: true ports: - "80:80" - "443:443" networks: - app-network #MySQL Service db: image: mysql:5.7.22 container_name: db restart: unless-stopped tty: true ports: - "3306:3306" environment: MYSQL_DATABASE: laravel MYSQL_ROOT_PASSWORD: your_mysql_root_password SERVICE_TAGS: dev SERVICE_NAME: mysql networks: - app-network #Docker Networks networks: app-network: driver: bridge
这里定义的服务包括:
app: 这个服务定义包含了laravel应用,Docker 镜像 digitalocean.com/php,容器的工作目录working_dir=/var/www
webserver:该服务定义从Docker获取nginx:alpine镜像,并公开端口80和443
db: 拉取了mysql:5.7.22 镜像,数据库名laravel。数据库密码,端口号3306
为了容器间通信,服务会被连接到一个叫做app-network的bridge network .bridge network 能让同样连接到同一网桥的容器进行通信。如果你不想所有的容器都能相互通信,你可以建立多个网桥,比如 frontend 和backend
步骤三 持久化数据
在docker-compose文件中,在db服务下定义一个数据卷dbdata 去持久化mysql数据库在添加
db: ... volumes: - dbdata:/var/lib/mysql networks: - app-network ...
这个叫dbdata的数据卷把/var/lib/mysql的内容持久化在容器里面,这样你关闭或者重启db服务就不会丢失数据了
文件的末尾加上volume
#Volumes volumes: dbdata: driver: local
这样就能用这个数据卷跨服务应用了
接下来给db服务绑定一个mysql配置文件
#MySQL Service db: ... volumes: - dbdata:/var/lib/mysql - ./mysql/my.cnf:/etc/mysql/my.cnf ...
然后再给webserver 服务,添加一个绑定挂载,一个是laravel框架,一个是nginx配置文件
#Nginx Service webserver: ... volumes: - ./:/var/www - ./nginx/conf.d/:/etc/nginx/conf.d/ networks: - app-network
第一个 是把当前文件夹挂载到/var/www
第二个 把nginx里面conf.d 文件夹挂载到/etc/nginx/conf.d/
最后给app服务添加挂载
#PHP Service app: ... volumes: - ./:/var/www - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini networks: - app-network
第一个 是把当前文件夹挂载到/var/www(挂载的容器不一样哦)
第二个 就是把配置文件挂载上去
最终看起来应该这样子:
version: '3' services: #PHP Service app: build: context: . dockerfile: Dockerfile image: digitalocean.com/php container_name: app restart: unless-stopped tty: true environment: SERVICE_NAME: app SERVICE_TAGS: dev working_dir: /var/www volumes: - ./:/var/www - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini networks: - app-network #Nginx Service webserver: image: nginx:alpine container_name: webserver restart: unless-stopped tty: true ports: - "80:80" - "443:443" volumes: - ./:/var/www - ./nginx/conf.d/:/etc/nginx/conf.d/ networks: - app-network #MySQL Service db: image: mysql:5.7.22 container_name: db restart: unless-stopped tty: true ports: - "3306:3306" environment: MYSQL_DATABASE: laravel MYSQL_ROOT_PASSWORD: your_mysql_root_password SERVICE_TAGS: dev SERVICE_NAME: mysql volumes: - dbdata:/var/lib/mysql/ - ./mysql/my.cnf:/etc/mysql/my.cnf networks: - app-network #Docker Networks networks: app-network: driver: bridge #Volumes volumes: dbdata: driver: local
Docker 允许我们用Dockerfile指定单独的容器的环境变量。Dockerfile使我们可以创建自定义镜像,然后可以基于我们的环境来安装一些应用依赖和配置设置。配置好后还可以发到Docker hub给别人共享
在laravel-app文件夹里面 创建Dockerfile
Dockerfile 将会设置基础镜像和列举必要命令和指令来构建laravel应用的镜像。
FROM php:7.2-fpm # Copy composer.lock and composer.json COPY composer.lock composer.json /var/www/ # Set working directory WORKDIR /var/www # Install dependencies RUN apt-get update && apt-get install -y \ build-essential \ mysql-client \ libpng-dev \ libjpeg62-turbo-dev \ libfreetype6-dev \ locales \ zip \ jpegoptim optipng pngquant gifsicle \ vim \ unzip \ git \ curl # Clear cache RUN apt-get clean && rm -rf /var/lib/apt/lists/* # Install extensions RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/ RUN docker-php-ext-install gd # Install composer RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer # Add user for laravel application RUN groupadd -g 1000 www RUN useradd -u 1000 -ms /bin/bash -g www www # Copy existing application directory contents COPY . /var/www # Copy existing application directory permissions COPY --chown=www:www . /var/www # Change current user to www USER www # Expose port 9000 and start php-fpm server EXPOSE 9000 CMD ["php-fpm"]
首先 Dockerfile 在镜像php:7.2-fpm之上建立一个镜像,这是一个基于Debian的镜像,并且安装了PHP-FPM,这个文件还安装了laravel必备的扩展,mcrypt,pdo_mysql mbstring,imagick 。
RUN指令在容器里指定更新,安装和配置设置。创建专用的www用户和分组
COPY 用文件夹的权限
最终EXPOSE命令在容器中开放一个9000的端口
CMD 执行一次容器命令,php-fpm
步骤五 配置php
mkdir ~/laravel-app/php
vim ~/laravel-app/php/local.ini
upload_max_filesize=40M
post_max_size=40M
步骤六 配置nginx
mkdir -p ~/laravel-app/nginx/conf.d
vim ~/laravel-app/nginx/conf.d/app.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;
}
}
步骤7 配置mysql
mkdir ~/laravel-app/mysql
vim ~/laravel-app/mysql/my.cnf
[mysqld] general_log = 1 general_log_file = /var/lib/mysql/general.log
步骤8 启动容器,修改环境配置
cp .env.example .env
docker-compose up -d #启动
docker ps 查看容器
Output
CONTAINER ID NAMES IMAGE STATUS PORTS c31b7b3251e0 db mysql:5.7.22 Up 2 seconds 0.0.0.0:3306->3306/tcp ed5a69704580 app digitalocean.com/php Up 2 seconds 9000/tcp 5ce4ee31d7c0 webserver nginx:alpine Up 2 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp
修改容器里的配置文件
docker-compose exec app vim .env
DB_CONNECTION=mysql DB_HOST=db DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=laraveluser DB_PASSWORD=your_laravel_db_password
生成安全key,保证sessions和加密数据安全
docker-compose exec app php artisan key:generate
缓存这些设置加速启动。
docker-compose exec app php artisan config:cache
最后访问 http://you_server_ip (宿主机的ip) 就可以看到laravel的换欢迎页面了
步骤9 创建mysql用户
进入容器:docker-compose exec db bash
mysql -u root -p 这里密码就是docke-composer 里面的your_laravel_db_password
show databases;
创建用户
GRANT ALL ON laravel.* TO 'laraveluser'@'%' IDENTIFIED BY 'your_laravel_db_password';
刷新权限
FLUSH PRIVILEGES;
exit 退出mysql exit 退出容器
步骤10 迁移数据
执行 :docker-compose exec app php artisan migrate
output
Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table
进入tinker
docker-compose exec app php artisan tinker
>>> \DB::table('migrations')->get()
Output
=> Illuminate\Support\Collection {#2856 all: [ {#2862 +"id": 1, +"migration": "2014_10_12_000000_create_users_table", +"batch": 1, }, {#2865 +"id": 2, +"migration": "2014_10_12_100000_create_password_resets_table", +"batch": 1, }, ], }