小白折腾服务器(二),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 协议》,转载必须注明作者和本文链接
iu_mysql:mysql
这什么意思@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了