如何在数据库docker容器中创建数据库?

Den*_* Hm 6 mysql docker docker-compose clickhouse

我是 docker 新手,所以无法理解 - 如果我想构建 mysql/postgresql/clickhouse 等容器 - 如何创建数据库和数据库/表的架构?也许在 Dockerfile 中,或者我可以从 docker-compose.yml 中完成?

我的意思是,我不知道何时何地使用 CREATE DATABASE;创建表 ...; 查询我是否使用流行数据库的 docker 容器

llo*_*ono 6

您可以同时使用 docker 和 docker-compose。例如使用 docker compose。

创建一个名为 docker-compose.yml 的文件,如下所示:

version: '3'
services:
  db:
    image: percona:5.7
    container_name: whatever_you_want
    environment:
      - MYSQL_DATABASE=${DATABASE}
      - MYSQL_ROOT_PASSWORD=${ROOT_PASSWORD}
      - MYSQL_USER=${USER}
      - MYSQL_PASSWORD=${PASSWORD}
    volumes:
      - ./data:/docker-entrypoint-initdb.d
    ports:
      - "3306:3306"
Run Code Online (Sandbox Code Playgroud)

此外,您还需要一个文件,其中./data包含您想要运行的任何 SQL 命令,以及.env定义我在docker-compose.yml上面的文件中使用的环境变量的文件,例如:${DATABASE}

您的.env文件:

# MySQL
DATABASE=db_name_here
ROOT_USER=root
ROOT_PASSWORD=root
USER=dev
PASSWORD=dev
Run Code Online (Sandbox Code Playgroud)

包含要执行的 SQL 命令的文件./data/init.sql(您可以随意命名该文件)

CREATE DATABASE 'whatever';
DROP DATABASE 'whatever';
-- you can do whatever you want here
Run Code Online (Sandbox Code Playgroud)

每次执行此操作时都会执行此文件:

docker-compose up -d db
Run Code Online (Sandbox Code Playgroud)


Tar*_*yan 5

首先,您需要为您的数据库服务器创建 docker 映像,或者使用现有的映像。

下面是mysql docker 镜像的一个例子

version: "3"

services:

    ****************

    mysql:
        container_name: mysql
        image: mysql:5.7
        restart: on-failure
        environment:
            - MYSQL_DATABASE=YOUR_DB_NAME
            - MYSQL_ROOT_PASSWORD=YOUR_ROOT_USER_PASSWORD
            - MYSQL_USER=YOUR_USER
            - MYSQL_PASSWORD=YOUR_USER_PASSWORD
        ports:
            - "33060:3306"
        volumes:
            - "./data/db/mysql:/var/lib/mysql"
Run Code Online (Sandbox Code Playgroud)

我们来描述一些部分:

volumes:
   - "./data/db/mysql:/var/lib/mysql"
Run Code Online (Sandbox Code Playgroud)

这就像将容器“安装”/var/lib/mysql到系统上./data/db/mysql。所以你的数据将位于你的系统驱动器上,因为在 debian 中 MySQL 数据的默认路径是/var/lib/mysql.

ports:
   - "33060:3306"
Run Code Online (Sandbox Code Playgroud)

这会将容器的端口 3306 映射到系统的 33060 端口,以避免在系统上安装了 MySQL 服务器时发生冲突。

environment:
   - MYSQL_DATABASE=YOUR_DB_NAME
   - MYSQL_ROOT_PASSWORD=YOUR_ROOT_USER_PASSWORD
   - MYSQL_USER=YOUR_USER
   - MYSQL_PASSWORD=YOUR_USER_PASSWORD
Run Code Online (Sandbox Code Playgroud)

这将使用定义的参数创建一个数据库:名称、root 密码等,或者如果数据库已存在,它将尝试使用定义的凭据进行访问。检查/创建数据库的功能已在映像中定义。

如果您想定义自己的功能,您可以定义您的图像(例如dockerfile: ./Dockerfile代替image: mysql:5.7)。Dockerfile 可以是这样的:

FROM mysql:5.7

ARG MYSQL_DATABASE
ARG MYSQL_USER
ARG MYSQL_PASSWORD
ARG MYSQL_ROOT_PASSWORD

ENV MYSQL_DATABASE=${MYSQL_DATABASE}
ENV MYSQL_USER=${MYSQL_USER}
ENV MYSQL_PASSWORD=${MYSQL_PASSWORD}
ENV MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}

# copy predefined config file
COPY configs/default.cnf /etc/mysql/conf.d/

# To be sure that MySQL will not ignore configs
RUN chmod og-w /etc/mysql/conf.d/default.cnf

# DO SOMETHING ELSE YOU WANT

EXPOSE 3306

CMD ["mysqld"]
Run Code Online (Sandbox Code Playgroud)

所以你可以使用命令构建和建立你的容器docker-compose up -d --build