本文转载自蘑菇房
在window下部署mongo,实在是有些坑。网上的很多教程是基于liunx,一般不会碰到很多麻烦。但在win10下就可能会出现问题。
正常步骤:
- 注册账号,安装Docker
- 获取Mongo镜像
- 挂接数据目录启动容器
- 启动容器
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创建的一个虚拟磁盘。蘑菇房