数据库的安装配置往往是耗时费力的一个过程,不同厂商的数据库有不同的配置策略,但docker的容器技术可以使之变得简单。
从我过往的工作项目经历中、当前国内各公司使用的主流关系型数据库来看,mysql、sqlserver、postgres、oracle无疑是使用最广泛的几大数据库,因此来讲下如何使用docker创建这几个数据库的容器,然后使用数据库软件外部连接作为测试或学习使用。
在创建容器前,需要先安装好docker。
docker创建运行mysql容器
创建mysql容器
mysql可以选择特定版本的镜像下载,docker官方仓库mysql版本可参考 mysql镜像版本 ,用docker创建数据库容器需要考虑数据的持久化策略,这个可以通过挂载卷来解决。
下载mysql镜像
#下载mysql镜像,不指定版本默认为latest
docker pull mysql:5.7
#如想删除docker镜像可使用 docker rmi 镜像id
选读:在拉取docker镜像时,如果报下图的 permission denied 错误,说明当前用户没有权限操作docker,需要切换成root用户或者已加入docker组的用户来执行docker命令,或者将当前用户加到docker组内,这样以后就无需每次切换到root用户来执行docker命令了。
#在linux命令行查看docker组内现在的用户有哪些--执行下面命令后找到docker组,最后一个冒号后跟上的用户就是组内的用户 cat /etc/group #将当前用户加入docker组,这里docker是组名,axlsss是要添加到组里的用户名 usermod -aG docker axlsss
#查看mysql镜像
docker images | grep mysql
创建mysql容器
#使用mysql镜像来创建容器
docker run -d -p 3306:3306 -v /var/lib/docker/volumes/mysql/conf:/etc/mysql/conf.d -v /var/lib/docker/volumes/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql3306 mysql:5.7
#如想删除docker容器可使用 docker rm 容器id
docker run参数释义:
- -d:在后台运行容器
- -p:小写p,第一个3306是宿主机端口(外部连接此容器数据库即使用此端口),第二个3306是容器内部端口
- -v:卷挂载(可选项),这里使用的是指定路径挂载方式(指定宿主机挂载路径,路径可任意设置,此处使用docker默认位置),格式为(宿主机路径:容器内路径),即可将容器内重要文件挂载到宿主机指定位置,可实现在外部访问这些容器内文件,可以多次使用-v来挂载多个。另外还有匿名挂载和具名挂载方式,这两种方式挂载的位置没默认docker安装路径下,比如我的在/var/lib/docker/volumes/ 路径下面。注意宿主机上的挂载文件夹要提前创建(比如此处的mysql与mysql/data文件夹)。
- -e:初始化mysql用户,设置root密码
- –name:容器的名称
- mysql:5.7:镜像名称:镜像tag
#查看创建完的容器
docker ps -a
#查看容器挂载卷信息,找到Mounts行
docker inspect 42189c7a7eae
#或者
docker volume ls
可以进入后台运行的mysql容器
#进入容器
docker exec -it 42189c7a7eae /bin/bash
#退出容器使用 exit
#退出容器,然后查看3306端口是否开启监听,如果是使用的服务器,还需要添加安全规则配置(入方向添加相应端口)
netstat -anlp | grep 3306
连接mysql
按上面步骤创建完mysql容器并且端口开启监听后,我们可以使用数据库软件在外部连接mysql使用。
此处使用datagrip软件来演示连接mysql数据库
- 新建数据库连接
- 填写 主机、端口、用户名、密码 ,此处用户使用root,密码是上面创建日期时在 MYSQL_ROOT_PASSWORD=123456 处设置的密码
- 点击测试连接,显示已成功表示可以连接到创建的容器mysql
mysql的使用测试
连接到mysql后,新建一个sql查询窗口进行使用测试
#创建一个测试schema
create schema test_schema;
#创建测试表
create table test_schema.test_table (
id varchar(10)
);
#插入测试数据
insert into test_schema.test_table(id) values('1');commit;
#查询测试表数据
select * from test_schema.test_table;
以上语句都能正常运行,说明mysql数据库容器成功创建,然后到宿主机挂载mysql data的路径下可以看到刚刚创建的数据文件
#进入data卷挂载的路径下查看创建的时间文件
cd /var/lib/docker/volumes/mysql/data
docker创建运行sqlserver容器
创建sqlserver容器
sqlserver可以选择特定版本的镜像下载,docker官方仓库sqlserver版本可参考 sqlserver镜像版本 ,如需考虑sqlserver数据的持久化,也可以通过挂载卷来解决。
由于我用的是M1芯片ARM架构的Mac,docker hub中官方的sqlserver镜像并不支持此架构,故而不能使用。
但还是有办法在Mac M1的docker里使用sqlserver数据库的,只不过折中一下,通过Azure SQL Edge镜像创建的容器来使用sqlserver。
Azure SQL Edge 与 SQL Server 的关系
Azure SQL Edge 是基于最新版本的 SQL Server 数据库引擎构建的,提供行业领先的性能、安全性和查询处理功能。 由于 Azure SQL Edge 建立在与 SQL Server 和 Azure SQL 相同的引擎上,因此它提供相同的 Transact-SQL (T-SQL) 编程外围应用,使应用程序或解决方案的开发更简单且更快速,使应用程序在 IoT Edge 设备、数据中心和云之间的可移植性变得简单。
下载镜像(按架构选择其中之一下载)
#非ARM架构:sqlserver镜像下载
docker pull mcr.microsoft.com/mssql/server:2019-latest
#ARM架构:sqlserver镜像下载
docker pull mcr.microsoft.com/azure-sql-edge
#如想删除docker镜像可使用 docker rmi 镜像id
#非ARM架构:查看sqlserver镜像
docker images | grep mssql
#ARM架构:查看sqlserver镜像
docker images | grep azure-sql
创建sqlserver容器(按架构选择其中之一创建)
#非ARM架构:创建容器
docker run -d -p 1433:1433 -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=12345678" -e 'MSSQL_PID=Developer' -e "MSSQL_USER=SA" --name mssql1433 --hostname mssql1433 mcr.microsoft.com/mssql/server:2019-latest
#ARM架构:创建容器
docker run -d -p 1433:1433 -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=12345678" -e 'MSSQL_PID=Developer' -e "MSSQL_USER=SA" --name mssql1433 --hostname mssql1433 mcr.microsoft.com/azure-sql-edge:latest
#如想删除docker容器可使用 docker rm 容器id
docker run参数释义:
- -d:在后台运行容器
- -p:小写p,第一个1433是宿主机端口(外部连接此容器数据库即使用此端口),第二个1433是容器内部端口
- -e ACCEPT_EULA:Y表示接受最终用户许可协议
- -e MSSQL_SA_PASSWORD:初始化sqlserver用户,设置sa用户密码,最好设置一个强密码
- -e MSSQL_PID:设置 SQL Server 版本,默认为Developer,其他可选值有:
- Developer : 默认值,以开发版运行
- Express : 以学习版运行
- Standard : 以标准版运行
- Enterprise : 以企业版运行
- EnterpriseCore : 以企业核心版运行
- -e MSSQL_USER:
- –name:容器的名称
- –hostname:设置容器主机名,如果未指定则默认为容器 ID,主机名最好和容器名称保持一致
- 最后加上 镜像名称:镜像tag
- 如果想挂载文件,可以使用-v参数,sqlserver容器内的数据文件路径为 /var/opt/mssql/data 日志文件路径为 /var/opt/mssql/log
#查看创建完的容器
docker ps -a
可以进入后台运行的mssql容器
#进入容器
docker exec -it 75acc537c784 /bin/bash
#退出容器使用 exit
#退出容器,然后查看1433端口是否开启监听,如果是使用的服务器,还需要添加安全规则配置(入方向添加相应端口)
netstat -anlp | grep 1433
连接sqlserver
按上面步骤创建完mssql容器并且端口开启监听后,我们可以使用数据库软件在外部连接使用。
此处使用datagrip软件来演示连接数据库
- 新建数据库连接
- 填写 主机、端口、实例、用户名、密码 ,此处用户使用SA,密码是上面创建日期时在 MSSQL_SA_PASSWORD=12345678 处设置的密码
- 点击测试连接,显示已成功表示可以连接到创建的容器
sqlserver的使用测试
连接到sqlserver后,新建一个sql查询窗口进行使用测试
--连接到tempdb数据库
use tempdb;
--创建一个测试schema
create schema test_schema;
--创建测试表
create table test_schema.test_table (
id varchar(10)
);
--插入测试数据
insert into test_schema.test_table(id) values('1');
--查询测试表数据
select * from test_schema.test_table;
以上语句都能正常运行,说明sqlserver数据库容器成功创建
docker创建运行postgres容器
创建postgres容器
postgres可以选择特定版本的镜像下载,docker官方仓库postgres版本可参考 postgres镜像版本 ,用docker创建数据库容器需要考虑数据的持久化策略,这个可以通过挂载卷来解决。
下载postgres镜像
#下载postgres镜像,不指定版本默认为latest,此处选择13.9版本
docker pull postgres:13.9
#如想删除docker镜像可使用 docker rmi 镜像id
#查看postgres镜像
docker images | grep postgres
创建postgres容器
#使用postgres镜像来创建容器
docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=123456 --restart always --name postgres5432 postgres:13.9
#如想删除docker容器可使用 docker rm 容器id
docker run参数释义:
- -d:在后台运行容器
- -p:小写p,第一个5432是宿主机端口(外部连接此容器数据库即使用此端口),第二个5432是容器内部端口
- -e POSTGRES_PASSWORD:设置数据库密码,默认用户名为postgres
- –restart always:容器退出时,docker总是自动重启这个容器
- postgres:13.9:镜像名称:镜像tag
- 如果想挂载文件,可以使用-v参数,postgres容器内的重要文件路径为 /var/lib/postgresql
#查看创建完的容器
docker ps -a
可以进入后台运行的mysql容器
#进入容器
docker exec -it 7ac6f09eca5f /bin/bash
#退出容器使用 exit
#退出容器,然后查看5432端口是否开启监听,如果是使用的服务器,还需要添加安全规则配置(入方向添加相应端口)
netstat -anlp | grep 5432
连接pstgres
- 新建数据库连接
- 填写 主机、端口、用户名、密码、数据库 ,此处用户和数据库默认为postgres,密码是上面创建日期时在 POSTGRES_PASSWORD=123456 处设置的密码
- 点击测试连接,显示已成功表示可以连接到创建的容器
postgres的使用测试
连接到postgres后,新建一个sql查询窗口进行使用测试
--创建一个测试schema
create schema test_schema;
--创建测试表
create table test_schema.test_table (
id varchar(10)
);
--插入测试数据
insert into test_schema.test_table(id) values('1');commit;
--查询测试表数据
select * from test_schema.test_table;
以上语句都能正常运行,说明postgres数据库容器成功创建