logo头像
Snippet 博客主题

Win10下使用Docker部署Mongodb

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

注册账号,安装Docker
获取Mongo镜像
挂接数据目录启动容器
启动容器

1、注册账号,安装Docker

已经安装的可以忽略。

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

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

D:\ISO
λ docker version
Client: Docker Engine - Community
 Version:           18.09.2
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        6247962
 Built:             Sun Feb 10 04:12:31 2019
 OS/Arch:           windows/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.2
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.6
  Git commit:       6247962
  Built:            Sun Feb 10 04:13:06 2019
  OS/Arch:          linux/amd64
  Experimental:     false

2、获取Mongo镜像

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

D:\ISO
λ docker search mongo
NAME           DESCRIPTION          STARS               OFFICIAL            AUTOMATED
mongo          MongoDB document databases provide high avai…   6033                [OK]
mongo-express  Web-based MongoDB admin interface, written w…   487                 [OK]
tutum/mongodb  MongoDB Docker image – listens in port 27017…   226                 [OK]
bitnami/mongodb Bitnami MongoDB Docker Image                   92                  [OK]
mongoclient/mongoclient Official docker image for Mongoclient, featu…   70         [OK]
mongooseim/mongooseim   Small docker image for MongooseIM - robust a…   18
frodenas/mongodb    A Docker Image for MongoDB                 17                  [OK]
cvallance/mongo-k8s-sidecar Kubernetes side car to setup and maintain a …   11     [OK]
centos/mongodb-32-centos7           MongoDB NoSQL database server                   7
centos/mongodb-26-centos7           MongoDB NoSQL database server                   5
istepanov/mongodump  Docker image with mongodump running as a cro…   5             [OK]
centos/mongodb-36-centos7           MongoDB NoSQL database server    4
eses/mongodb_exporter               mongodb exporter for prometheus  4             [OK]
webhippie/mongodb                   Docker images for MongoDB        4             [OK]
circleci/mongo                      CircleCI images for MongoDB      4             [OK]
arm64v8/mongo                       MongoDB document databases provide high avai…   4
requilence/mongodb-backup           mongo backup container           3             [OK]
neowaylabs/mongodb-mms-agent   This Docker image with MongoDB Monitoring Ag…   2   [OK]
centos/mongodb-34-centos7           MongoDB NoSQL database server                   2
ekesken/mongo      docker image for mongo that is configurable …   1               [OK]
openshift/mongodb-24-centos7        DEPRECATED: A Centos7 based MongoDB v2.4 ima…   1
ansibleplaybookbundle/mongodb-apb   An APB to deploy MongoDB.        0             [OK]
martel/mongo-replica-ctrl  A dockerized controller for a Mongo db repli…   0       [OK]
andreasleicher/mongo-azure-backup a docker container to backup a mongodb using… 0  [OK]
fuww/mongo-connector                mongo-connector + alpine + docker   0          [OK]

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

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

完成后可以看到本地镜像

D:\ISO
λ docker image ls -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mongo               latest              785c65f61380        12 days ago         412MB
ubuntu              latest              4c108a37151f        3 weeks ago         64.2MB

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

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

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

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

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

3.1、创建数据卷
D:\ISO
λ docker volume create --name mongodata
mongodata
D:\ISO
λ docker volume ls
DRIVER              VOLUME NAME
local               mongodata

可以看到已经创建了一个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

参数:
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创建的一个虚拟磁盘。

支付宝打赏 微信打赏

赞赏是不耍流氓的鼓励