文章目录
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/
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-composechmod +x /usr/local/bin/docker-composedocker-compose --version

docker-compose.yml一个个应用容器实例,比如订单微服务、库存微服务、mysql容器、nginx容器或者redis容器
由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
| 命令 | 说明 |
|---|---|
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 | 停止服务 |
按照一个进程一个容器原则,本次部署一共有下面几个容器(celery和uwsgi与web耦合较高未进行拆分)
Redis 容器:缓存服务
Mongo容器: 用户行为日志存储
Mysql 容器:数据存储
Django(uwsgi,celery)容器:处理动态请求
Nginx 容器:反向代理,处理静态资源

featech_v2_0 是 django 项目目录
deployment 文件夹放置了除 Django 容器外的四个容器配置信息以及其他挂载(容器和宿主机的共享卷)的其他文件。
Dockerfile:docker 环境文件
docker-compose.yml:编排容器文件
# 使用python:3.7.3作为基础镜像
FROM python:3.7.3
# 设置 python 环境变量
ENV PYTHONUNBUFFERED 1
# 创建项目目录并将本地项目目录文件复制到容器
RUN mkdir /featech_v2_0
COPY ./featech_v2_0 /featech_v2_0
# 设置工作目录,后续容器的操作都是基于此目录
WORKDIR /featech_v2_0
# 设置pip源(科学上网者可忽略)
RUN pip config set global.index-url http://mirrors.aliyun.com/pypi/simple
RUN pip config set install.trusted-host mirrors.aliyun.com
# 升级pip并安装python依赖
RUN pip install -U pip
RUN pip install -r /featech_v2_0/requirement.txt
# 暴露端口8888
EXPOSE 8888
Nginx容器dockerfile编写(这一步有点多余了,其实这里只是简单的创建了几个文件夹,完全可以放到docker-compose.yml中的command执行)
# 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
配置反向代理时,注意 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.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为容器名称。
“3303:3306”,是指把容器的3306端口映射到主机的3303端口),同时该容器端口也会对其他容器开放。
表示挂载,就是将本机的文件和容器中的文件映射起来,容器和本地环境本来是隔离的,挂载相当于是凿了一个小洞,让两者数据可以互通。
容器(django需要从数据库和缓存中读写数据),而 nginx 依赖于 django 容器(nginx 容器需要反向代理 django容器的8888端口)
将 数据库连接 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"
由于Docker-Compose编排 导致项目调试无法本地操练,下面决定手动一个一个启动容器
对外暴露端口3307

[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

对外暴露6373

requirements文件生成
记得加uwsgi模块

Dockerfile文件编写
FROM python:3.10.10
MAINTAINER alan@al6nlee.com
# 以下是重点,.的意思是把当前目录的所有文件(包含文件夹)copy到镜像/SeeStar中
RUN mkdir /custom_web
COPY ./custom_web /custom_web
WORKDIR /custom_web
RUN pip config set global.index-url http://mirrors.aliyun.com/pypi/simple
RUN pip config set install.trusted-host mirrors.aliyun.com
RUN pip install -U pip
RUN pip install -r /custom_web/requirements.txt
CMD ["uwsgi", "--ini", "uwsgi.ini"]
uwsgi.ini文件编写
[uwsgi]
# Django-related settings
#socket = :8001
http = :8888
# the base directory (project full path)
chdir = /custom_web
# Django s wsgi file
wsgi-file = /custom_web/custom_web/wsgi.py
master = true
processes = 4
chmod-socket = 664
vacuum = true
pidfile = 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


我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳