在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、重启无法解决,加国内镜像
增加国内镜像:
- 点击托盘小图标
- 选择 settings 菜单
- 在Settings对话框左侧选择 Daemon 选项
- 右侧 Registry mirrors 填入镜像地址
- 重启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创建的一个虚拟磁盘。