小白折腾服务器(二),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 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 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
5年前 评论

@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了

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
php @ abc
文章
20
粉丝
94
喜欢
197
收藏
231
排名:106
访问:8.9 万
私信
所有博文
社区赞助商