如何配置mariadb docker-compose文件以使用3306以外的其他端口?

问题描述 投票:0回答:5

当使用 docker-compose 文件在 docker 容器中运行 mariadb 时,我无法让 mariadb 使用 3306 以外的其他端口。

我已经阅读了 mariadb/docker 文档,在网上搜索并进行了自己的实验。

  1. docker-compose 文件:
version: '3.1'

services:

  db:
    image: mariadb
    restart: always
    environment:
    - MYSQL_ROOT_PASSWORD=mypassword
    - MYSQL_TCP_PORT=33030
    - MYSQL_UNIX_PORT=33020
    ports:
    - "33020:33020"
  1. Dockerfile:
FROM: mariadb: 10.3.14
COPY mydbscript.sql /docker-entrypoint-initdb.d/
EXPOSE 33020
CMD ["mysqld"]

它从不使用端口 33020。它仍然使用端口 3306。如何在运行时通过 docker-compose 文件动态传递端口?

docker docker-compose mariadb containers port
5个回答
6
投票

容器镜像静态绑定到

:3306
。如果您想更改此设置,则需要构建新映像并配置数据库以在其他地方运行。

但是,Docker 允许您将其映射(发布)为不同的端口

:33020

正确的做法是:

  • docker-compose
    MYSQL_TCP_PORT=3306
  • docker-compose
    ports: - "33020:3306"
  • Dockerfile
    EXPOSE 3306
    (不变)

容器(内部)将正确引用

:3306
,但在外部(从主机)数据库将在
:33020
上公开。

NB 在 docker-compose(网络)内,其他容器必须继续引用端口

:3306
上的数据库。


6
投票

您需要替换默认的

my.cnf
来为 MariaDB/MySQL 指定自定义端口:

cd /where/your/docker-compose.yml/located

docker run -it mariadb cat /etc/mysql/my.cnf > my.cnf

# use any text editor your like to open my.cnf, search for "port = 3306"
# and replace it to the port you like to have.

像这样配置你的 docker-compose.yml :

version: '3.1'

services:

  db:
    image: mariadb
    restart: always
    volumes:
    - type: bind
      source: ./my.cnf
      target: /etc/mysql/my.cnf
    environment:
    - MYSQL_ROOT_PASSWORD=mypassword
    # add your other configurations here

2
投票

@DazWilkin,@philip-tzou,当然有可能! 如何在没有配置文件的情况下设置端口甚至在 mariadb 的 dockerhub-page 中进行了解释。 (https://hub.docker.com/_/mariadb)@Software 只是犯了在 docker-compose.yml 中使用“=”而不是“:”的错误。我也是第一次这样做,因为我从 docker run bash 文件复制了环境变量。

这个 docker-compose.yml (带有 .env 文件)可以让我设置 mariaDB 服务的内部和外部端口:

version: "3.9"
services:
  database:
    image: mariadb:10.8
    container_name: ${db_containername}
    environment:
      MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: yes
      MARIADB_DATABASE: ${db_database}
      MARIADB_USER: ${db_user}
      MARIADB_PASSWORD: ${db_password}
      MYSQL_TCP_PORT: ${db_port_internal}
      MARIADB_AUTO_UPGRADE: 1
      MYSQL_UNIX_PORT: /run/mysqld/mysqld.sock
      MARIADB_MYSQL_LOCALHOST_USER: true
    restart: always
    ports:
      - '${db_port_external}:${db_port_internal}'
    expose:
      - ${db_port_external}
    volumes:
      - 'database_data:/var/lib/mysql'

1
投票

这是您为容器内的 mariadb 设置不同端口的方法

1.在与 dockerfile 相同的目录中创建 my.cnf 文件

将其写入 my.cnf 文件中

[mysqld]
port = 33020

2.将 cnf 文件添加到 dockerfile 并编辑 EXPOSE

将此行代码添加到您的 docker 文件中

COPY my.cnf /etc/mysql/my.cnf

并确保将外部暴露端口更改为您想要使用的端口 e.i

EXPOSE 33020

3.确保更改 docker-compose.yml 文件中的端口

ports:
- "33020:33020"

您现在可以使用

docker exec -it {databasename} mysql -u root -p
在终端中连接到数据库,或者通过将 ip: localhost 和端口设置为 33020 来连接到 mysql 工作台之类的东西

希望这有帮助。


0
投票

我觉得这是一项如此复杂的任务,非常奇怪和不寻常。这可能是数百个开源映像部署中第一次要求我更改映像内的硬编码设置,而不是简单地映射 docker 中的端口。

我怀疑上面的 Fusca 是否确实使用发布的设置部署了服务。这对我不起作用,但不幸的是,这里的其他建议也不起作用。 mariadb 容器仍然在日志中报告发布到 3306,如果我简单地映射端口并在 redmine 环境变量中提供新端口,则 redmine 无法连接。

不幸的是,我碰巧每台机器运行多个服务,而这个端口恰好已经被占用!

我看到这样的危险信号,并立即开始寻求其他解决方案 - 如果缺少如此重要且简单的东西,我以后还会遇到什么?

© www.soinside.com 2019 - 2024. All rights reserved.