Django的Docker服务发现
django_discover的Python项目详细描述
此项目提供了在django中注册服务的简单工作流。它非常固执己见,赚了很多钱。 假设。
目标
开发django应用程序时,通常需要外部服务,如数据库、键值存储、 消息代理等。我更喜欢使用Docker和 Docker-Compose在开发应用程序时运行这些服务。
django-discovery只要遵循特定的工作流,就可以轻松地连接到这些服务:
开发是在您自己的机器上完成的,服务运行在Docker下;
测试是通过使用docker compose运行服务和应用程序来完成的;
生产环境提供了一个支持srv查找的dns。例如:
- Running everything under Kubernetes
- Running everything on Docker, configured to use an SRV-capable DNS such as Consul
要求
django-discovery需要python 3和django 1.8,因为我们生活在现代。
快速启动
下面的示例假设django应用程序需要mysql数据库。将以下内容添加到 settings.py:
from discovery import services db = services.register('my_db', 'mysql', secrets=['mysql_user', 'mysql_database', 'mysql_password']) DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': db.secrets['mysql_database'], 'USER': db.secrets['mysql_user'], 'PASSWORD': db.secrets['mysql_password'], 'HOST': db.host, 'PORT': db.port, } } DEBUG = services.debug_mode
现在可以在本地主机上使用Docker下的数据库运行应用程序,方法如下 docker-compose.yml:
my_db: image: mysql:5.6 ports: - ":3306" environment: MYSQL_ROOT_PASSWORD: supersecret MYSQL_DATABASE: database_name MYSQL_USER: database_user MYSQL_PASSWORD: alsosecret
您也可以在Docker中完整运行应用程序,例如使用以下Docker编写文件:
database: image: mysql:5.6 environment: MYSQL_ROOT_PASSWORD: supersecret MYSQL_DATABASE: database_name MYSQL_USER: database_user MYSQL_PASSWORD: alsosecret application: build: . links: - database:my_db ports: - "80:8080" env: DISCOVERY_MODE: env
而且仍然使用相同的settings.py,甚至可以使用以下命令在kubernetes下运行应用程序 定义:
apiVersion: v1 kind: Service metadata: name: my_db spec: ports: - protocol: tcp port: 3306
apiVersion: v1 kind: Endpoints metadata: name: my_db subsets: - addresses: - ip: 1.2.3.4 - ports: - port: 3306
apiVersion: v1 kind: Pod metadata: name: my_application namespace: my_namespace spec: containers: - name: my_application image: my/docker-image volumeMounts: - name: db_secrets mountPath: /etc/secrets/my_db readOnly: true volumes: - name: db_secrets secret: mysql_database: some_name mysql_user: some_user mysql_password: secret_password
完整文档
正在处理它…
许可证
这个项目是由麻省理工学院授权的。