Win10下使用Docker创建调试环境

一、重要事项放最前,如无需则跳过:

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远程

参考 Docker Centos添加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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值