Python 全栈系列21 - 单机容器部署 docker-compose

0 说明

Docker简化了运行环境的配置,一个容器对应着一个应用。一个flask服务是一个容器,一个消息服务(消费者)也是一个容器,随着应用越来越多,容器也会越来越多(本身docker是允许一台宿主机同时运行上千个容器的)。因此其配置和管理就变成了一个问题,这个就是交给docker-compose解决的问题。从集群管理的角度上,我们把管理端称为NameNode、执行端称为DataNode,那么Docker应该是一个层级式集群问题。

假设一个人拥有n台主机,每台主机通过n个容器构成一个应用体系,容器是最基本的单元。管理n台主机的工具是docker-machine, 管理一台主机的工具是docker-compose,如果一台主机有多个容器,可以考虑使用nginx容器作为管理者(NameNode),用于管理、协调其他容器。

本篇讨论的是使用docker-compose管理单台主机的问题。

1 内容

1.1 容器构建的过程

假设宿主机只装了docker的情况:

  • 1 通过docker-login 连接镜像仓库
  • 2 构建dockerfile , 生成自己所需的镜像
  • 3 基于镜像启动容器,提供应用服务

alpine镜像是一种体积较小的linux镜像,采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗,但功能上比 busybox 又完善的多,因此得到开源社区越来越多的青睐。

1.2 单个容器的文件结构

app1: 某个应用
├── Dockerfile 该应用对应的镜像构造文件
├── app 核心应用程序(例如一个Flask蓝图)
├── config 配置文件以及一些静态设置文件(例如创建一些静态表)
├── entry.py 应用的入口程序,需要允许命令行传参
├── env 环境配置文件,例如requirements.txt, start.sh
└── packages 本地安装包,一般是自定义安装包

1.3 docker-compose 需要的结构

一台机器上当然可以保存多个单机配置,每个单机配置对应着一个git项目文件夹。例如使用Mac作为开发机,上面有5个项目文件夹(每个项目文件夹相当于一个单机配置)。可以认为,会有5台生产机,每台生产机会拉取对应的项目文件,并执行。

某个单机配置
├── app1: 某个应用
│ ├── Dockerfile
│ ├── app
│ ├── config
│ ├── entry.py
│ ├── env
│ └── packages
├──app2 : 某个应用
├──… 其他应用
└── docker-compose.yaml

1.4 docker-compose的配置文件

2 使用及测试

先要看一下镜像源,切换成中国的

# 1 打开文本编辑
vi /etc/docker/daemon.json
# 2 修改 
{
 
"registry-mirrors": ["http://hub-mirror.c.163.com"]
 
}
# 3 重启
systemctl restart docker.service

应当优先阿里的镜像加速,相比之下其他的都是乌龟爬

阿里云容器  服务
https://cr.console.aliyun.com/
首页点击“创建我的容器镜像”  得到一个专属的镜像加速地址,类似于“https://1234abcd.mirror.aliyuncs.com”

2.1 无NameNode(nginx)的模式

  • 将准备部署到某台机器的内容保存为一个文件夹,例如prj1

prj1
├── bserver
│ ├── Dockerfile
│ ├── app
│ ├── config
│ ├── entry_bserver.py
│ ├── env
│ ├── log
│ └── packages
├── docker-compose.yaml
└── 说明.md

  • 将prj1和服务器进行git同步
  • 在docker-compose.yaml中说明了启动的内容
version: '2'
services:
    api:
      build:
        context: ./bserver/
        dockerfile: Dockerfile
      restart: always
      volumes:
        - ./bserver/:/opt/app:rw

简单来说指定了version(docker-compose的), 服务目前只有一个(api),通过缩进展示了构建镜像所处的文件夹(context)以及对应的dockerfile。另外指定了挂载的数据卷,以及声明自动重启。
把数据同步到某台机器上后,执行 docker-compose up --build就可以了。未来每次更新代码都如下:

cd 【docker_compose文件夹】 && git pull && docker-compose down && docker-compose up -d --build

2.2 有NameNode(nginx)的模式

3 坑

  • 在使用ubuntu18 的时候碰到docker login的问题,后来把docker-compose删了才登上阿里的镜像仓库。然后重装docker-compose的时候国外的镜像仓库太慢,于是使用国内的
# 1 
curl -L https://get.daocloud.io/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

# 2 
chmod +x /usr/local/bin/docker-compose

# 3 检查版本
docker-compose --version

第三部检查版又出错,因为/usr/local/bin没有加入环境变量,后在~/.bashrc里面增加export PATH=$PATH:/usr/local/bin才成功。(我发现可能原来就没有必要去切换登录,原来似乎已经登好的)

  • 为什么nohup启动有问题?是否以守护态运行的docker-compose其实已经无所谓后台启动?
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页