Вот docker-compose.yaml
services:
nginx:
image: nginx:1.23.3
container_name: nginx
volumes:
- /lnmpg/nginx/conf.d:/etc/nginx/conf.d:ro,cached
- /lnmpg/nginx/nginx.conf:/etc/nginx/nginx.conf :ro
- /lnmpg/nginx/log:/var/log/nginx
- /lnmpg/nginx/html:/usr/share/nginx/html
ports:
- "80:80"
- "443:443"
- "33060:3306"
environment:
- TZ=Asia/Shanghai
restart: always
networks:
- nginx-mysql
mysql:
image: mysql:5.7.41
# ports:
# - "3307:3306"
environment:
- TZ=Asia/Shanghai
- MYSQL_ROOT_PASSWORD=Xqw@1023
volumes:
- /lnmpg/mysql/init:/docker-entrypoint-initdb.d
- /lnmpg/mysql/my.cnf:/etc/mysql/my.cnf :ro
- /lnmpg/mysql/data:/var/lib/mysql
- /lnmpg/mysql/log:/var/log/mysql
restart: always
networks:
- nginx-mysql
А вот nginx.conf
stream {
log_format basic '$remote_addr [$time_local] '
'$protocol $status $bytes_sent $bytes_received '
'$session_time';
access_log logs/stream-access.log debug buffer=32k;
server {
listen 33060;
proxy_pass mysql:3306;
}
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
Я не знаю, что пошло не так, просто не смог подключиться к mysql с портом 33060
хоста. Если я отменю комментарий к портам в docker-compose.yml, я смогу получить к нему обычный доступ с помощью 3307
. Эти два контейнера находятся под одним и тем же сеть: nginx-mysql
, поэтому mysql:3306
в nginx.conf
должен распознаваться контейнером докеров как mysql's ip:3306
Я неправильно понял функцию network
или мои файлы конфигурации были неправильными? Кстати эти два докера находятся в одном файле docker-composer. Так что networks
не надо, верно?
Вы не можете этого сделать. nginx
в основном является прокси для HTTP (протокол передачи гипертекста). Это не поможет вам подключиться к совершенно другому протоколу, такому как MYSQL.
Возможно, вы можете объяснить в своем вопросе, почему вы пытаетесь проксировать доступ к MySQL в первую очередь.
Спасибо @StupidPz Не знал этого. Вход в него прямо сейчас.
То, что вы делаете, должно работать. Однако я могу заметить небольшую ошибку, заключающуюся в том, что вы сопоставляете порт 3306 с контейнером Nginx, но он прослушивает порт 33060. Думаю, я бы заставил Nginx прослушивать порт 3306, изменив строку в файле конфигурации на
listen 3306;
При желании вы также можете изменить файл docker-compose, чтобы вместо этого он отображал порт 33060 в контейнере.
Я не могу определить, что не так с вашими файлами, но вот минимальная работающая установка:
nginx.conf
events { }
stream {
server {
listen 3306;
proxy_pass mysql:3306;
}
}
докер-compose.yml
version: '3'
services:
proxy:
image: nginx
ports:
- 3306:3306
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
mysql:
image: mysql
environment:
- MYSQL_ROOT_PASSWORD=myrootpassword
- MYSQL_DATABASE=mydatabase
- MYSQL_USER=myuser
- MYSQL_PASSWORD=mypassword
Запустите и протестируйте с помощью
docker-compose up -d
docker run --rm --add-host host.docker.internal:host-gateway mysql mysql -h host.docker.internal -u myuser -pmypassword -e "show databases;"
попытался изменить порт прослушивания nginx на 3306 и изменил сопоставление портов на «3306: 3306», но это все равно не работает.
Я не могу определить, что не так с вашими файлами. Я добавил свою минимальную настройку, которую использовал для тестирования. Я надеюсь, что вы можете работать с этим, чтобы выяснить, что не так.
наконец выяснить причину. ` :ro` , не должно быть пробела перед :ro
Я только что видел, как кто-то сделал это, кроме того, они сказали, что это более безопасно для баз данных. И иногда к базе данных нельзя получить прямой доступ из Интернета, поэтому им нужен сервер перехода, как и nginx. На самом деле, мне также любопытно , действительно ли это необходимо делать?