我习惯在Linux下开发,但目前的产品采用的是SQL Server,众所周知,MSSQL在Linux下臃肿笨重,故决定使用Docker搭建SQL Server Express作为开发数据库。以下是具体过程。

拉取镜像并启动实例

image还是非常大的,再拉取之前一定要先添加加速器,否则会等到天荒地老。如果添加加速器,请参见我的另一篇文章

docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=your_password' -e 'MSSQL_PID=Express' -p 1433:1433 --name mssql -v mssql_db:/data/db  --privileged=true -d microsoft/mssql-server-linux:latest
  • ACCEPT_EULA=Y 接受用户协议
  • SA_PASSWORD=your_password设置sa的密码,这个密码必须是高强度密码,有数字大小写字母,不小于8位
  • MSSQL_PID=ExpressSQL Server的版本,默认是Developer版本。可选的值有:Developer, Express, Standard, Enterprise, EnterpriseCore
  • -p 指定端口映射
  • -v 将宿主机的mssql_db目录映射为容器中的/data/db
  • -d 以deamon模式运行容器,即在后台运行
  • –name 指定容器的名字
  • 最后一个参数是指定使用的image,如果本地没有会自动从云端pull

使用方式

  • 使用DB客户端连接

    可以使用各种支持SQL Server的客户端连接,ip即为本机地址,端口为1433,用户名sa,密码就是上面的命令中的your_password。

  • 命令行连接

    可以使用命令直接进入容器中的SQL Server命令行环境。

    docker exec -it <container_id|container_name> /opt/mssql-tools/bin/sqlcmd -H localhost -U sa -P <your_password>

    也可以进入bash,以便执行其他非数据库命令

    docker exec -it <container_id|container_name> bash

  • 还原数据库

    可以将备份文件放入映射目录,然后命令行连接到容器中使用sqlserver 命令还原,下面以数据库备份文件名为hlht_db20171214.bak为例来说明

    # 在宿主机拷贝到映射目录中
    cp hlht_db20171214.bak /var/lib/docker/volumes/mssql_db/_data/
    # 进入容器
    docker exec -it <container_id|container_name> bash
    # 找到备份文件
    cd /data/db/
    # 进入SQLServer交互命令行
    /opt/mssql-tools/bin/sqlcmd -H localhost -U sa -P password
    # 查看备份文件对应的逻辑卷名,注意查看打印出来的第一个字段 LogicalName,还原时要用到
    restore filelistonly from disk = '/data/db/hlht_db20171214.bak'
    go
    # 执行还原,move后面的两个参数分别是上一步中查看的mdf,ldf文件对应的LogicName
    restore database HLHTDB
    from disk = '/data/db/hlht_db20171214.bak'
    with move 'HLHTDB' to '/data/db/HLHTDB/hlhtdb.mdf',
    move 'HLHTDB_log' to '/data/db/HLHTDB/hlhtdb_log.ldf'
    go
    # 测试是否还原成功
    use HLHTDB
    go

END