docker-compose一键构建详细实践
2020-06-24 本文已影响0人
铁甲依然在人间
背景
- 使用docker启动的容器方便归方便,但是每次操作还需要手动重新构建,即使使用dockerfile还是略显麻烦。
- docker-compose是一个容器编排工具,就好像是每个容器都按照模板启动,每次操作由工具来管理。
以下是docker-compose参考介绍:
https://www.jianshu.com/p/ca1623ac7723
https://www.jianshu.com/p/d19a64b82b78
准备
- 本次我们会启动四个容器mongo、mysql、flask框架写的业务逻辑部分和nginx部分
- 了解uwsgi协议、uWSGI服务器,了解nginx和uWSGI如何使用即可
https://www.jianshu.com/p/48048554f989 - 参考一下docker-compose.yaml的书写规则
https://www.jianshu.com/p/83047c191a61 - 整体逻辑要可以参考之前写的,这里业务端容器有些不同,使用uWSGIweb服务器和nginx
https://www.jianshu.com/p/79042689b03c
开始
- 安装docker-compose
#网上的加速方法进入/etc/hosts,加上54.231.98.184 github-com.s3.amazonaws.com,亲测有效
#这个地址秒完成
curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose version # 查看版本号,测试是否安装成功
- 先看一下目录结构
#新建yaml文件
touch docker-compose.yaml
#新建四个为容器准备的文件夹
mkdir flask mongo mysql nginx
- 先看一下docker-compose.yaml怎么写。
选取一些使用到的参数:
env_file:环境变量文件
restart:容器重启策略,这里使用的是失败后总重启,always
volumes:文件挂载路径,前面是宿主机,冒号后面是容器内
ports:映射端口,前面是宿主机,冒号后面是容器内的端口
networks:docker的网络服务这里可以参考https://www.jianshu.com/p/347831f72d1c
environment:环境变量
😘mongo部分
容器重启策略是always,数据持久化
services:
mongo:
env_file:
- .env
image: mongo:latest
container_name: mongo
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: ${mongo_user}
MONGO_INITDB_ROOT_PASSWORD: ${mongo_password}
volumes:
- ${mongo_dir}:/data/db
ports:
- ${mongo_port}:27017
networks:
- default-network
😘mysql部分
容器重启策略是always,数据持久化
mysql-db:
env_file:
- .env
container_name: mysql-docker
restart: always
image: mysql:latest
ports:
- "3307:3306"
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_ROOT_HOST: ${MYSQL_ROOT_HOST}
volumes:
- ${MYSQL_DIR}:/var/lib/mysql
networks:
- default-network
😘flask部分
cd flask
#uwsgi配置
vim uwsgi.ini
#复制以下
[uwsgi]
#加载指定的python WSGI模块
module = py_flask:app
master = true
processes = 4
#代码的路径
chdir = /app
socket = :8002
chmod-socket = 666
#log日志
logto = /app/app.log
vacuum = true
#添加需要装的扩展
vim requirement.txt
#其他请参考本系列前篇
#编写容器的dockerfile
vim Dockerfile
FROM python:3.6.5
ADD ./ /app
WORKDIR /app
COPY . /app
RUN pip install -i https://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com -r requirement.txt
CMD ["uwsgi", "--ini", "/app/uwsgi.ini"]
把代码放在flask文件夹中,请参考本篇系列
flask:
build: ./flask
container_name: flask
restart: always
volumes:
- $PWD/flask:/app
networks:
- default-network
tips:
1.关于uwsgi配置项的socket怎么写我还是不特别明白,但是看一下这一篇会有一点理解
2.uwsgi配置去掉注释,可能会报错
https://zhuanlan.zhihu.com/p/72743798
😘nginx部分
cd nginx
vim flask.conf
server {
listen 80;
server_name 0.0.0.0;
location / {
include uwsgi_params;
#这里写uWSGI配置项中的socket
uwsgi_pass flask:8002;
}
}
nginx:
env_file:
- .env
container_name: docker-nginx
restart: always
image: nginx:latest
ports:
- "8102:80"
volumes:
- ${nginx_conf}/flask.conf:/etc/nginx/conf.d/default.conf
depends_on:
- flask
networks:
- default-network
参考以下.env 文件格式
tip:
1.注释会被当空行过滤掉。
😘补上docker-compose.yaml文件的另外部分
version: "3"
networks:
default-network:
tips
1.version指定版本:
2.不写networks会默认生成network,可以使用docker network ls查看。
对应版本参考以下下
https://www.jianshu.com/p/83047c191a61
😘最后启动,o( ̄▽ ̄)o 🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹
#在docker-compose.yaml同级目录
docker-compose up -d
#关闭
docker-compose down