当使用 docker-compose 文件在 docker 容器中运行 mariadb 时,我无法让 mariadb 使用 3306 以外的其他端口。
我已经阅读了 mariadb/docker 文档,在网上搜索并进行了自己的实验。
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"
FROM: mariadb: 10.3.14
COPY mydbscript.sql /docker-entrypoint-initdb.d/
EXPOSE 33020
CMD ["mysqld"]
它从不使用端口 33020。它仍然使用端口 3306。如何在运行时通过 docker-compose 文件动态传递端口?
容器镜像静态绑定到
:3306
。如果您想更改此设置,则需要构建新映像并配置数据库以在其他地方运行。
但是,Docker 允许您将其映射(发布)为不同的端口
:33020
。
正确的做法是:
MYSQL_TCP_PORT=3306
ports: - "33020:3306"
EXPOSE 3306
(不变)容器(内部)将正确引用
:3306
,但在外部(从主机)数据库将在 :33020
上公开。
NB 在 docker-compose(网络)内,其他容器必须继续引用端口
:3306
上的数据库。
您需要替换默认的
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
@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'
将其写入 my.cnf 文件中
[mysqld]
port = 33020
将此行代码添加到您的 docker 文件中
COPY my.cnf /etc/mysql/my.cnf
并确保将外部暴露端口更改为您想要使用的端口 e.i
EXPOSE 33020
ports:
- "33020:33020"
您现在可以使用
docker exec -it {databasename} mysql -u root -p
在终端中连接到数据库,或者通过将 ip: localhost 和端口设置为 33020 来连接到 mysql 工作台之类的东西
希望这有帮助。
我觉得这是一项如此复杂的任务,非常奇怪和不寻常。这可能是数百个开源映像部署中第一次要求我更改映像内的硬编码设置,而不是简单地映射 docker 中的端口。
我怀疑上面的 Fusca 是否确实使用发布的设置部署了服务。这对我不起作用,但不幸的是,这里的其他建议也不起作用。 mariadb 容器仍然在日志中报告发布到 3306,如果我简单地映射端口并在 redmine 环境变量中提供新端口,则 redmine 无法连接。
不幸的是,我碰巧每台机器运行多个服务,而这个端口恰好已经被占用!
我看到这样的危险信号,并立即开始寻求其他解决方案 - 如果缺少如此重要且简单的东西,我以后还会遇到什么?