简体   繁体   English

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

[英]How to create database in database docker container?

I'm new in docker, so cant understand - if I want to build container of mysql/postgresql/clickhouse etc - how to create database and schema of database/table? 我是docker中的新手,所以无法理解 - 如果我想构建mysql / postgresql / clickhouse等容器 - 如何创建数据库/表的数据库和模式? Maybe in Dockerfile or i can do it from docker-compose.yml? 也许在Dockerfile或我可以从docker-compose.yml做到这一点?

I mean, that I dont know when and where to use CREATE DATABASE; 我的意思是,我不知道何时何地使用CREATE DATABASE; CREATE TABLE ...; 创建表...; queries if I use docker containers of popular databases 查询我是否使用流行数据库的docker容器

You can use both docker and docker-compose. 您可以使用docker和docker-compose。 For example with docker compose. 例如,使用docker撰写。

Create a file called docker-compose.yml like: 创建一个名为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"

Additionally you need a file under ./data with whatever SQL commands you want to run and and .env file where you define the environmental variables I used in the docker-compose.yml file above like: ${DATABASE} 另外,你需要一个./data下的文件和你要运行的任何SQL命令,以及.env文件,你可以在其中定义我在上面docker-compose.yml文件中使用的环境变量,如: ${DATABASE}

Your .env file: 你的.env文件:

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

Your file with SQL commands to execute ./data/init.sql (you can name the file whatever you want) 您的文件使用SQL命令执行./data/init.sql (您可以根据需要命名文件)

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

This file will be executed each time you do: 您每次执行此文件时都会执行:

docker-compose up -d db

Here is an example I used to initialise SQL Server 2017 database using container. 这是我用于使用容器初始化SQL Server 2017数据库的示例。 https://www.handsonarchitect.com/2018/01/build-custom-sql-server-2017-linux.html https://www.handsonarchitect.com/2018/01/build-custom-sql-server-2017-linux.html

The trick is to use a shell script to run which will invoke the database initialisation script. 诀窍是使用shell脚本来运行,它将调用数据库初始化脚本。 You might have to wait for few seconds for the database engine service to start before executing the initialisation script. 在执行初始化脚本之前,您可能需要等待几秒钟才能启动数据库引擎服务。

At first you need to create docker a image for your db server, or use an already existing image. 首先,您需要为数据库服务器创建一个docker映像,或者使用已存在的映像。

Bellow is an example of mysql docker image . Bellow是mysql docker image的一个例子

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"

Let's describe some sections: 我们来描述一些部分:

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

This is like "mounting" container's /var/lib/mysql to system's ./data/db/mysql . 这就像将容器的/var/lib/mysql “挂载”到系统的./data/db/mysql So your data will be on your system drive , because in debian the default path to MySQL data is /var/lib/mysql . 所以你的数据将在你的系统驱动器上 ,因为在debian中,MySQL数据的默认路径是/var/lib/mysql

ports:
   - "33060:3306"

This will map port 3306 from container to system's 33060 port, to avoid conflicts if you have installed MySQL server on system as well. 这会将端口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

This will create a database with the defined parameters: name, root password, ..., or if a database already exists it will try to access with the defined credentials. 这将创建一个包含已定义参数的数据库:name,root password,...,或者如果数据库已存在,它将尝试使用定义的凭据进行访问。 Functionality to check/create database is already defined in the image. 检查/创建数据库的功能已在图像中定义。

If you want to define your own functionality you can define your image (eg dockerfile: ./Dockerfile instead of image: mysql:5.7 ). 如果要定义自己的功能,可以定义图像(例如dockerfile: ./Dockerfile而不是image: mysql:5.7 )。 Dockerfile can be something like this: 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"]

So you can build and up your container with command docker-compose up -d --build 因此,您可以使用命令docker-compose up -d --build构建和升级容器

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM