참고) docker로 mysql, redis 실행. Django와 연결
DB-mysql를 Docker로 실행, Cache Server-redis 실행
- 서버에서 docker 설치
(myvenv)ubuntu@ip-...
$ curl -fsSL https://get.docker.com/ | sudo sh
$ sudo usermod -aG docker $USER
바로 docker 명령어 실행하려 하면
- Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
오류 발생
-> docker 실행
$ sudo systemctl start docker
$ sudo systemctl enable docker
- mysql 설치
$ docker pull mysql
- docker 실행
$ docker run --name mysql-db -e MYSQL_ROOT_PASSWORD=<password> -d -p 3306:3306 mysql:latest
- docker 컨테이너 리스트 출력
$ docker ps -a
- docker 접속
$ docker exec -it mysql-db bash
root@c1dcbd698451:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.27 MySQL Community Server - GPL
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.08 sec)
- 로컬에서 settings.py 수정
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysql-db',
'USER': 'root',
'PASSWORD': '<password>',
'PORT': '3306',
'OPTIONS': {'charset': 'utf8m64'},
}
}
- docker로 redis 실행
$ docker run --rm --name some-redis -d -p 6379:6379 redis
(myvenv) ubuntu@ip-:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8f9ba2b3b3e1 redis "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp some-redis
c1dcbd698451 mysql:latest "docker-entrypoint.s…" 37 hours ago Up 37 hours 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql-db
django->Docker
더보기

되찾은 첫 화면..
참고) 서버개발자가 되는법 [2_1] - django, nginx 도커로 구동하기
- docker의 시작은 dockerfile
$ vi Dockerfile
# /srv/docker-server/TLOG_BE/Dockerfile
FROM python:3.8.10
ENV PYTHONUNBUFFERED 1
#unbuffered mode에서는 output을 버퍼에 저장하지 않고 바로 출력
RUN apt-get -y update
RUN apt-get -y install vim
RUN mkdir /srv/docker-server
ADD . /srv/docker-server
WORKDIR /srv/docker-server
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
EXPOSE 8000
CMD python manage.py runserver 0.0.0.0:8000
# requirements.txt
asgiref==3.4.1
backports.zoneinfo==0.2.1
Django==4.0
sqlparse==0.4.2
uWSGI==2.0.20
- 도커 이미지 생성
$ docker build -t tlog_be/django .
#폴더명은 반드시 소문자여야 함. 대문자면 build 불가
- 도커 이미지 확인
$ docker image list
- 도커 이미지 실행 -오류
$ docker run -p 8000:8000 tlog_be/django
...
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
->
1.
$ pip install pymysql
__init__.py, settings.py 파일에 아래 코드 추가
import pymysql
pymysql.install_as_MySQLdb()
보통 이렇게만해도 해결된다고 함..
$ sudo apt install libmysqlclient-dev
$ sudo apt install mysql-client-core-8.0
$ sudo apt-get install python3-dev
$ sudo apt-get install python-dev default-libmysqlclient-dev
$ pip install --force-reinstall --ignore-installed --no-binary :all: mysqlclient
Django 첫 화면 로딩 오류
- /srv/tlog_be였던 프로젝트를 docker로 만들 서버의 루트 폴더인 docker-server로 이동시켜 /srv/docker-server/tlog_be가 되었기 때문에 mysite.conf, mysite.ini, uwsgi.service 파일 수정해줘야.
# mysite.conf
server {
listen 80;
server_name *.compute.amazonaws.com;
charset utf-8;
client_max_body_size 128M;
location / {
uwsgi_pass unix:///tmp/mysite.sock;
include uwsgi_params;
}
location /static/ {
alias /srv/docker-server/tlog_be/static/;
}
}
# mysite.ini
[uwsgi]
chdir = /srv/docker-server/tlog_be/
...
# uwsgi.service
...
[Service]
ExecStart=/home/ubuntu/myvenv/bin/uwsgi -i /srv/docker-server/tlog_be/.config/uwsgi/mysite.ini
...
- 위 파일들 수정하면 nginx, uwsgi에 등록하고 데몬 새로고침 해줘야 함
$ sudo ln -f /srv/docker-server/tlog_be/.config/uwsgi/uwsgi.service /etc/systemd/system/uwsgi.service
$ sudo cp -f /srv/docker-server/tlog_be/.config/nginx/mysite.conf /etc/nginx/sites-available/mysite.conf
$ sudo ln -sf /etc/nginx/sites-available/mysite.conf /etc/nginx/sites-enabled/mysite.conf
$ sudo systemctl daemon-reload
$ sudo systemctl restart nginx uwsgi
- 로그 확인하기
$ sudo cat /var/log/uwsgi/mysite/2021-12-17.log

참고) Django 서비스 AWS로 배포하기 - [4] nginx 연결하기
nginx->Docker
- nginx 폴더 내에 nginx.conf, Dockerfile 생성 / mysite.conf는 수정(=nginx-app.conf)
/srv/docker-server/tlog_be/.config/nginx$ docker build -t tlog_be/nginx .
/srv/docker-server/tlog_be/.config/nginx$ docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
tlog_be/nginx latest 9975ce9d68c0 13 seconds ago 141MB
tlog_be/django latest e506fc1af475 33 hours ago 1.09GB
redis latest aea9b698d7d1 2 weeks ago 113MB
mysql latest bbf6571db497 2 weeks ago 516MB
nginx latest f652ca386ed1 2 weeks ago 141MB
python 3.8.10 a369814a9797 5 months ago 883MB
$ docker run -p 80:80 tlog_be/nginx
docker: Error response from daemon: driver failed programming external connectivity on endpoint hardcore_shtern (f3be47dc53481122a0d33b7d087cec88e706cfce6b150db5a698ed4d5309355b): Error starting userland proxy: listen tcp4 0.0.0.0:80: bind: address already in use.
->
$ netstat -lntp | grep 80
$ sudo kill -9 [PID]
- docker-compose
# /srv/docker-server/docker-compose.yml
version: '3'
services:
nginx:
container_name: nginx
build: tlog_be/.config/nginx
image: docker-server/nginx
restart: always
ports:
- "80:80"
volumes:
- ./tlog_be:/srv/docker-server
- ./log:/var/log/nginx
depends_on:
- django
django:
container_name: django
build: ./tlog_be
image: docker-server/django
restart: always
command: uwsgi --ini uwsgi.ini
volumes:
- ./tlog_be:/srv/docker-server
- ./log:/var/log/uwsgi
django, nginx의 Dockerfile 수정
- mysite.ini 수정(=uwsgi.ini)
#수정 전
[uwsgi]
chdir = /srv/docker-server/tlog_be/
module = mysite.wsgi:application
home = /home/ubuntu/myvenv/
uid = deploy
gid = deploy
socket = /tmp/mysite.sock
chmod-socket = 666
chown-socket = deploy:deploy
enable-thread = true
master = true
vacuum = true
pidfile = /tmp/mysite.pid
logto = /var/log/uwsgi/mysite/@(exec://date +%%Y-%%m-%%d).log
log-reopen = true
#수정 후
[uwsgi]
chdir = /srv/docker-server/
module = mysite.wsgi:application
socket = /srv/docker-server/apps.sock
master = true
vacuum = true
logto = /var/log/uwsgi/uwsgi.log
log-reopen = true
processes = 1
threads = 2
시간은 없는데 계속되는 오류에 지쳐서, Mysql만 Docker로 구동하기로 계획 변경.
지금까지 진행한 도커 데이터 리셋
** 모든 도커 이미지, 컨테이너 삭제하고 mysql pulling.
#모든 컨테이너 삭제
$ docker rm $(docker ps -a -q)
#모든 이미지 삭제
$ docker rmi $(docker images -q)
** 폴더 구조
/srv/docker-server/tlog_be
-> /srv/tlog_be 로 되돌려놓기
** uwsgi, nginx configuration 파일 수정
mysql-django 연결
$ mkdir ~/scripts
$ sudo vi ~/scripts/mysql-docker.sh
## /home/ubuntu/scripts/mysql-docker.sh
docker run -d -it --rm --name mysql-db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=db098 -v /home/ubuntu/mysql/data:/var/lib/mysql -e MYSQL_PASSWORD=db098 mysql:latest --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
- mysql-docker.sh 실행파일 만들기
$ sudo chmod +x ~/scripts/mysql-docker.sh
- aws에서 mysql 포트 열기 (3306)
- mysqlworkbench에서 ec2 인스턴스 계정 추가(host, password 입력)
$ python manage.py migrate
오류?
django.db.utils.OperationalError: (1049, "Unknown database 'mysql-db'")
- 'mysql-db' 이름의 스키마 생성 (CREATE SCHEMA 'mysql-db')
(myvenv) ubuntu@ip-172-31-13-171:/srv/tlog_be$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying sessions.0001_initial... OK
'_공부하는 > python' 카테고리의 다른 글
| Django 프로젝트 개발환경 준비 (0) | 2022.01.03 |
|---|---|
| (Django, AWS) 로그인 API 만들기 (0) | 2022.01.03 |
| (AWS) Django 프로젝트 AWS로 배포하기 -3 (0) | 2021.12.12 |
| (AWS) Django 프로젝트 AWS로 배포하기 -2 (0) | 2021.12.11 |
| (AWS) Django 프로젝트 AWS로 배포하기 -1 (0) | 2021.12.09 |