小白折騰伺服器(二),docker-compose + deployer

aen233發表於2018-11-20

今天最佳化了一下,學著用docker-compose,將dockerfiles和deploy檔案放在一起,
docker-compose.yml和nginx的配置檔案透過scp命令傳到伺服器上,
執行docker-compose up -d,然後裝pdo_mysql的擴充套件,
最後在本地執行dep deploy。結束,正常訪問。

在 mysql + php + nginx 的基礎上增加了 redis 和 adminer。

5個檔案,5個命令,5個docker容器

5個檔案

|-- deploy-iu   
    |-- deploy    
        |-- .artisan_env
        |-- .env
        |-- deploy.php
    |-- dockerfiles  
        |-- nginx
            |-- default.conf
        |-- docker-compose.yml
5個命令
// 本地
scp -r ~/Sites/deploy-iu/dockerfiles  root@111.22.3.4:/var/www/html/iu-docker

// 伺服器(cd /var/www/html/iu-docker/dockerfiles)  
docker-compose up -d
docker-compose exec iu_phpfpm docker-php-ext-install pdo_mysql
docker-compose restart  iu_phpfpm

// 本地(cd ~/Sites/deploy-iu/deploy)    
dep deploy
5個容器
mysql
redis
php
nginx
adminer

其它筆記

// 進入redis容器
docker exec -it 51 redis-cli

docker-compose 需要注意的:
(筆記來源:使用docker-compose 大殺器來部署服務

1. 不要把 docker 當做資料容器來使用,資料一定要用 volumes 放在容器外面
2. 不要把 docker-compose 檔案暴露給別人, 因為上面有你的伺服器資訊
3. 多用 docker-compose 的命令去操作, 不要用 docker 手動命令&docker-compose 去同時操作
4. 寫一個指令碼類的東西,自動備份docker 對映出來的資料。
5. 不要把所有服務都放在一個 docker 容器裡面

docker-compose.yml

version: '3'
services:
  iu_mysql:
      image: mysql:5.7
      environment:
        MYSQL_ROOT_PASSWORD: 123456
      ports:
        - "3306:3306"
      volumes:
        - /var/www/html/iu-docker/data/mysql:/var/lib/mysql
      container_name: iu_mysql

  iu_redis:
      image: "redis"
      ports:
        - "6379:6379"
      volumes:
      - /var/www/html/iu-docker/data/redis:/data
      container_name: iu_redis

  iu_phpfpm:
       image: php:7.2-fpm
       ports:
         - "9000:9000"
       volumes:
         - /var/www/html/iu-deployer:/var/www/html/iu-deployer
       links:
         - iu_mysql:mysql
         - iu_redis:redis
       container_name: iu_phpfpm

  iu_nginx:
      image: nginx:1.12.2
      ports:
        - "80:80"
      volumes:
        - /var/www/html/iu-deployer:/var/www/html/iu-deployer
        - /var/www/html/iu-docker/dockerfiles/nginx:/etc/nginx/conf.d
      links:
        - iu_phpfpm:phpfpm
      container_name: iu_nginx

  iu_adminer:
      image: adminer
      ports:
       - "8080:8080"
      links:
       - iu_mysql:db
      container_name: iu_adminer

deploy.php

<?php

namespace Deployer;

require 'recipe/laravel.php';

set('repository', 'https://github.com/aen233/iu.git');
add('shared_files', []);
add('shared_dirs', []);
add('writable_dirs', []);
// 順便把 composer 的 vendor 目錄也加進來
add('copy_dirs', ['node_modules', 'vendor']);

host('111.22.3.4')
    ->user('root')// 使用 root 賬號登入
    ->identityFile('~/.ssh/aen233.pem')// 指定登入金鑰檔案路徑
    ->set('deploy_path', '/var/www/html/iu-deployer'); // 指定部署目錄

// 定義一個上傳 .artisan_env 檔案的任務
desc('Upload .artisan_env file');
task('artisan_env:upload', function () {
    // 將本地的 .env 檔案上傳到程式碼目錄的 .env
    upload('.artisan_env', '{{release_path}}/.env');
});

// 定義一個上傳 .env 檔案的任務
desc('Upload .env file');
task('env:upload', function () {
    // 將本地的 .env 檔案上傳到程式碼目錄的 .env
    upload('.env', '{{release_path}}/.env');
});

task('chmod', function () {
    run('cd {{release_path}} && chmod 777 -R storage/');
});

// 在 deploy:vendors 之前呼叫 deploy:copy_dirs
before('deploy:vendors', 'deploy:copy_dirs');

before('artisan:storage:link', 'artisan:migrate');
before('artisan:migrate', 'artisan_env:upload');
after('artisan:migrate', 'env:upload');

after('deploy:failed', 'deploy:unlock');
after('cleanup', 'chmod');

git地址: https://github.com/aen233/deploy-iu

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章