ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Docker容器与win10访问wsl中的docker中容器

2021-06-16 11:04:33  阅读:804  来源: 互联网

标签:容器 container 操作系统 虚拟机 端口 wsl win10 docker


容器

容器和镜像的区别

镜像可以理解为一种构建时(build-time)结构,而容器可以理解为一种运行时(run-time)结构。

容器和虚拟机的区别

虚拟机和容器最大的区别是容器更快并且更轻量级——与虚拟机运行在完整的操作系统之上相比,容器会共享其所在主机的操作系统/内核。
容器和虚拟机都依赖于宿主机才能运行。宿主机可以是笔记本,是数据中心的物理服务器,也可以是公有云的某个实例。
在下面的示例中,假设宿主机是一台需要运行 4 个业务应用的物理服务器。

  • 虚拟机:需要创建 4 个虚拟机并安装 4 个操作系统,然后安装 4 个应用。

    虚拟机模型将底层硬件资源划分到虚拟机当中。每个虚拟机都是包含了虚拟 CPU、虚拟 RAM、虚拟磁盘等资源的一种软件结构。因此,每个虚拟机都需要有自己的操作系统来声明、初始化并管理这些虚拟资源。
    但是,操作系统本身是有其额外开销的。例如,每个操作系统都消耗一点 CPU、一点 RAM、一点存储空间等。每个操作系统都需要独立的许可证,并且都需要打补丁升级,每个操作系统也都面临被攻击的风险。

  • 容器:服务器启动之后,所选择的操作系统会启动。在 Docker 世界中可以选择 Linux,或者内核支持内核中的容器原语的新版本 Windows

    容器模型具有在宿主机操作系统中运行的单个内核。在一台主机上运行数十个甚至数百个容器都是可能的——容器共享一个操作系统/内核。
    这意味着只有一个操作系统消耗 CPU、RAM 和存储资源,只有一个操作系统需要授权,只有一个操作系统需要升级和打补丁。同时,只有一个操作系统面临被攻击的风险。简言之,就是只有一份 OS 损耗。

启动容器

docker container run
#格式:
docker container run [OPTION] [REPOSITORY]:[TAG]
#option
-it #将当前终端连接到容器
-d #以后台启动方式启动容器
--name #重命名
-p #映射端口,[docker主机端口]:[容器端口],当有流量访问docker主机端口时,流量会映射到容器内的端口
#例如:
docker container run -it ubuntu:16.04

仔细观察上面命令的输出内容,会注意到每个实例中的提示符都发生了变化。这是因为 -it 参数会将 Shell 切换到容器终端——现在已经位于容器内部了!其中 -it 参数告诉 Docker 开启容器的交互模式并将读者当前的 Shell 连接到容器终端。接下来,命令告诉 Docker,用户想基于 ubuntu:latest 镜像启动容器。
使用Ctrl-PQ组合键退出容器,可以再退出容器的同时还保持容器运行

查看运行状态的容器

docker container ls

可以看到输出中显示了刚刚运行的ubuntu容器

连接到运行中的容器

#格式
docker container exec [opt] [容器NAME/ID] [ARG...]
#例如:
docker container exec -it strange_bouman bash

在示例中,将本地 Shell 连接到容器是通过 -it 参数实现的。本例中使用名称引用容器,并且告诉 Docker 运行 Bash Shell(在 Windows 示例中是 PowerShell)。

停止容器运行

 docker container stop [容器NAME/ID]
#例如:
docker container stop strange_bouman
docker container stop 9dc53040fa41

删除容器

docker container rm [容器NAME/ID]
#例如:
docker container rm strange_bouman

注:删除容器只能删除不在运行下的容器,容器在运行时无法被删除。

  • 我们可以通过docker container ls -a来确认容器是否已经被成功删除

win10中访问wsl2中的docker容器

以nigelpoulton/pluralsight-docker-ci为例子:

  • 1、首先在wsl的linux环境中启动容器,并用-p对其映射端口(此处的映射端口是将docker所在的宿主机(即wsl中的linux)映射到容器
$ docker container run -d --name webserver -p 80:8080 nigelpoulton/pluralsight-docker-ci

Unable to find image 'nigelpoulton/pluralsight-docker-ci:latest' locally
latest: Pulling from nigelpoulton/pluralsight-docker-ci
729ec3a6ada3: Pull complete
f0a3eea3dca0: Pull complete
e07851c50ad6: Pull complete
f78e7cd1f8dc: Pull complete
7cad1fbd2f07: Pull complete
22835c51693f: Pull complete
Digest: sha256:61bc64850a5f2bfbc65967cc33feaae8a77c8b49379c55aaf05bb02dcee41451
Status: Downloaded newer image for nigelpoulton/pluralsight-docker-ci:latest
049b6ee85436549b11d457cf2903e2262067bd7ba5e5499c5ba9840fcdc9cf8d
  • 2、通过命令docker container ls查看当前运行的容器以及端口映射情况
$ docker container ls
CONTAINER ID   IMAGE                                COMMAND                  CREATED          STATUS          PORTS                                   NAMES
049b6ee85436   nigelpoulton/pluralsight-docker-ci   "/bin/sh -c 'cd /src…"   29 minutes ago   Up 29 minutes   0.0.0.0:80->8080/tcp, :::80->8080/tcp   webserver
  • 3、建立win10和wsl中的linux的端口映射关系
    上述步骤只能在wsl中访问容器的8080端口,你可以通过 ifconfig 查看docker的ip,然后通过curl docker-ip即可看到服务的返回。但是直接在win10的浏览器上访问还是不行,因此需要建立映射。
    以管理员身份打开powershell
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8077 connectaddress=<wsl中的linux的eth0的ip> connectport=<wsl中linux映射的端口>
#例如:上面我是用wsl的ubuntu中的80端口映射到了容器的8080端口,所以我这边的connectport要填80,172.19.115.157是我ubuntu的eth0的ip
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8077 connectaddress=172.19.115.157 connectport=80
  • 4、建立映射后可以查看
netsh interface portproxy show all

侦听 ipv4:                 连接到 ipv4:

地址            端口        地址            端口
--------------- ----------  --------------- ----------
0.0.0.0         50051       172.25.16.145   50051
0.0.0.0         8077        172.19.115.157  80
  • 5、现在就可以通过win10本机的8077端口访问到容器的8080端口了
    在这里插入图片描述
    在这里插入图片描述

标签:容器,container,操作系统,虚拟机,端口,wsl,win10,docker
来源: https://blog.csdn.net/Canger_/article/details/117947999

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有