小白折腾服务器(二),docker-compose + deployer

今天优化了一下,学着用 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 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 2

iu_mysql:mysql 这什么意思

 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
6年前 评论

@lovecn 我是搬运工,如下,搬运自 http://dockone.io/question/795
link 是在两个 contain 之间建立一种父子关系,父 container 中的 web,可以得到子 container db 上的信息。
通过 link 的方式创建容器,我们可以使用被 Link 容器的别名进行访问,而不是通过 IP,解除了对 IP 的依赖。
不过,link 的方式只能解决单机容器间的互联,多机的情况下,需要通过别的方式进行连接。
--link=container_name or id:name 使用这个选项在你运行一个容器时,可以在此容器的 /etc/hosts 文件中增加一个额外的 name 主机名,这个名字为 container_name 的容器的 IP 地址的别名。这使得新容器的内部进程可以访问主机名为 name 的容器而不用知道它的 Ip。
内网是走 docker0 的网桥,互相之间是 Ping 的通的,但是 docker run 建立容器的时候,它的 Ip 地址是不可控制的,所以 docker 用 link 的方式使 web 能够访问到 db 中的数据。
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・我是分割线・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
然后说下我自己的理解,php 容器中需要读 mysql,但是 mysql 和 php 不在同一个容器,容器之间是独立的,所以需要连接起来,就要用 link,link iu_mysql:mysql,之后,在代码中,就是.env 文件中,mysql 的配置 host 不是 127.0.0.1,而是 mysql,就是这个冒号后的 mysql。读的其实就是 iu_mysql 容器的 mysql 了

6年前 评论

php @ abc
文章
20
粉丝
94
喜欢
198
收藏
232
排名:106
访问:8.9 万
私信
所有博文
社区赞助商