wsl,docker安装,桥接nat虚拟机VMware网络模式

文章目录

一. wsl简介

1. wsl和wsl2的区别

wsl需要把linux命令翻译为windows命令,性能差一些。
wsl2直接使用linux内核,不需要翻译,性能好,但开销相对大一点,因为需要多运行一个hyper-v虚拟机 (并非完整的虚拟机,是轻量虚拟化) 让linux内核执行。

2. wsl的架构

  1. wsl2,
  • inux内核和Windows内核并行,其中linx内核运行在轻量虚拟化的hyper-v环境中。即系统只是为wsl2分配内存和cpu等资源,windows内核不参加对wsl2的内存和运行管理,wsl2的运行时管理全部由linux内核处理。这也是虚拟机的基本作用,把一台电脑虚拟为多台操作系统并完全独立运行,由不同操作系统的内核管理,宿主机只提供资源。轻量虚拟化:即不需要完全开启hyper-v虚拟机功能

  • 开启hyper-v会和virtualbox冲突,这一点一定要注意

在这里插入图片描述
3. wsl1:可以看到没有使用linux内核,只是通过兼容层对Windows和Linux命令转换
在这里插入图片描述

二. 安装wsl

1. 打开适用于Linux…和虚拟机平台,hyper-v

wsl2需要在虚拟机上运行完整的liunx内核,所以需要开启hyper-v。但是开启hyper-v会和virtualbox冲突,这一点一定要注意
在这里插入图片描述
在这里插入图片描述

2. 下载wsl2内核更新包

链接

3. 下载linux分发

即linux镜像,该镜像提供完整的用户空间工具、包管理器和文件系统结构。供wsl的linux内核使用
链接

4. 安装windows终端

链接

5. 将分发的版本改为wsl2

使用

wsl -l -v 查看当前分发版本
wsl --set-default-version 2

wsl --set-version < distribute name > 2

参考链接
参考链接

6. 查看分发版本

在这里插入图片描述

7. 更换镜像源

修改vim /etc/apt/sources.list
阿里云镜像站

三. 出现问题

1. 执行Add-AppxPackage .\Ubuntu.appx无效

解决方法:我们手动进行安装

  1. 将Ubuntu.appx改为Ubuntu.zip,并移动到安装目录
  2. 在安装目录中解压,然后把Ubuntu_2004.2021.825.0_x64.appx修改为zip
    在这里插入图片描述
  3. 解压Ubuntu_2004.2021.825.0_x64.zip,可以得到一个Ubuntu.exe文件,点击该文件即可完成安装

2. 手动下载后执行 Add-AppxPackage .\Ubuntu.appx后没有看到安装的镜像

在开始菜单的“最近添加”程序列表中找到ubuntu。双击完成安装。
或者在设置->应用和程序中搜索
在这里插入图片描述

链接

3. 设置http代理

设置好后不要用ping命令测试,ping是icmp包而不是http包。
我们使用curl -I https://www.google.com, curl -I http://www.google.com

4. 开启ssh

  1. ps -e | grep ssh 查看是否有ssh服务
  2. sudo apt-get install openssh-server 下载ssh服务
  3. service ssh status 查看ssh服务状态
  4. sudo ufw enable|disable 开启或关闭防火墙,这里需要disable。或者sudo ufw allown 22
  5. sudo vim /etc/ssh/sshd_config 将里面的PermitRootLogin no 改为yes
    PasswordAuthentication 改为 yes
  6. service sshd restart

5. wsl.conf 和 .wslconfig修改后不生效

wsl.conf可以启用systemd,.wslconfig可以nat改桥接,但是我们修改后无法生效,可能是系统版本问题。
官方文档

6. wsl设置默认用户为root

参考

4. 关于文件互传的问题

  1. 只要在linux上安装了openssh-server就安装好了sftp和scp服务器,就可以在Windows上使用scp和sftp进行文件互传。sftp和scp是基于ssh连接的

5. 关于设置linux自启动和添加init,system管理的问题

一. 如何添加自启动

1. 初始化进程为systemd时

(1)启动脚本的所有源文件在/lib/systemd/system/或/etc/systemd/system/中,前者是系统应用的默认启动目录,后者是自定义应用启动目录,后者可以覆盖前者。我们可以进入启动脚本源文件中查看服务的控制命令并执行,但是我们最好还是使用systemctl进行控制,保证使用systemd管理
(2)在启动的时候系统会执行
/etc/systemd/system/graphical.target.wants/或/etc/systemd/system/multi-user.target.wants/或中的脚
来初始化进程。graphical.target.wants表示图形化,multi-user.target.wants表示字符界面。当然系统启动不单单会执行上诉目录的脚本也会执行其他目录的脚本,比如/lib/systemd/system/目录中的某些脚本。

(3)/etc/systemd/system/graphical.target.wants/和/etc/systemd/system/multi-user.target.wants/中的每个脚本都是链接文件。同名原文件在/lib/systemd/system/目录中

(4)graphical.target.wants依赖于multi-user.target.wants,在执行关于graphical的脚本之前会先执行和multi-user相关的脚本

(5)在/etc/systemd/system/multi-user.target.wants/中存在对samb服务的启动脚本

2. 初始化进程为init时

(1)启动脚本的源文件在/etc/init.d,我们可以直接去执行这些脚本来控制进程,但最好还是使用service来控制
(2)启动脚本存放在/etc/rc*.d/中,/etc/rc*.d/中的所有文件都是链接文件,原文件在/etc/init.d中。
(3)比如/etc/rc3.d/就是runlevel3字符界面的开机启动脚本。里面包含了samb的启动脚本

3. 如何添加自启动

  1. 先使用pstree查看初始化进程是init还是systemd。
  • systemd

    • 添加启动:systemctl enable samb
    • 取消自启动 systemctl disable samb
  • init

    • 添加samb启动 : sudo update-rc.d samb defaults
    • 取消自启动:sudo update-rc.d samb remove
    • 添加postgresql启动:先在/etc/init.d/中查看启动脚本的名字,然后用该名字添加自启动
    • 在这里插入图片描述

二. 如何添加init,system管理

1. init

只需要在/etc/init.d/ 中创建对应的程序脚本

2. systemd

在/etc/systemd/system/ 下创建.service文件

六. 关于wsl网络连接的问题

  1. 当断网时
    因为wsl中不支持NetworkManger,wsl中的网络由Windows的wslhost.exe管理,我们只能通过ip link set eth0 down和ip link set eth0 up进行网络接口的重启,但是这样做并没有任何用

  2. 我们在离线情况下,尝试在官网上下载deb包使用dpkg -i手动安装ifupdown命令,但是由于依赖的版本过低问题,最后还是不得不重启wsl使用apt包管理器进行下载。
    Ubuntu软件包官网

3. 所以最后的解决方案是,重启wsl。

七. 使用grep进行文件查找注意事项

  1. 使用grep查找时一定注意加"“,比如grep -i -l “abc*” demo,因为加”"可以使用正则表达式。
  2. 根据文件内容查找文件
    (1)grep -r “abc” /demo/
    虽然-r选项可以递归查找目录中所有文件,但是无法查找链接文件,不推荐使用,我们用(2)替代
    (2)grep -l -i “abc” /demo/*
    -l 表示只显示文件名,-i 忽略大小写。

八. docker安装

1. docker的优点

  1. 使用docker容器技术,可以轻量化隔离安装许多运行环境。
  2. 不推荐在一个docker容器中安装多个服务,因为docker本质就是为了隔离运行环境,让每个环境独立运行。我们完全可以创建多个docker容器,并将端口映射到宿主机。
  3. 有了docker我们就可以隔离独立的运行多个后端服务。比如,一个容器用于mysql,一个用于ngnix

2. docker需要的运行环境

(1)不需要使用完全的hyper-v虚拟化,只需要开启Windows虚拟化功能即可。即使用轻量的hyper-vx虚拟化。

(2)如图,docker需要运行在linux环境中,每个docker容器共享宿主机linux的内核,所以我们必须在Windows上安装虚拟机或wsl,或者在linux实体机中运行docker
在这里插入图片描述
(3)docker客户端:命令行,或dockerdesktop
docker服务器:docker的守护进程
docker镜像:就好比是一个类,包含了运行环境,实例化后用于创建docker容器
docker容器:docker镜像的实例化
参考

3. docker的文件系统

    1. 每个docker容器共享宿主机linux的内核
    1. 每个docker镜像中都包含了独立的文件系统,如/usr,/lib等用户目录
    1. 每个docker镜像的文件系统默认被挂载到宿主机的/var/lib/docker/<驱动类型>/<容器ID>/目录下
    docker info | grep Storage #查看容器驱动
    docker ps -a --no-trunc #查看容器ID
    

4. docker容器环境搭建

(1) docker换源问题

  1. docker分为软件源和镜像源
  • (1)软件源:
      1. 存放在/etc/apt/sources.list.d/docker.list,/etc/apt/sources.list.d/是专门用于存放非apt软件源的目录。
      1. 受apt包管理器管理管理,可使用apt-get update更新
      1. 用于docker核心的更新,核心包括docker服务端组件和客户端组件(如命令行)
  • (2)镜像源:
      1. 存放在docker的配置文件中/etc/docker/daemon.json,我们设置加速地址也就是设置镜像源,但是现在全部无法访问
      1. 用于拉取镜像,镜像就是文件系统。拉取后通过linux内核进行管理
    {
      "registry-mirrors": [
        "https://dockerpull.org",
        "https://docker.fxxk.dedyn.io",
        "https://docker.m.daocloud.io",
        "https://docker.1panel.live",
        "https://06009bb76e000fc60fd1c01a26a6dfe0.mirror.swr.myhuaweicloud.com",
        "https://fl37993c.mirror.aliyuncs.com",
        "https://registry.docker-cn.com"
      ]
    }
    

(2) 构建容器

    1. 使用dockerfile,根据dockerfile中的规则构建。
    docker build -t flask-app . //在.目录使用build命令,但要保证.目录中有dockerfile
    docker run -d -p 5000:5000 flask-app // -t表示容器名称
    

    使用dockerfile的特点是,不需要挂载目录到docker容器中,而是直接通过dockerfile中的规则把要挂载目录中的文件全部复制到docker容器中

    1. 在docker-compose.yml中调用dockerfile构建
    • (1)其中dockerfile用于拉取镜像和下载依赖,docker-compose.yml中的其他配置等效于在docker run中设置的参数如-v挂载目录,-p端口映射
    • (2)如果docker-compose.yml中没有调用dockerfile,则根据image字段自动拉取镜像
    • (3)使用docker-compose.yml配置后,就可以使用docker compose命令进行快速管理,
      如使用docker compose -f <yml文件路径> up/down来快速开启和关闭。避免我们使用docker start和docker stop时误操作,docker run时构建容器命令,有可能会把docker run误以为是运行容器。
比如在下面的docker-compose.yml文件中,build中指定了调用的dockerfile用于拉取镜像,ports字段用于配
置端口映射
version: '3.9'
services:
  web:
    build: 
      context: .
      dockerfile: custom.Dockerfile  # 指定 Dockerfile 名称
    ports:
      - "5000:5000"
    1. 使用docker pull和run
    我们要手动拉取镜像然后使用run创建容器,-v来选择需要挂载的目录,支持bash命令,如$(pwd),挂载到
    docer容器中的/app目录。
    docker pull python:3.9
    docker run -it --name py_container -v $(pwd):/app python:3.9
    

(3) 远程管理docker方案

  1. 在windows中使用wsl+docker Desktop,最简单。但是我的wsl开启不了systemd导致无法运行docker,windows的版本太低无法安装docker Desktop
  2. vscode插件docker+ssh远程连接+docker容器ssh端口映射,我们将docker的22端口映射到宿主机,然后在Windows上使用ssh连接到宿主机的22端口。
  3. 使用vscode插件dev container的attach to container
    先ssh登录到容器运行主机,然后使用dev container的attach to container连接到运行时容器

5. docker数据持久化方案

  1. 解决方案:把宿主机目录挂载到docker下
  • 具体实现:
    • (1) 传统方案
      使用docker create volume创建一个挂载目录,该目录存储在宿主机上,且在docker容器销毁后不会消失。缺点是宿主机无法访问该目录。
    • (2) 推荐方案
      1. 在docker-compose.yml文件中指定volume,这样可以自动在宿主机上新建 /path/on/host目录。
      version: "3.9"
      services:
        app:
          image: my_app_image
          user: "1000:1000"  # 使用宿主机用户的 UID:GID
          volumes:
            - /path/on/host:/app/data
      
      1. 修改 /path/on/host目录的权限,并添加user字段,保证docker有权限访问该目录

6. docker常用命令

  1. 进入容器内部
docker exec -it <容器名/容器号> /bin/bash
  1. 运行容器关闭容器(存在docker-compose.yml的情况下)
docker compose up -d
docker compose down
  1. 容器/镜像
docker images
docker ps  
docker ps -a # 查看所有容器
docker rm <容器名:tag / ID>
docker rmi <镜像名:tag / ID>
docker log <容器名:tag / ID> # 查看容器运行日志,便于查错
docker stats <容器名:tag / ID> # 查看容器资源占用,便于我们了解资源分配
  1. 查看volume挂载目录的位置
docker volume list #查看当前所有挂载目录的id
docker inspect <volume id>
  1. 查看某个容器挂载的目录

docker inspect --format=‘{{range .Mounts}}{{.Source}} -> {{.Destination}}{{println}}{{end}}’ <container_name_or_id>

前面是宿主机挂载目录,后面是docker挂载点
在这里插入图片描述

  1. docker网络管理
    网络管理学习链接
  • 分为三种网络: bridge,host,none
    • bridge: 容器可以和虚拟机互通,且可以访问外网
      在这里插入图片描述
    • host: 容器的ip就为宿主机的ip,可以直接通过外网访问到容器
    • none: 不能联网
docker network ls # 查看所有的网络

在这里插入图片描述

docker network inspect <NAME> # 查看指定名称的容器的网络

在这里插入图片描述

九. 虚拟机和docker的nat网络模式

  1. docker使用nat转换和宿主机通信
  2. nat模式就是路由器作为dhcp服务器和网关,为子网分配私有ip,在内网访问外网时通过nat转化先将私有ip转化为公网ip,然后再通过路由表转发
    • (1)在vmware中的场景就是,VMware的虚拟网卡作为路由器为虚拟机通过dhcp分配私网ip。
    • (2)在docker中的场景是,docker在宿主机上的虚拟网卡作为路由器为docker容器通过dhcp分配私网ip。
  3. 桥接模式就是路由器不开启dhcp服务,仅仅作为交换机使用。内部设备依靠上级路由器的dhcp分配ip
    • (1) 在VMware中的场景是,vmware的虚拟网卡作为交换机,虚拟机ip通过上级路由器分配

4. 为什么nat模式下,主机可以ping通虚拟机?

因为此时是通过Windows的路由表进行转发的。宿主机存在到虚拟机的路由。但是我们要注意,在外网肯定是不能访问私网ip的,这里是因为虚拟化技术,在一张网卡上创建了多个虚拟网卡接口,并通过路由表进行管理。如果要想外网访问私网ip,我们可以使用vpn服务器和客户端,实现内网穿透。通过在客户端加密目标私网ip,目标ip还是为服务器的公网ip,到达服务器端口后解密,并转发到对应私网ip。

5. 为什么在vmware桥接模式且容器为bridge网络模式下,在Windows无法ping通Linux中docker容器,但是linux可以ping通自己的容器

(1). linux可以ping通自己的容器是因为这是容器网络为bridge的特点。同时容器也可以通过docker0路由访问外部网络

此时可以通过宿主机上的docker0虚拟网卡接口和容器内部的网卡接口进行通信。换句话说此时的docker0就是一个路由器,在docker0下桥接的容器就是直连路由
在这里插入图片描述

(2) Windows无法ping通Linux中docker容器

因为此时windows路由表中并没有到docker容器ip的路由。所以直接ping docker容器ip肯定不行。除非自己设置静态路由,或者内网穿透,或者docker端口映射

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值