win7下使用的是Docker Toolbox,之前安装几次都不能正常启动,然后将之前安装的Oracle vm virtualbox 卸载了,再重装Docker Toolbox,因为这个工具安装的时候 会自动安装 virtualbox,但是重装后 还是不行,依然报虚拟机的问题,然后在"程序和功能"里找到VirtualBox右键选择修复之后,重新打开toolbox就好了,其实也可以双击virtualbox打开在里面进行修复也是可以的,virtualbox默认存储是在c盘,需要在设置里更改存储的路径到其他盘,选择动态分配存储,类型是VMDK,分配个3g就好了。然后再设置一下共享文件夹,共享文件夹就是为了将本地文件夹挂载到docker容器里,类型我选的是固定分配,名称就选择路径“E://docker”最后一个文件夹的名称,我这里是docker,这是用来持久化例如容器mysql数据的。设置好共享文件夹后,然后再在Xshell里面操作(因为toolbox敲命令不方便,我就下了Xshell6,安装几次都是报错,然后删掉所有Xshell相关的东西,在注册表里搜索Xshell,删掉所有Xshell的注册表信息,然后重新安装就好了,然后新建会话,在主机上填写toolbox docker当前的Ip,toolbox开启的时候 会自动绑定一个ip,我的是192.168.99.100,填好ip后,就选择连接,然后会弹出输用户名和密码的框,默认的用户名和密码分别是“docker”,“tcuser”,然后点击确定就连上了 docker,刚进去不是超级权限,为了防止某些操作需要超级权限,于是输入sudo -i进入root超级用户,后面就是docker操作了),之前我为了本地挂载,是直接在root@default:/#根目录里创建的docker 文件夹并事先设置好 配置文件,然后运行docker run mysql 容器的时候,直接-v 将该文件夹下的配置文件和数据挂载到 容器中,但是这样每次电脑重启之后,再次docker start 容器,数据库就会不见,有时候配置文件也失效了,进去根目录查看docker文件夹下的conf目录里也没有了之前设置好的配置文件。于是后来,我就用了windows本地文件挂载,刚刚我已经在virtualbox上设置好了共享文件夹,然后docker里我们需要设置挂载点,root@default:/#进入mnt然后mkdir docker
,然后cd docker 执行 mount -t vboxsf docker /mnt/docker/,这样就挂载成功,
这样就完成了我们将共享文件夹 挂载到 docker里的 /mnt/docker文件夹中,返回上一步,再进入/mnt/docker, 执行 ls,就可以看到 本地共享文件夹里的内容都出现了。后面我们就可以将/mnt/docker里的内容挂载到 docker 容器中去了,也就是本地共享文件夹间接的挂载到了 docker容器中。但是问题又来了, 我执行 docker run -d -p 3306:3306 -v /mnt/docker/mysql/conf:/etc/mysql/conf.d …这样启动后,进入容器输入mysql -u root -p进入的时候 老是提示 mysql [Warning] World-writable ‘/etc/mysql/conf.d/my.cnf’ is is ignored. 网上说是 这个配置文件当前的状态既不去安全,任何人都可以修改,所有被忽略了,这样就导致我设置的配置内容没有生效,于是按照网上的方法给这个文件更改权限,但是没有效果,更改不成功。于是,我就去掉了本地配置文件挂载,只留了本地数据文件夹挂载。配置文件就使用自制的镜像固定好,后面每次docker run的时候使用这个镜像就默认加载了我设置的配置文件。下面就来自制这个镜像。
1.先创建一个干净的mysql容器

docker run -d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7

2.启动成功后,然后进入容器/etc/mysql/conf.d,创建my-config.cnf文件,如果该文件夹下默认有其他.cnf文件,那就先把其他.cnf文件全部删除,其实,不删除也没有什么问题,最好还是删除了,只留一个 my-config.cnf。

docker exec -it mysql /bin/bash

3.这里因为我要配置双主同步,所以这个是作为第一个自制镜像的配置文件my-config.cnf内容如下:

[mysqld]
user=mysql
#这句话是如果后面docker run -v /mnt/docker/mysql/data:/var/lib/mysql #启动报File ./ib_logfile101: 'aio write' returned #OS error 122,就要加上这句话"
innodb_use_native_aio=0

character-set-server=utf8
default_authentication_plugin=mysql_native_password
server_id=2
log-bin=mysql-bin
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
read-only=0
relay_log=mysql-relay-bin
log-slave-updates=on
auto-increment-offset=2
auto-increment-increment=2
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

4.然后exit 容器,生成镜像,镜像名我命名为mysql_custom0:5.7

docker commit mysql mysql_custom0:5.7

5.然后就可以用这个镜像创造容器了,这样就可以默认使用镜像的配置文件,保证了配置文件的持久性。

docker run -d -p 3306:3306  -v /mnt/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql0 mysql_custom0:5.7

6.启动成功后我们就可以看到 windows下共享文件夹里/docker/mysql/data里出现了初始化后的数据库内容。因为我们之前设置的共享目录是固定分配,所以每次机器重启后进入docker 的时候需要事先在/mnt/docker目录下执行mount -t vboxsf docker /mnt/docker/ 进行挂载。否则进入mysql0 show database,你会发现之前创建的数据库表都会消失。如果重新挂载好输入密码进入mysql后 会提示Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2) ,就先docker stop mysql0,然后再start,再mysql -u root -p进入看看,如果仍然报这个错,docker exec 进入 mysql0 容器,touch /var/run/mysqld/mysqld.sock 手动创建这个文件,然后再myql -u root -p输入密码就可以进去了, 若还不行,可能配置文件里mysql 、client 、mysqld标签下都有socket 路径配置,估计是有路径覆盖的问题

7.windows下docker编辑文件不方便,不知道为什么’cat>> ./文件.cnf ’ 只能接着文件内容末尾继续编写而且每编辑一步 按下回车之后就无法回到上一行去更改错误,可能我还不够熟吧,不过出错了可以先ctrl+c保存,然后用 sed -i 指令进行增删改等操作.