Docker 容器学习笔记系列:
个人在开发时能方便快捷的搭建对应的测试环境,比如搭建一个 Redis 数据库、MongoDB 数据库、Elasticsearch 服务。这样就不用拿公共的基础设施做测试了,避免损坏数据、破坏了线上环境。
本文就介绍如何利用容器 Docker 来快速搭建开发测试环境。
补充:关于 Mac 上 Docker 的使用,可以阅读 docker-for-mac
MySQL
简单创建
1 | docker run -d \ |
参数说明:
-d
:以后台方式运行--name
:将运行的容器命名为mysql
-p
:端口映射,host_ip:container_ip
,将主机的 3306 端口映射为 容器内部的 3306 端口,数据库连接时,是连接的你的host_ip
,这二者的顺序不要搞混-e
:设置环境变量,指定root
账号的密码为123456
上面这种方式运行后,我们将容器中的 mysql 数据和配置文件拷贝到宿主机上。(获取原始配置文件)。
因为没有将宿主机和容器相关目录挂载,这样会导致容器如果被删除,数据会丢失。
1 | 创建好目录,不然会报错 |
这里放一份默认的配置文件 mysqld.cnf
:1
2
3
4
5
6
7
8
9[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
log-error = /var/log/mysql/error.log
By default we only accept connections from localhost
bind-address = 127.0.0.1
Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
完成上面的操作之后,将已经运行的容器删除:1
docker rm mysql
正式创建
接下来正式运行 MySQL 容器:1
2
3
4
5
6
7docker run -d \
--name mysql \
-p 3306:3306 \
-v /data/docker_local/mysql/config/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf \
-v /data/docker_local/mysql/data/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7
-v
将宿主机中的文件挂载到将容器中,容器中产生的数据会持久化下来,语法:-v [host-src:]container-dest[:<options>]
其实,如果你一开始就有了默认的配置文件,那么,就可以跳过之前的步骤,直接运行正式的创建 MySQL 容器的命令。
交互命令:1
mysql -uroot -p<password>
MongoDB
创建容器
1 | 创建持久化目录 |
启动参数含义在 MySQL 启动时已经见过了,除了 auth
:
--auth
:开启权限验证模式。默认情况下,mongo 数据库没有添加认证约束,为了增强数据库的安全性,我们需要对数据库添加授权认证。当我不加这个认证约束时,一个数据库的账号可以操作另一个数据库的数据,只有加了这个参数,我们针对某些数据库设置的角色,才仅在这个数据库上生效。
添加管理员账号
- 进入容器
1
docker exec -it mongo mongo admin
进入容器 mongo
,运行命令 mongo admin
,实现了:
- 进入 mongo 命令行
- 切换为 admin 数据库
创建一个拥有最高权限的 root 账号:1
db.createUser({ user: 'admin', pwd: '123456', roles: [ { role: "root", db: "admin" } ] });
role 角色参数:
Read
:允许用户读取指定数据库readWrite
:允许用户读写指定数据库dbAdmin
:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profileuserAdmin
:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户clusterAdmin
:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限readAnyDatabase
:只在admin数据库中可用,赋予用户所有数据库的读权限readWriteAnyDatabase
:只在admin数据库中可用,赋予用户所有数据库的读写权限userAdminAnyDatabase
:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限dbAdminAnyDatabase
:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限root
:只在admin数据库中可用。超级账号,超级权限
创建访问指定数据库的用户
管理员已经创建成功后,我们需要重新连接 mongo 数据库,用管理员进行登录,并为目标数据库创建目标用户
1 | 进入容器,并切换到 admin 数据库 |
test 用户可以对(也只能对) beta 库进行操作
补充:
- 查看容器运行日志:
docker logs mysql
docker-compose
docker-compse
俗称 Docker 三剑客,这里试试用它来同时启动 MySQL、MongoDB 吧:
1 | version: "2" |
进入到上面编写的docker-compose.yml文件的目录,运行命令:
1 | 启动所有服务 |
nginx
使用 Nginx 容器搭建文件服务区
file.conf:
1 | server { |
docker-compose.yml:
1 | version: "2" |
为了避免中文乱码,需要配置 charset utf-8;
怎么给文件服务器设置访问密码呢?只需要修改一下配置即可:
1 | server { |
生成用户名和密码:
1 | htpasswd -c -d pass_file michael |
htpasswd
命令没有的话,需要:yum install httpd-tools -y
安装;-c
创建一个文件;-d
强制 CRYPT 加密密码(最多8个字符,不安全)-s
Force SHA encryption of the password (insecure)
参考:Nginx配置静态文件服务
控制访问 nginx 的 IP
网段的写法是这样的:192.168.1.0/24
这样的形式。
1 | deny 192.168.1.11; |
允许某几个 IP 能访问,其他 IP 均不能访问:
1 | allow 192.168.1.1; |
示例:
1 | server { |
- [原创]nginx如何禁止指定IP或IP段访问
- Nginx基础篇(4)- Nginx请求限制和访问控制
FAQ
ifconfig command not found 解决办法
1 | yum install net-tools -y |
本文示例
- Github-awesome-docker-service-for-me
参考
- 使用Docker快速搭建各种测试环境 本文主要参考
- Docker初步实践
- CSDN-docker安装mongo及开启用户认证
- docker-compose 安装mysql5.7
- 使用 Docker Compose 搭建 MySQL 数据库主从复制实例