文章目录
什么是Docker-Compose
Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器
Docker-Compose是Docker官方的开源项目, 负责实现对Docker容器集群的快速编排。
通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
下载安装
官网> https://docs.docker.com/compose/compose-file/compose-file-v3/
官网下载> https://docs.docker.com/compose/install/
安装1.
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
2.chmod +x /usr/local/bin/docker-compose
3.docker-compose --version
卸载
Compose核心概念
一文件
docker-compose.yml
两要素- 服务(service) > 一个个应用容器实例,比如订单微服务、库存微服务、mysql容器、nginx容器或者redis容器- 工程(project) > 由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
三个步骤- 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件- 使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。- 最后,执行docker-compose up命令 来启动并运行整个应用程序,完成一键部署上线
Compose常用命令
命令说明
docker-compose -h
查看帮助
docker-compose up
启动所有docker-compose服务
docker-compose up -d
启动所有docker-compose服务并后台运行
docker-compose down
停止并删除容器、网络、卷、镜像
docker-compose exec yml里面的服务id
进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker-compose ps
展示当前docker-compose编排过的运行的所有容器
docker-compose top
展示当前docker-compose编排过的容器进程
docker-compose logs yml里面的服务id
查看容器输出日志
docker-compose config
检查配置
docker-compose config -q
检查配置,有问题才有输出
docker-compose restart
重启服务
docker-compose start
启动服务
docker-compose stop
停止服务
Django+Mysql+Redis+Nginx部署
部署架构> 按照一个进程一个容器原则,本次部署一共有下面几个容器(celery和uwsgi与web耦合较高未进行拆分)- Redis 容器:缓存服务- Mongo容器: 用户行为日志存储- Mysql 容器:数据存储- Django(uwsgi,celery)容器:处理动态请求- Nginx 容器:反向代理,处理静态资源- featech_v2_0 是 django 项目目录- deployment 文件夹放置了除 Django 容器外的四个容器配置信息以及其他挂载(容器和宿主机的共享卷)的其他文件。- Dockerfile:docker 环境文件- docker-compose.yml:编排容器文件
构建django容器 - - - dockerfile编写
# 使用python:3.7.3作为基础镜像FROM python:3.7.3# 设置 python 环境变量ENV PYTHONUNBUFFERED 1# 创建项目目录并将本地项目目录文件复制到容器RUN mkdir /featech_v2_0COPY ./featech_v2_0 /featech_v2_0# 设置工作目录,后续容器的操作都是基于此目录WORKDIR /featech_v2_0# 设置pip源(科学上网者可忽略)RUN pip config set global.index-url http://mirrors.aliyun.com/pypi/simpleRUN pip config set install.trusted-host mirrors.aliyun.com# 升级pip并安装python依赖RUN pip install -U pipRUN pip install -r /featech_v2_0/requirement.txt# 暴露端口8888EXPOSE 8888
构建Nginx容器> Nginx容器dockerfile编写(这一步有点多余了,其实这里只是简单的创建了几个文件夹,完全可以放到docker-compose.yml中的command执行)- dockerfile编写
# nginx镜像FROM daocloud.io/nginx# 创建静态资源文件夹和ssl证书保存文件夹RUN RUN mkdir -p /usr/share/nginx/html/static;mkdir -p /usr/share/nginx/html/media;mkdir -p /usr/share/nginx/ssl
- 修改Nginx配置文件 > 配置反向代理时,注意 host 一定要改为 web,web即是django容器的名称(在docker-compose.yml中配置)server { listen 80; # 监听80端口 server_name 127.0.0.1; # 生产环境请换成域名 location / { proxy_pass http://web:8000; # 反向代理 django容器8000端口,web为django容器名称,切记不要写域名或者ip proxy_set_header Host $host; proxy_redirect off; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /static/ { alias /usr/share/nginx/html/static/; #静态资源路径 } location /media/ { alias /usr/share/nginx/html/media/; #上传文件路径 }}
docker-compose 编排容器> docker-compose.yml
version: '3'services: redis: image: daocloud.io/redis:3 container_name: featech_redis command: redis-server volumes: - ./deployment/redis/data:/data # 挂载数据库数据文件夹 ports: - "6373:6379" restart: always # always表容器运行发生错误时一直重启 db: image: mysql:5.7 container_name: featech_db ports: - "3303:3306" volumes: - ./deployment/mysql/data:/var/lib/mysql # 挂载数据库数据 # - ./deployment/mysql/conf/my.cnf:/etc/mysql/my.cnf # 挂载配置文件 - ./deployment/mysql/init:/docker-entrypoint-initdb.d/ # 挂载数据初始化sql脚本 environment: MYSQL_ROOT_PASSWORD: 12345678 # 数据库密码 MYSQL_DATABASE: fetach_v2_0 # 数据库名称 LNAG: C.UTF-8 command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci'] web: build: . container_name: featech_v2_0 # tty: true 如果web容器出错想进入容器做修改时,此配置可分配一个伪终端让容器先运行起来 # 容器启动后启动通过uwsgi启动django应用并启动celery,这里我简单实用了nohup启动celery,可选择使用supervisor管理 command: uwsgi --ini uwsgi && nohup celery -A celery_tasks.sms.tasks worker -l info >> celery_log/celery.log 2>&1 & depends_on: - db - redis - mongo links: - db - redis - mongo volumes: - ./featech_v2_0:/featech_v2_0 # 挂载项目目录 restart: always ports: - "8888:8888" nginx: build: deployment/nginx container_name: featech_nginx ports: - "80:80" - "443:443" expose: - "8888" volumes: - ./featech_v2_0/static:/usr/share/nginx/html/static # 挂载静态文件 - ./featech_v2_0/frontEnd:/usr/share/nginx/html/frontEnd # 挂载静态文件 - ./featech_v2_0/media:/usr/share/nginx/html/upload # 挂载上传文件 - ./deployment/nginx/ssl:/usr/share/nginx/ssl # 挂载ssl证书目录 - ./deployment/nginx/conf/conf.d:/etc/nginx/conf.d # 挂载配置文件 links: - web depends_on: - web restart: always mongo: image: mongo:4.0 container_name: featech_mongo hostname: mongo restart: always ports: - "27013:27017" environment: TZ: Asia/Shanghai #MONGO_INITDB_DATABASE: test #MONGO_INITDB_ROOT_USERNAME: root #MONGO_INITDB_ROOT_PASSWORD: 123456 volumes: - /etc/localtime:/etc/localtime - ./deployment/mongo/data:/data/db - ./deployment/mongo/init:/docker-entrypoint-initdb.d/ command: mongod
> redis,db,web,nginx,mongo为容器名称。- image 表示拉取镜像名称,build会在给定目录下寻找 Dockerfile 并构建容器环境。- expose 表示将端口暴露给其他容器,但不暴露给主机(不同容器默认相互隔离)。- ports 表示将该容器端口映射到主机端口(从右往左读,例如ports: - > “3303:3306”,是指把容器的3306端口映射到主机的3303端口),同时该容器端口也会对其他容器开放。- volumes > 表示挂载,就是将本机的文件和容器中的文件映射起来,容器和本地环境本来是隔离的,挂载相当于是凿了一个小洞,让两者数据可以互通。- links 表示将容器互联起来。- depends_on:表示依赖关系,因为容器的启动有先后顺序,django 容器依赖于 mysql 容器和 redis > 容器(django需要从数据库和缓存中读写数据),而 nginx 依赖于 django 容器(nginx 容器需要反向代理 django容器的8888端口)Django项目配置- settings.py文件配置 > 将 数据库连接 HOST 改为 mysql 容器名称 db
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # mysql驱动 'NAME': 'fetach_v2_0', # 数据库名称 'USER': 'root', # 登录帐号 'PASSWORD': '12345678', # 登录密码 'HOST': 'db', # 主机地址(容器部署) # 'HOST': '127.0.0.1', # 主机地址 'PORT': '3306', # 端口 'OPTIONS': {'charset': 'utf8mb4'}, }}
> 将缓存配置中的 host 改为 redis 容器名称 redis(如果你配置了redis作为缓存的话,没配置的话请忽略)CACHES = { 'default': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://redis:6379', # redis(容器) # 'LOCATION': '127.0.0.1:6379', 'OPTIONS': { "CLIENT_CLASS": "django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS": {"max_connections": 100}, 'SOCKET_TIMEOUT': 10, }, },}
> 生产环境部署请将 settings.py 中的 DEBUG = True 改为 DEBUG = False以关闭debug模式。broker_url = "redis://redis/2"result_backend = "redis://redis/3"
custom_web
由于Docker-Compose编排 导致项目调试无法本地操练,下面决定手动一个一个启动容器
mysql容器> 对外暴露端口3307
[client]default_character_set=utf8[mysqld]collation_server = utf8_general_cicharacter_set_server = utf8
redis容器> 对外暴露6373
Django容器- requirements文件生成 记得加uwsgi模块- Dockerfile文件编写
FROM python:3.10.10MAINTAINER [email protected]# 以下是重点,.的意思是把当前目录的所有文件(包含文件夹)copy到镜像/SeeStar中RUN mkdir /custom_webCOPY ./custom_web /custom_webWORKDIR /custom_webRUN pip config set global.index-url http://mirrors.aliyun.com/pypi/simpleRUN pip config set install.trusted-host mirrors.aliyun.comRUN pip install -U pipRUN pip install -r /custom_web/requirements.txtCMD ["uwsgi", "--ini", "uwsgi.ini"]
- uwsgi.ini文件编写[uwsgi]# Django-related settings#socket = :8001http = :8888# the base directory (project full path)chdir = /custom_web# Django s wsgi filewsgi-file = /custom_web/custom_web/wsgi.pymaster = trueprocesses = 4chmod-socket = 664vacuum = truepidfile = pid.uwsgi# run process background and save log to daemonize# daemonize = UWSGI.log
- 构建- 启动- 展示- Nginx容器
docker run -it -p 80:80 -v ./custom_web/static:/usr/share/nginx/html/static -v ./custom_web/frontEnd:/usr/share/nginx/html/frontEnd -v ./custom_web/media:/usr/share/nginx/html/upload -v ./nginx/ssl:/usr/share/nginx/ssl -v ./nginx/conf/conf.d:/etc/nginx/conf.d 605c77e624dd
版权归原作者 Al6n Lee 所有, 如有侵权,请联系我们删除。