我是docker的新手,所以不明白-如果我想建立mysql/postgresql/clickhouse等容器-如何创建数据库和数据库/表的模式?也许在dockerfile或者我可以在docker-compose.yml上完成?我的意思是,我不知道何时何地使用创建数据库;创建表。。。;查询是否使用流行数据库的docker容器
aelbi1ox1#
首先,您需要为db服务器创建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"
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 .
/var/lib/mysql
./data/db/mysql
ports: - "33060:3306"
这将把端口3306从容器Map到系统的33060端口,以避免在系统上安装mysql服务器时发生冲突。
environment: - MYSQL_DATABASE=YOUR_DB_NAME - MYSQL_ROOT_PASSWORD=YOUR_ROOT_USER_PASSWORD - MYSQL_USER=YOUR_USER - MYSQL_PASSWORD=YOUR_USER_PASSWORD
这将使用定义的参数创建一个数据库:名称、根密码,…,或者如果数据库已经存在,它将尝试使用定义的凭据进行访问。图像中已经定义了检查/创建数据库的功能。如果你想定义你自己的功能,你可以定义你的图像(例如。 dockerfile: ./Dockerfile 而不是 image: mysql:5.7 ). dockerfile可以是这样的:
dockerfile: ./Dockerfile
FROM mysql:5.7ARG MYSQL_DATABASEARG MYSQL_USERARG MYSQL_PASSWORDARG MYSQL_ROOT_PASSWORDENV MYSQL_DATABASE=${MYSQL_DATABASE}ENV MYSQL_USER=${MYSQL_USER}ENV MYSQL_PASSWORD=${MYSQL_PASSWORD}ENV MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}# copy predefined config fileCOPY configs/default.cnf /etc/mysql/conf.d/# To be sure that MySQL will not ignore configsRUN chmod og-w /etc/mysql/conf.d/default.cnf# DO SOMETHING ELSE YOU WANTEXPOSE 3306CMD ["mysqld"]
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
docker-compose up -d --build
jq6vz3qz2#
您可以同时使用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"
version: '3'
db:
image: percona:5.7
container_name: whatever_you_want
- MYSQL_DATABASE=${DATABASE}
- MYSQL_ROOT_PASSWORD=${ROOT_PASSWORD}
- MYSQL_USER=${USER}
- MYSQL_PASSWORD=${PASSWORD}
- ./data:/docker-entrypoint-initdb.d
- "3306:3306"
此外,你需要一个文件下 ./data 使用您想要运行的任何sql命令 .env 文件中定义我在 docker-compose.yml 上面的文件如下: ${DATABASE} 你的 .env 文件:
./data
.env
docker-compose.yml
${DATABASE}
# MySQLDATABASE=db_name_hereROOT_USER=rootROOT_PASSWORD=rootUSER=devPASSWORD=dev
# MySQL
DATABASE=db_name_here
ROOT_USER=root
ROOT_PASSWORD=root
USER=dev
PASSWORD=dev
您的文件包含要执行的sql命令 ./data/init.sql (您可以随意命名文件)
./data/init.sql
CREATE DATABASE 'whatever';DROP DATABASE 'whatever';-- you can do whatever you want here
CREATE DATABASE 'whatever';
DROP DATABASE 'whatever';
-- you can do whatever you want here
每次执行以下操作时,都将执行此文件:
docker-compose up -d db
deikduxw3#
下面是一个使用容器初始化sql server 2017数据库的示例。https://www.handsonarchitect.com/2018/01/build-custom-sql-server-2017-linux.html诀窍是使用shell脚本来运行,它将调用数据库初始化脚本。在执行初始化脚本之前,可能需要等待几秒钟,数据库引擎服务才能启动。
3条答案
按热度按时间aelbi1ox1#
首先,您需要为db服务器创建docker映像,或者使用已经存在的映像。
下面是mysql docker映像的一个例子。
让我们来描述一些部分:
这就像“安装”容器的
/var/lib/mysql
到系统的./data/db/mysql
. 因此,您的数据将在系统驱动器上,因为在debian中,mysql数据的默认路径是/var/lib/mysql
.这将把端口3306从容器Map到系统的33060端口,以避免在系统上安装mysql服务器时发生冲突。
这将使用定义的参数创建一个数据库:名称、根密码,…,或者如果数据库已经存在,它将尝试使用定义的凭据进行访问。图像中已经定义了检查/创建数据库的功能。
如果你想定义你自己的功能,你可以定义你的图像(例如。
dockerfile: ./Dockerfile
而不是image: mysql:5.7
). dockerfile可以是这样的:所以你可以用命令来建立你的容器
docker-compose up -d --build
jq6vz3qz2#
您可以同时使用docker和docker compose。例如docker compose。
创建一个名为docker-compose.yml的文件,如下所示:
此外,你需要一个文件下
./data
使用您想要运行的任何sql命令.env
文件中定义我在docker-compose.yml
上面的文件如下:${DATABASE}
你的.env
文件:您的文件包含要执行的sql命令
./data/init.sql
(您可以随意命名文件)每次执行以下操作时,都将执行此文件:
deikduxw3#
下面是一个使用容器初始化sql server 2017数据库的示例。https://www.handsonarchitect.com/2018/01/build-custom-sql-server-2017-linux.html
诀窍是使用shell脚本来运行,它将调用数据库初始化脚本。在执行初始化脚本之前,可能需要等待几秒钟,数据库引擎服务才能启动。