docker-compose一键构建详细实践

2020-06-24  本文已影响0人  铁甲依然在人间

背景

  1. 使用docker启动的容器方便归方便,但是每次操作还需要手动重新构建,即使使用dockerfile还是略显麻烦。
  2. docker-compose是一个容器编排工具,就好像是每个容器都按照模板启动,每次操作由工具来管理。
    以下是docker-compose参考介绍:
    https://www.jianshu.com/p/ca1623ac7723
    https://www.jianshu.com/p/d19a64b82b78

准备

  1. 本次我们会启动四个容器mongo、mysql、flask框架写的业务逻辑部分和nginx部分
  2. 了解uwsgi协议、uWSGI服务器,了解nginx和uWSGI如何使用即可
    https://www.jianshu.com/p/48048554f989
  3. 参考一下docker-compose.yaml的书写规则
    https://www.jianshu.com/p/83047c191a61
  4. 整体逻辑要可以参考之前写的,这里业务端容器有些不同,使用uWSGIweb服务器和nginx
    https://www.jianshu.com/p/79042689b03c

开始

#网上的加速方法进入/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 文件格式

image.png
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 
上一篇下一篇

猜你喜欢

热点阅读