win10下使用Docker部署mongo

在window下部署mongo,实在是有些坑。网上的很多教程是基于liunx,一般不会碰到很多麻烦。但在win10下就可能会出现问题。

正常步骤:
1、注册账号,安装Docker
2、获取Mongo镜像
3、挂接数据目录启动容器
4、启动容器

相关连接: Win10下使用Docker运行redis

1、注册账号,安装Docker

已经安装的可以忽略。

官网下载Docker: https://www.docker.com/get-started

安装完成后,托盘下有个小鲸鱼。在cmd命令行下输入docker version,可以看到Docker的版本信息。

2、获取Mongo镜像

使用搜索命令docker search <名称>可以找到一堆相关镜像。OFFICIAL = [OK]是官方的。

D:\>docker search mongo
NAME                                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mongo                               MongoDB document databases provide high avai…   5122                [OK]
mongo-express                       Web-based MongoDB admin interface, written w…   310                 [OK]
tutum/mongodb                       MongoDB Docker image – listens in port 27017…   224                                     [OK]
mvertes/alpine-mongo                light MongoDB container                         82                                      [OK]
mongoclient/mongoclient             Official docker image for Mongoclient, featu…   57                                      [OK]
bitnami/mongodb                     Bitnami MongoDB Docker Image                    57                                      [OK]
frodenas/mongodb                    A Docker Image for MongoDB                      17                                      [OK]
... ...

直接抓取最新版的Mongo,如果需要特定版本可以在后面加版本号。

D:\>docker pull mongo
抓取V 3.2版本的Mongo
D:\>docker pull mongo:3.2

完成后可以看到本地镜像

D:\>docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
golang                     latest              45e48f60e268        30 hours ago        777MB
debian                     latest              be2868bebaba        40 hours ago        101MB
mongo                      latest              052ca8f03af8        13 days ago         381MB

3、挂接数据目录启动容器

docker本身的镜像都属于只读,要保存数据就需要找个地方存。

注意: 这个数据目录挂接在win10下是个坑

通常情况是建个目录,如(d:\dockerdata\mongo)使用 -v 命令参数进行连接,网上大部分的教程都是如此。实际会出现权限问题,无法正常启动。巨坑无比,浪费了好多时间

解决: 使用数据卷(Volume)解决,可以理解位虚拟磁盘。

3.1、创建数据卷

D:\>docker volume create --name mongodata
mongodata

D:\>docker volume ls
DRIVER              VOLUME NAME
... ...
local               f8abd230256df3e227fc2c7605b615e4cc9e31e47ed4afc663e698e59ec31071
local               mongodata

D:\>

可以看到已经创建了一个mongodata 的数据卷。

单独删除: docker volume rm <名称>

3.2、挂接运行mongo数据库

D:\>docker run --name mongodb -v mongodata:/data/db -p 27017:27017 -d mongo:latest --auth
a0585181d6102c6c4e1ebd7686fc8d08827632b5b279fb4eae7bf746e8ea49a9

D:\>docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
a0585181d610        mongo:latest        "docker-entrypoint.s…"   11 seconds ago      Up 9 seconds        0.0.0.0:27017->27017/tcp   mongodb

D:\>

参数:
docker run 运行容器
--name mongodb 运行容器的名称为mongodb
-v mongodata:/data/db 挂接保存数据的位置,冒号前面是本机(mongodata),后面是虚拟机中的映射目录(/data/db)
-p 27017:27017 映射端口,前面是本机端口,后面是docker内的端口
--auth 授权访问

命令: docker ps

查看当前正在运行的容器对象,Mongo容器运行正常。

4、授权创建账户

命令: docker exec -it mongodb mongo admin

D:\>docker exec -it mongodb mongo admin
MongoDB shell version v4.0.3
connecting to: mongodb://127.0.0.1:27017/admin
Implicit session: session { "id" : UUID("85d97306-33e4-45d2-a8a5-ca85a2b46165") }
MongoDB server version: 4.0.3
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
        http://docs.mongodb.org/
Questions? Try the support group
        http://groups.google.com/group/mongodb-user
>

创建账号

db.createUser({ 
  user: 'root', 
  pwd: 'admin', 
  roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] 
  });

授权:1 代表授权验证成功

db.auth("root","admin");

创建一个新的数据库 blog_db,并授权

创建目标数据库(实际上切换即可)
use blog_db
创建目标数据库管理用户
db.createUser({ 
  user: 'blog', 
  pwd: 'blog123456', 
  roles: [ { role: "readWrite", db: "blog_db" } ] 
  });
开启验证
db.auth("blog","blog123456");

OK搞定

在win10下使用Docker有时有点坑,网上很多教程都是基于liunx的操作步骤。

现在碰到的主要有两个问题:

1、docker search 没有反应
2、系统没授权 Operation not permitted

相关问题1:docker search 没有反应

在使用docker中,正常都是设置自动启动Docker。在启动电脑后会出现pull无法拉取镜像

D:>docker search mongo
Error response from daemon: Get https://index.docker.io/v1/search?q=mongo&n=25: dial tcp: lookup index.docker.io on 192.168.65.1:53: read udp 192.168.65.3:44014->192.168.65.1:53: i/o timeout

解决方法:
1、重新启动Docker,点托盘的小图标,选择重启菜单
2、重启无法解决,加国内镜像

增加国内镜像:

  1. 点击托盘小图标
  2. 选择 settings 菜单
  3. 在Settings对话框左侧选择 Daemon 选项
  4. 右侧 Registry mirrors 填入镜像地址
  5. 重启Docker

镜像地址

随便加一个,都加也没问题
https://docker.mirrors.ustc.edu.cn
http://hub-mirror.c.163.com
https://registry.docker-cn.com

相关问题2: 系统授权 Operation not permitted

使用常规的磁盘映射会出现的问题,如把数据文件映射到 D:\docker\data\mongo 目录下,使用 docker ps 就会发现没有容器在运行

C:\Users\sunseeds>docker run --name mongodb-server0 -v D:\docker\data\mongo:/data/db -p 27017:27017 -d mongo:latest --auth
1a1ec10c64716a8f2daee89ab7a18068559a0e7c2460741be0cc5cf82809812d

C:\Users\sunseeds>docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

使用下面命令docker ps -a,发现容器创建了,但未能正常运行。

docker ps -a

docker logs mongodb-server0 查看日志,启动失败无法创建数据文件的元凶,一堆密密麻麻的字里有一堆的Operation not permitted,最后来一句失败!

D:>docker logs mongodb-server0
2018-10-17T13:59:14.506+0000 I CONTROL  [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
2018-10-17T13:59:14.512+0000 I CONTROL  [initandlisten] MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit host=1a1ec10c6471
2018-10-17T13:59:14.512+0000 I CONTROL  [initandlisten] db version v4.0.3
2018-10-17T13:59:14.512+0000 I CONTROL  [initandlisten] git version: 7ea530946fa7880364d88c8d8b6026bbc9ffa48c
2018-10-17T13:59:14.512+0000 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.2g  1 Mar 2016
2018-10-17T13:59:14.512+0000 I CONTROL  [initandlisten] allocator: tcmalloc
2018-10-17T13:59:14.512+0000 I CONTROL  [initandlisten] modules: none
2018-10-17T13:59:14.512+0000 I CONTROL  [initandlisten] build environment:
2018-10-17T13:59:14.512+0000 I CONTROL  [initandlisten]     distmod: ubuntu1604
2018-10-17T13:59:14.512+0000 I CONTROL  [initandlisten]     distarch: x86_64
2018-10-17T13:59:14.512+0000 I CONTROL  [initandlisten]     target_arch: x86_64
2018-10-17T13:59:14.512+0000 I CONTROL  [initandlisten] options: { net: { bindIpAll: true }, security: { authorization: "enabled" } }
2018-10-17T13:59:14.525+0000 I STORAGE  [initandlisten] wiredtiger_open config: create,cache_size=478M,session_max=20000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),statistics_log=(wait=0),verbose=(recovery_progress),
2018-10-17T13:59:15.354+0000 E STORAGE  [initandlisten] WiredTiger error (1) [1539784755:354808][1:0x7f0386d16a00], connection: __posix_open_file, 715: /data/db/WiredTiger.wt: handle-open: open: Operation not permitted Raw: [1539784755:354808][1:0x7f0386d16a00], connection: __posix_open_file, 715: /data/db/WiredTiger.wt: handle-open: open: Operation not permitted
2018-10-17T13:59:15.405+0000 E STORAGE  [initandlisten] WiredTiger error (17) [1539784755:405544][1:0x7f0386d16a00], connection: __posix_open_file, 715: /data/db/WiredTiger.wt: handle-open: open: File exists Raw: [1539784755:405544][1:0x7f0386d16a00], connection: __posix_open_file, 715: /data/db/WiredTiger.wt: handle-open: open: File exists
... ...
2018-10-17T13:59:15.461+0000 F -        [initandlisten]

***aborting after fassert() failure

解决: 创建Volume,进行连接

Volume可以看作是Docker创建的一个虚拟磁盘。