Docker django mysql

Để biết phần giới thiệu từng bước về triển khai ứng dụng Python trên Heroku, hãy xem Bắt đầu trên Heroku với Python

Các tệp dự kiến ​​​​cho Python

Heroku tự động xác định ứng dụng của bạn là ứng dụng Python nếu có bất kỳ tệp nào sau đây trong thư mục gốc của nó

  • requirements.txt
  • setup.py
  • Pipfile

Nếu không có tệp nào trong số này có trong thư mục gốc của ứng dụng của bạn, gói xây dựng Python sẽ không xác định chính xác ứng dụng của bạn

Luồng triển khai Python

Khi bạn triển khai lên Heroku, các phần phụ thuộc mà bạn chỉ định trong tệp requirements.txt sẽ tự động được cài đặt trước khi khởi động ứng dụng

Nếu bạn đang sử dụng Django, lệnh cũng sẽ tự động chạy trong quá trình triển khai. Xem hướng dẫn của chúng tôi về Django và Tài sản tĩnh

Để tự động thực hiện các tác vụ khác (chẳng hạn như bất kỳ quá trình di chuyển cơ sở dữ liệu bắt buộc nào) trước khi ứng dụng của bạn được triển khai, bạn có thể thêm lệnh giai đoạn phát hành vào ứng dụng của mình

Các phiên bản và nâng cấp Python

Theo mặc định, ứng dụng của bạn tiếp tục sử dụng bất kỳ phiên bản Python nào được sử dụng khi nó được triển khai lần đầu tiên. Bạn có thể chỉ định một thời gian chạy Python khác để sử dụng trong tệp runtime.txt của ứng dụng

Sau khi đọc và kiểm tra mã được hiển thị trong môi trường phát triển django với docker, chúng tôi đã tách riêng môi trường phát triển của mình bằng cách sử dụng Docker, nhưng Làm cách nào chúng tôi có thể tách riêng ứng dụng và các phụ thuộc của mình với nhau? . . Ngoài ra, chúng tôi sẽ khắc phục sự cố đang chờ xử lý và tìm hiểu thêm một chút về mạng Docker

Giới thiệu

Môi trường phát triển của chúng tôi được hiển thị trong bài trước có hai nhược điểm

  1. Một phiên bản cụ thể của Python phải được cài đặt (và bất kỳ phụ thuộc nào) trong máy phát triển cục bộ của chúng tôi, môi trường làm việc của chúng tôi (Đó có thể là máy tính cá nhân của chúng tôi)
  2. Chúng tôi phải sửa đổi cấu hình Nginx bằng tay sau khi khởi động nó, bởi vì chúng tôi phải trỏ Nginx tới IP và cổng của ứng dụng đang chạy cục bộ của chúng tôi

Làm việc với một môi trường đang được sửa đổi liên tục (cài đặt hoặc gỡ cài đặt các yêu cầu hoặc dịch vụ) có thể mất một chút thời gian. Chúng tôi có thể dành vài giờ để tìm cách cài đặt các yêu cầu đó một cách thích hợp, thậm chí nhiều hơn nếu cần một phiên bản phụ thuộc cụ thể. Điều gì sẽ xảy ra nếu một phiên bản cụ thể của PostgreSQL được yêu cầu và bản phân phối của tôi không bao gồm cài đặt dễ dàng cho phiên bản đó? . )?

Ngoài ra, nếu một số nhà phát triển đang làm việc trên cùng một dự án, tất cả họ sẽ phải thay đổi cấu hình Nginx. Điều đó sẽ tạo ra một tệp không thể tải lên kho lưu trữ, vì mỗi nhà phát triển có thể có một IP khác nhau. Làm thế nào chúng ta có thể giải quyết điều này?

Giải pháp

Di chuyển ứng dụng của chúng tôi sang bộ chứa Docker (AKA “dockerizing”) sẽ cho phép chúng tôi khắc phục sự cố IP. Giải pháp này sẽ được triển khai bằng mạng docker. Docker cung cấp một chức năng cho phép chúng tôi tạo các mạng theo ý muốn và bao gồm các vùng chứa trong các mạng đó. Điều này giúp các vùng chứa có thể biết nhau bằng tên máy chủ (hoặc bí danh) của chúng. Nhưng điều này chỉ áp dụng cho các vùng chứa và ứng dụng của chúng tôi không chạy trong vùng chứa (nó không được cập cảng);

(GHI CHÚ. mã bên dưới dựa trên kho lưu trữ này)

1. Dockerfile

Docker mang đến một tệp có cú pháp đặc biệt để tạo hình ảnh. Dựa trên hình ảnh đó, chúng tôi có thể chạy ứng dụng của mình. Trong trường hợp này, chúng tôi muốn hình ảnh ứng dụng của mình dựa trên Python 3. 6 Docker image, sau đó chúng tôi sẽ thêm mã ứng dụng và cuối cùng chuẩn bị sẵn sàng mọi thứ để chạy nó

Tệp này sẽ được thêm vào thư mục gốc của dự án, nó được gọi là Dockerfile và chứa

# Dockerfile
FROM python:3.6
WORKDIR /app
COPY djangodocker djangodocker
COPY manage.py requirements.txt /app/
RUN pip install -r requirements.txt && \
python manage.py collectstatic --noinput
EXPOSE 8001CMD ["python", "manage.py", "runserver", "0.0.0.0:8001"]

Lệnh FROM sẽ cho docker biết chúng ta muốn sử dụng hình ảnh nào, trong trường hợp này là Debian với Python 3. 6 cài đặt. Lệnh COPY yêu cầu Docker thêm tệp vào hình ảnh đang được tạo. Lệnh

# docker-compose.yml
version: "3.2"
services:
app:
build: . # Current directory!
ports:
- "8001:8001"
0 cho phép chúng ta chạy các lệnh cụ thể bên trong ngữ cảnh của hình ảnh đang được xây dựng. Và cuối cùng, lệnh
# docker-compose.yml
version: "3.2"
services:
app:
build: . # Current directory!
ports:
- "8001:8001"
1 sẽ thiết lập một lệnh (hoặc tập lệnh) mặc định để chạy khi vùng chứa được khởi động

Sau đó, chúng tôi chạy lệnh này trong thiết bị đầu cuối của chúng tôi

# docker-compose.yml
version: "3.2"
services:
app:
build: . # Current directory!
ports:
- "8001:8001"
2

Điều này sẽ tạo một hình ảnh Docker với ứng dụng của chúng tôi và các yêu cầu của nó được cài đặt. Nhưng chúng tôi đang sử dụng docker-compose để thiết lập dịch vụ; . Điều này cho phép chúng ta xây dựng một container với docker-compose. Điều này có thể được viết

# docker-compose.yml
version: "3.2"
services:
app:
build: . # Current directory!
ports:
- "8001:8001"

Bây giờ chúng ta đã có ứng dụng dockerized của mình, hãy kết nối nó với các dịch vụ của nó

2. Docker soạn Networking

Hãy sử dụng docker-compose của chúng tôi. yml và tạo một mạng và kết nối các vùng chứa thông qua mạng này

Điều này có thể thực hiện được bằng cách thêm một khóa yaml khác.

# docker-compose.yml
version: "3.2"
services:
app:
build: . # Current directory!
ports:
- "8001:8001"
4. Trong khóa mới này, chúng tôi phải xác định tên mạng (trong trường hợp này là
# docker-compose.yml
version: "3.2"
services:
app:
build: . # Current directory!
ports:
- "8001:8001"
5). Sau đó, chúng tôi sẽ thêm mọi dịch vụ vào mạng đó. Các tập tin sẽ trông như thế này

________số 8_______

Cấu hình này sẽ giúp tất cả các vùng chứa thuộc cùng một mạng và giờ đây chúng có thể được tham chiếu theo tên của chúng. Nói cách khác. Nếu một vùng chứa nằm trong mạng “chính” và lệnh

# docker-compose.yml
version: "3.2"
services:
app:
build: . # Current directory!
ports:
- "8001:8001"
6 được sử dụng, tên máy chủ này sẽ được phân giải thành IP riêng của vùng chứa đó trong mạng đó. Đây là cách chúng tôi kết nối các container. o/

Bây giờ hãy sửa cấu hình

1. cấu hình cơ sở dữ liệu

Bây giờ chúng ta có thể truy cập máy chủ cơ sở dữ liệu bằng cách sử dụng “db”, vì vậy tệp

# docker-compose.yml
version: "3.2"
services:
app:
build: . # Current directory!
ports:
- "8001:8001"
7 sẽ chứa

# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'djangodocker_db',
'USER': 'root',
'PASSWORD': 'root',
'HOST': 'db', # Cambiamos por el nombre del servicio
'PORT': '3306',
}
}

2. cấu hình Nginx

Giờ đây, chúng tôi có thể truy cập máy chủ ứng dụng của mình bằng cách sử dụng “ứng dụng”, vì vậy tệp

# docker-compose.yml
version: "3.2"
services:
app:
build: . # Current directory!
ports:
- "8001:8001"
8 sẽ chứa

# nginx.conf
upstream django_server {
server app:8001 fail_timeout=0;
}

Sau đó, chúng ta chỉ cần chạy lệnh sau

# docker-compose.yml
version: "3.2"
services:
app:
build: . # Current directory!
ports:
- "8001:8001"
9

(GHI CHÚ. Nếu bạn đã chạy lệnh này, bạn sẽ cần thêm tùy chọn

#docker-compose.yml
version: "3.2"
services:
app:
build: .
networks:
- main # Add the container to the network "main"
depends_on:
- db
db:
image: mysql
environment:
MYSQL_DATABASE: djangodocker_db
MYSQL_ROOT_PASSWORD: root
networks:
- main # Add the container to the network "main"
nginx:
image: nginx
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
- ./static:/usr/share/nginx/djangodocker/static
ports:
- "80:80"
networks:
- main # Add the container to the network "main"
depends_on:
- app
networks:
main:
0)

Điều này sẽ tạo ra hình ảnh và chạy ứng dụng. Sau đó, chúng tôi có thể thực hiện di chuyển bằng cách chạy

#docker-compose.yml
version: "3.2"
services:
app:
build: .
networks:
- main # Add the container to the network "main"
depends_on:
- db
db:
image: mysql
environment:
MYSQL_DATABASE: djangodocker_db
MYSQL_ROOT_PASSWORD: root
networks:
- main # Add the container to the network "main"
nginx:
image: nginx
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
- ./static:/usr/share/nginx/djangodocker/static
ports:
- "80:80"
networks:
- main # Add the container to the network "main"
depends_on:
- app
networks:
main:
1. (GHI CHÚ. Điều này có thể thất bại nếu cơ sở dữ liệu chưa chạy, chỉ cần đợi vài giây và thử lại)

Mã cuối cùng có thể được nhìn thấy ở đây

Phần kết luận

Docker cho phép chúng tôi đóng gói ứng dụng của mình, làm cho môi trường trở nên di động, có thể định cấu hình và bảo trì hơn. Nó có thể thêm một cấp độ gián tiếp (Cài đặt python sẽ không dễ chạy ứng dụng hơn sao?), nhưng bây giờ bạn không cần cài đặt django hay python trong máy tính của mình, bạn chỉ cần docker