• 从docker到docker-compose部署一个nginx+flask+mysql+redis应用


      目的是把一个flask项目的mysql数据库、redis数据库、flask应用、nginx服务分别装到四个容器中,然后用docker-compose命令同时启动与关闭

    一、安装docker

      Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。通过 uname -r 命令查看当前的内核版本

      更新yum

    sudo yum update

      移除旧版本

    sudo yum remove docker                   docker-client                   docker-client-latest                   docker-common                   docker-latest                   docker-latest-logrotate                   docker-logrotate                   docker-selinux                   docker-engine-selinux                   docker-engine

      安装系统工具

    sudo yum install -y yum-utils device-mapper-persistent-data lvm2

      添加软件源

    sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

      更新yum缓存

    sudo yum makecache fast

      安装docker-ce,对所有选项选y

    sudo yum -y install docker-ce

      查看docker版本

    docker --version

      启动docker

    sudo systemctl start docker

     

    二、只用docker部署

      注意区分:docker镜像是一个模版,docker容器是一个实例,它可以被启动与关闭。

      1、首先先把mysql和redis数据库跑起来

      拉镜像

    docker pull mysql
    docker pull redis:3.2

      运行,redis并不需要把端口暴露出来,因为只有flask应用需要访问它,直接在启动flask应用容器的时候link到redis就可以了

    docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=*** -d mysql
    docker run --name redis -d redis:3.2 redis-server --appendonly yes

      2、部署flask应用

      一开始我直接拉了一个centos镜像,然后再装python3、requirement.txt,但是后来发现直接用python:3.6的镜像会简单一点。

      首先,把项目复制到服务器

    scp -r 本地文件夹 root@服务器公网ip:服务器目标文件夹

      然后,创建一个Dockerfile,用于将应用build成镜像

      目录结构如下

      Dockerfile的内容

    FROM python:3.6
    ADD ./my-chat-server /app
    WORKDIR /app
    RUN pip install -r requirement.txt
    CMD ["python", "run.py"]

      RUN与CMD的区别在于,RUN是在创建镜像的时候执行的,而CMD在这个镜像创建的容器每次启动时都会执行

      ADD与COPY的区别在于,ADD可以写成 ADD http://foo.com/bar.go /tmp/main.go 或 ADD /foo.tar.gz /tmp/ 用于下载一个文件到容器中或者将一个压缩文件解压到容器中。

      然后,在flask目录执行

    docker build -t flask .

      这会创建一个名为flask的镜像

      然后启动这个镜像

    docker run --name flask -p 5000:5000 --link mysql:mysql --link redis:redis-server -d flask

      注意应用中mysql和redis的host都要相应改变,改成数据库容器在flask容器中的别名

      --link 容器名:容器别名 可以实现容器间的通信

      如无意外现在可以从服务器的5000端口访问到flask应用了

      3、部署nginx

      先拉一个镜像

    docker pull nginx

      然后启动

    docker run --name nginx -p 80:80 -d nginx

      将里面的nginx.conf文件内容拿出来

    docker exec -it nginx cat /etc/nginx/nginx.conf

      然后创建一个nginx.conf,把这些内容复制进去,在http里加上

        server {
          listen 80; 
          server_name 服务器公网ip;
        
          location / {
             proxy_pass  http://flask:5000;
        }
           access_log /var/log/access_unicom.log main;
        }

      然后把刚创的nginx镜像删掉,注意删除容器是docker rm;删除镜像是docker rmi

      创建一个以刚才创建的nginx.conf为配置的nginx容器

    docker run --name nginx -p 80:80 -v /root/nginx.conf:/etc/nginx/nginx.conf --link flask -d nginx

      现在通过服务器的80端口就可以访问到flask应用了

      只使用docker的部署完成,下面我们来用docker-compose实现更方便的部署

    三、docker-compose部署

      docker-compose可以很方便地通过一个文件构建多个镜像、启动多个容器。

      安装docker-compose(最新版

    sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    chmod +x /usr/local/bin/docker-compose

      要使用docker-compose,首先要把每个部分的Dockerfile写好,然后在docker-compose.yml文件中统一构建和启动

      整个docker-compose项目的目录结构为

      三个目录下分别有它们的Dockerfile和相关的配置文件或代码

      flask目录的目录结构和Dockerfile和之前是一样的

      mysql的Dockerfile

    FROM mysql
    COPY ./init.sql /docker-entrypoint-initdb.d

      init.sql是数据库初始化文件,它会把flask应用需要用到的库和表创建出来。在mysql官方镜像中提供了容器启动时自动执行/docker-entrypoint-initdb.d文件夹下的脚本的功能(包括shell脚本和sql脚本) 。因此我们只要把初始化文件在镜像启动时复制到/docker-entrypoint-initdb.d文件夹就可以了

      nginx的Dockerfile

    FROM nginx
    COPY ./nginx.conf /etc/nginx/nginx.conf

      在之前,我使用挂载的方式将nginx.conf导入nginx容器,这个方法有一个问题就是如果我要把这一套生产环境打包到另一个系统,docker export并不会将挂载的内容一起打包,因此,最好还是在构建镜像的时候就把相关配置加到镜像里。

      redis没有需要导入的配置,因此没有它的Dockerfile

      docker-compose.yml文件的内容

    version: '3'
    services:
      mysql:
        build: ./mysql
        ports: 
          - "3306:3306"
        environment:
          - MYSQL_ROOT_PASSWORD=***
        restart: always
      redis:
        image: redis:3.2
        restart: always
      flask:
        build: ./flask
        ports:
         - "5000:5000"
        links: 
         - mysql:mysql  
         - redis:redis-server 
        restart: always
      nginx: 
        build: ./nginx 
        ports: 
          - "80:80" 
        links: 
         - flask 

      docker-compose会先从每个服务的build目录下找到Dockerfile,然后依次镜像。所有镜像创建完毕后,再根据yml文件中其他配置依次启动镜像的容器。

      当docker-compose启动一次后,只要不更改它自动生成的容器和镜像,再次启动,它就不会再创建镜像,而是启动之前生成的容器。

      如果想要更改单个服务的内容,修改Dockerfile的内容、或者删除docker-compose自动生成的容器和镜像,再次启动docker-compose的时候,它会重新构建修改后服务的容器,而其他没有做过修改的服务不变

      执行docker-compose up启动所有服务

      你的应用已经可以在80端口访问了,enjoy!

  • 相关阅读:
    正则表达式
    理解CPU steal time
    装饰器(带参数)
    装饰器(入门)
    递归
    冒泡算法
    Chrome for Mac键盘快捷键!来自Google Chrome官网!
    swoole深入学习 4. process
    通俗讲解 异步,非阻塞和 IO 复用
    swoole深入学习 3. upd Server和udp Client
  • 原文地址:https://www.cnblogs.com/luozx207/p/9935252.html
Copyright © 2020-2023  润新知