一、重要事项放最前,如无需则跳过:
1.更改Docker安装目录
背景需求
Windows版本(Windows 10 wsl 2)docker 默认程序安装到c盘,数据存放于 C:\Users\当前用户名\AppData\Local\Docker\wsl\data\ext4.vhdx
这样会导致docker使用量上去C盘的空间越来越大。为了解决这个问题我们一般习惯性将数据部分移动到其他盘。
1.1. 通过windows系统的界面操作停止
通过windows系统的界面操作停止:
打开cmd窗口。查看停止情况:
C:\Users\xxx>wsl --list -v
NAME STATE VERSION
* docker-desktop Running 2
docker-desktop-data Running 2
C:\Users\xxx>wsl --list -v
NAME STATE VERSION
* docker-desktop Stopped 2
docker-desktop-data Stopped 2
1.2. 备份导出目前已有的数据
C:\Users\xxx> mkdir D:\docker\wsl\data\
C:\Users\xxx> wsl --export docker-desktop-data "D:\docker\wsl\data\docker-desktop-data.tar"
1.3. 删除原有数据
C:\Users\xxx> wsl --unregister docker-desktop-data
正在注销...
C:\Users\xxx> wsl --list -v
NAME STATE VERSION
* docker-desktop Stopped 2
1.4. 导入数据到新盘
C:\Users\xxx> wsl --import docker-desktop-data "D:\docker\wsl\data" "D:\docker\wsl\data\docker-desktop-data.tar" --version 2
C:\Users\xxx> wsl --list -v
NAME STATE VERSION
* docker-desktop Stopped 2
docker-desktop-data Stopped 2
导入备份的文件完成后在虚拟磁盘路径( D:\docker\wsl\data
)目录下会生成一个 ext4.vhdx
文件 ,而备份的文件D:\docker\wsl\data\docker-desktop-data.tar
可根据情况删除
1.5. 修改Docker默认安装路径
通过创建链接的方式,管理员身份打开cmd命令行
mklink /j "C:\Program Files\Docker" "D:\docker"
1.6. 启动Docker
点击docker运行程序就行了
2.无法绑定端口情况
Docker-for-Windows 和 Hyper-V 排除但不使用重要端口范围
据查找网上资料,Hyper-V 会为自己动态保留一个端口范围,处于端口范围的则无法使用。
2.1. 首先,检查是否保留了所需的端口:
netsh interface ipv4 show excludedportrange protocol=tcp
2.2. 如果您的端口在某个范围内,请停止 winnat:
net stop winnat
2.3. 禁止对所需端口进行动态保留(例如,7788,如原始问题中所述):
netsh int ipv4 add excludedportrange protocol=tcp startport=7788 numberofports=1
2.4. 重启winnat:
net start winnat
3.创建容器时注意/usr/sbin/init和/bin/bash(默认)的区别
创建容器时指定:--privileged=true 得使用 /usr/sbin/init
比如创建centos容器时指定--privileged=true 和/bin/bash(默认),
使用命令systemctl xxx xxx来管理服务,就有问题,提示如下
Failed to get D-Bus connection: Operation not permitted
因为dbus-daemon没能启动。其实systemctl并不是不可以使用。将你的CMD或者entrypoint设置
为/usr/sbin/init即可。这样就会自动将dbus等服务启动起来,然后就能正常使用systemctl了。
二、下面进入正题:
1.创建自定义网桥,为后面创建容器设置固定IP准备
1.1 创建网桥
docker network create --subnet=172.172.0.0/24 lan
备注:
1.2 删除网桥
docker network rm lan
2.创建Centos容器
2.1 拉取指定版本的 CentOS 镜像,这里我们安装指定版本为例(centos7):
docker pull centos:7
2.2 运行容器,并且可以通过 exec 命令进入 CentOS 容器
docker run -itd -p 20:20 -p 21:21 -p 22:22 -p 880:80 -p 8443:443 -p 888:888 -p 7777:7777 -p 7788:7788 -p 9682:9682 --privileged=true --net lan --ip 172.172.0.10 -v /d:/home/vd --name centos7_d0 centos:centos7 /usr/sbin/init
-i=false: 保持输入流开放即使没有附加输入流
-t=false: 分配一个伪造的终端输入
-d=false: 分离模式,在后台运行容器,并且打印出容器ID
-p=[]: 匹配镜像内的网络端口号
--privileged=true:给容器开启特权
--net=bridge: 指定使用某bridge
--ip=172.x.x.x: 指定ip地址
--restart=always:设置docker重启时自动跟随重启
-e=[]:设置环境变量
-v /宿主机目录:/容器目录,用于设置挂载目录
--name xxx:为容器指定一个名称
2.3 开启ssh远程
3、创建mysql容器
3.1 拉取指定版本的 MySql 镜像,这里我们安装指定版本为例(5.7):
docker pull mysql:5.7
3.2 运行容器
docker run -itd -p 3306:3306 --privileged=true --net lan --ip 172.172.0.11 --restart=always -e MYSQL_ROOT_PASSWORD=123456 -v /d/docker/mysql/conf/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -v /d/docker/mysql/data:/var/lib/mysql -v /d/docker/mysql/log:/var/log/mysql --name mysql mysql:5.7
3.3 如参数MYSQL_ROOT_PASSWORD=123456不生效
可自行修改root密码:
SET PASSWORD FOR 'root' = PASSWORD('123456');
SET PASSWORD FOR 'root'@'localhost'=PASSWORD('123456');
问题:
mysql启动时报错如下,这时你的配置是没有生效的
mysql: [Warning] World-writable config file '/etc/mysql/mysql.conf.d/mysqld.cnf' is ignored.
解决:
这时候需要将mysql.conf.d文件通过chmod进行权限降级
sudo chmod 644 mysql.conf.d
然后重启容器
4、创建redis容器
4.1 拉取redis最新镜像
docker pull redis
4.2 运行容器
docker run -itd -p 6379:6379 --privileged=true --net lan --ip 172.172.0.12 -v /d/docker/redis/conf/redis.conf:/etc/redis/redis.conf -v /d/docker/redis/data:/data --name redis redis:latest redis-server /etc/redis/redis.conf --appendonly yes
5、创建mongo容器
5.1 拉取mongo最新镜像
docker pull mongo:latest
5.2 运行容器
docker run --name mongo -p 27017:27017 --privileged=true --net lan --ip 172.172.0.13 -v /d/docker/mongo:/data/db -d mongo
6、创建memcached容器
6.1 拉取memcached最新镜像
docker pull memcached
6.2 运行容器
docker run -p 11211:11211 --privileged=true --net lan --ip 172.172.0.14 --name memcached memcached
三、解决docker无法使用table键补齐命令
在docker容器中安装bash-completion
apt install bash-completion
或
yum install bash-completion
source一下
source /usr/share/bash-completion/bash_completion
四、同步docker中的容器时间和宿主机相同
1、在容器中修改下/etc/localtime文件的名称,避免冲突
mv /etc/localtime /etc/localtime.bak
2、修改时区为上海
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
3、然后查看是否一致时间
# date
Wed Feb 9 07:36:36 UTC 2022
# mv /etc/localtime /etc/localtime.bak
# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# date
Wed Feb 9 15:36:50 CST 2022