前提・実現したいこと
Dockerでdjangoの環境構築がしたい。
ただし環境上ではすでにwordpress(mariaDB(port:3306)あり)が動いており、djangoのmariaDBのポートを3307に変更し運用したい。
また、nginx-proxy,letssencryptを用いてサブドメインでアクセスできるようにしたい。
参考サイト様
https://qiita.com/NickelCreate/items/bed3dc9d088b57127ba7
該当のソースコード
ほとんど参考サイト様のままのコードです。
変更点はサブドメインの対応とssLの対応のみです。
以下変更箇所
# $ cat docker-compose.yml version: '3.4' volumes: django.db.volume: name: django.db.volume services: nginx: #ポートの削除+サブドメインとSSLの追加。 image: nginx container_name: django.nginx environment: VIRTUAL_HOST: python.XXXXX.net LETSENCRYPT_HOST: python.XXXXX.net LETSENCRYPT_EMAIL: aaaa@bbb.com volumes: - ./nginx/conf:/etc/nginx/conf.d - ./nginx/uwsgi_params:/etc/nginx/uwsgi_params - ./static:/static - ./nginx/log:/var/log/nginx depends_on: - web db: #ポートを3307へ変更 image: mariadb container_name: django.db ports: - 3307:3306 environment: MYSQL_ROOT_PASSWORD: password TZ: 'Asia/Tokyo' volumes: - django.db.volume:/var/lib/mysql - ./sql:/docker-entrypoint-initdb.d web: build: ./web container_name: django.web command: uwsgi --ini /code/sugoi_site/django.ini volumes: - ./src:/code - ./static:/static expose: - "8001" depends_on: - db networks: #別のcomposeで動かしているnginx-proxyとletsencryptのネットワークへつなぐ default: external: name: ssl-proxy
# ./src/sugoi_site/settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'sugoi_site', 'USER': 'root', 'PASSWORD': 'password', 'HOST': 'db', 'PORT': '3307', # ポートの変更 'OPTIONS': { 'charset': 'utf8mb4', }, } }
これがnginx-proxyとletsencryptです。
wordpressや他で動いているphpなどがこのネットワークに所属し、証明書などが保存されるようになっています。
$ cat ~/nginx-proxy/docker-compose.yml version: "2" services: nginx-proxy: image: jwilder/nginx-proxy container_name: nginx-proxy ports: - "80:80" - "443:443" volumes: - /var/run/docker.sock:/tmp/docker.sock:ro - ./certs:/etc/nginx/certs:ro - /etc/nginx/vhost.d - /usr/share/nginx/html - ./conf.d:/etc/nginx/conf.d - ./log:/var/log/nginx restart: always networks: - ssl-proxy letsencrypt: image: jrcs/letsencrypt-nginx-proxy-companion container_name: letsencrypt volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ./certs:/etc/nginx/certs:rw volumes_from: - nginx-proxy restart: always networks: - ssl-proxy networks: ssl-proxy: external: true
これでいけると思ったんですが...
発生している問題・エラーメッセージ
$ docker-compose run web ./manage.py makemigrations Creating network "django_django_default" with the default driver Creating volume "django.db.volume" with default driver Creating django.db ... done Traceback (most recent call last): File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py", line 216, in ensure_connection self.connect() File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py", line 194, in connect self.connection = self.get_new_connection(conn_params) File "/usr/local/lib/python3.7/site-packages/django/db/backends/mysql/base.py", line 227, in get_new_connection return Database.connect(**conn_params) File "/usr/local/lib/python3.7/site-packages/MySQLdb/__init__.py", line 84, in Connect return Connection(*args, **kwargs) File "/usr/local/lib/python3.7/site-packages/MySQLdb/connections.py", line 164, in __init__ super(Connection, self).__init__(*args, **kwargs2) MySQLdb._exceptions.OperationalError: (2003, 'Can\'t connect to MySQL server on \'db\' (111 "Connection refused")') The above exception was the direct cause of the following exception: Traceback (most recent call last): File "./manage.py", line 15, in <module> execute_from_command_line(sys.argv) File "/usr/local/lib/python3.7/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line utility.execute() File "/usr/local/lib/python3.7/site-packages/django/core/management/__init__.py", line 375, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/usr/local/lib/python3.7/site-packages/django/core/management/base.py", line 316, in run_from_argv self.execute(*args, **cmd_options) File "/usr/local/lib/python3.7/site-packages/django/core/management/base.py", line 353, in execute output = self.handle(*args, **options) File "/usr/local/lib/python3.7/site-packages/django/core/management/base.py", line 83, in wrapped res = handle_func(*args, **kwargs) File "/usr/local/lib/python3.7/site-packages/django/core/management/commands/makemigrations.py", line 103, in handle loader.check_consistent_history(connection) File "/usr/local/lib/python3.7/site-packages/django/db/migrations/loader.py", line 281, in check_consistent_history applied = recorder.applied_migrations() File "/usr/local/lib/python3.7/site-packages/django/db/migrations/recorder.py", line 61, in applied_migrations if self.has_table(): File "/usr/local/lib/python3.7/site-packages/django/db/migrations/recorder.py", line 44, in has_table return self.Migration._meta.db_table in self.connection.introspection.table_names(self.connection.cursor()) File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py", line 255, in cursor return self._cursor() File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py", line 232, in _cursor self.ensure_connection() File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py", line 216, in ensure_connection self.connect() File "/usr/local/lib/python3.7/site-packages/django/db/utils.py", line 89, in __exit__ raise dj_exc_value.with_traceback(traceback) from exc_value File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py", line 216, in ensure_connection self.connect() File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py", line 194, in connect self.connection = self.get_new_connection(conn_params) File "/usr/local/lib/python3.7/site-packages/django/db/backends/mysql/base.py", line 227, in get_new_connection return Database.connect(**conn_params) File "/usr/local/lib/python3.7/site-packages/MySQLdb/__init__.py", line 84, in Connect return Connection(*args, **kwargs) File "/usr/local/lib/python3.7/site-packages/MySQLdb/connections.py", line 164, in __init__ super(Connection, self).__init__(*args, **kwargs2) django.db.utils.OperationalError: (2003, 'Can\'t connect to MySQL server on \'db\' (111 "Connection refused")')
DBにつながらないというエラーですよね...
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES XXXXXXXXXXXX nginx "nginx -g 'daemon of…" 8 minutes ago Up 8 minutes 80/tcp django.nginx XXXXXXXXXXXX django_web "uwsgi --ini /code/s…" 8 minutes ago Up 8 minutes 8001/tcp django.web XXXXXXXXXXXX mariadb "docker-entrypoint.s…" 8 minutes ago Up 8 minutes 0.0.0.0:3307->3306/tcp django.db XXXXXXXXXXXX nginx "nginx -g 'daemon of…" 2 hours ago Up 2 hours 80/tcp wp.nginx XXXXXXXXXXXX wordpress:5.1-php7.3-fpm "docker-entrypoint.s…" 2 hours ago Up 2 hours 0.0.0.0:9000->9000/tcp wp XXXXXXXXXXXX mariadb "docker-entrypoint.s…" 2 hours ago Up 2 hours 0.0.0.0:3306->3306/tcp wp.db XXXXXXXXXXXX nginx "nginx -g 'daemon of…" 3 hours ago Up 3 hours 80/tcp php.nginx XXXXXXXXXXXX php:7.3-fpm "docker-php-entrypoi…" 3 hours ago Up 3 hours 9000/tcp php XXXXXXXXXXXX jrcs/letsencrypt-nginx-proxy-companion "/bin/bash /app/entr…" 20 hours ago Up 20 hours letsencrypt XXXXXXXXXXXX jwilder/nginx-proxy "/app/docker-entrypo…" 20 hours ago Up 20 hours 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp nginx-proxy
とりあえず、PHP、Wordpress、djangoの動いている状態での表示です。
試したこと
まっさらなLinux環境を作成し、手を加えない参考サイト様の状態で動かしたところ正常に動作しました。
また、正常に動いたもののMariaDBのportを3307にかえ、settings.pyのポートを3307にしたところ同じエラーが出ました。
しかし、settings.pyを3306にしたところ正常に繋がりました。(0.0.0.0:3307->3306/tcpの右側のportでつながる?)
それをもとに、動かない環境でも3306にしてみるも変化ありませんでした。(Wordpressのがあるから当然?)
一応、この状態でサブドメインにアクセスしたところ、djangoのインストール完了画面は表示されます。(ロケットの飛んでいる画面)
adminにアクセスして、適当にユーザーとパスを打つとDBにつながらない旨のエラー画面に行きます。
(正常に動いている環境下ではユーザーとパスが一致しない旨の表示が出るだけ。)
ほか
業務等ではなく、趣味でAWS lightsailで触っています。
docker,nginx,djangoいずれも最近触り始めたばかりで知識がありません。
mariaDBを外に出してwordpressとdjangoをまとめて管理するのが良いのでしょうか?
そういった点でのご指摘も大歓迎です。
また、不足している情報があればお申し付けください。
もし馬鹿なことをしていましたらご教示ください。(lightsail安いんだからdockerなんて使うなってのはご遠慮ください...)
何卒よろしくお願いいたします。
回答3件
あなたの回答
tips
プレビュー