【问题标题】:How to create database in database docker container?如何在数据库 docker 容器中创建数据库?
【发布时间】:2018-07-26 06:12:40
【问题描述】:

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

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

【问题讨论】:

    标签: mysql docker docker-compose clickhouse


    【解决方案1】:

    您可以同时使用 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"
    

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

    您的.env 文件:

    # MySQL
    DATABASE=db_name_here
    ROOT_USER=root
    ROOT_PASSWORD=root
    USER=dev
    PASSWORD=dev
    

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

    CREATE DATABASE 'whatever';
    DROP DATABASE 'whatever';
    -- you can do whatever you want here
    

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

    docker-compose up -d db
    

    【讨论】:

    • 请将上述评论./date/init.sql更新为`./data/init.sql
    【解决方案2】:

    首先你需要为你的数据库服务器创建一个镜像,或者使用一个已经存在的镜像。

    下面是一个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"
    

    让我们描述一些部分:

    volumes:
       - "./data/db/mysql:/var/lib/mysql"
    

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

    ports:
       - "33060:3306"
    

    这会将容器的 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
    

    这将使用定义的参数创建一个数据库:名称、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"]
    

    因此您可以使用命令docker-compose up -d --build 构建和构建您的容器

    【讨论】:

      【解决方案3】:

      这是我使用容器初始化 SQL Server 2017 数据库的示例。 https://www.handsonarchitect.com/2018/01/build-custom-sql-server-2017-linux.html

      诀窍是使用 shell 脚本运行,该脚本将调用数据库初始化脚本。在执行初始化脚本之前,您可能需要等待几秒钟才能启动数据库引擎服务。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多