_공부하는/python

docker로 mysql, redis 실행

흰 the JohFam 2021. 12. 17. 23:46

참고) docker로 mysql, redis 실행. Django와 연결

Docker를 사용하여 MySQL 설치하고 접속하기

 

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