docker用windows子系统运行m *** uild

系统知识04

docker用windows子系统运行m *** uild,第1张

docker用windows子系统运行m *** uild
导读:用户可以根据自己的系统在Docker官网选择Mac[1]或Windows[2],因为Docker可以在Mac系统中安装后可以直接运行,这里就不再赘述。安装完Docker,并注册个人账号,再双击启动它这是因为Docker无法在Windows系

用户可以根据自己的系统在Docker官网选择Mac[1]或Windows[2],因为Docker可以在Mac系统中安装后可以直接运行,这里就不再赘述。安装完Docker,并注册个人账号,再双击启动它这是因为Docker无法在Windows系统中直接运行,而需要创建一个Windows系统中的Linux虚拟机(VM)为Docker的正常运行搭建好底层依赖。虽然官方文档[3]提供了hyper-V和WSL2两种解决方案,但是WSL2是基于hpyer-V在WSL1的升级版,其功能,安装方式也简单方便,因此作者就选择了WSL2的后端方式来运行Docker。

docker容器中运行windows虚拟机的 *** 。

1、安装完成必要的组件之后,从桌面上的“Boot2DockerStart”快捷方式启动Boot2Docker。

2、启动一个配置好的用于管理在虚拟机中运行的Docker的unixshell。

3、检查否确配置运行面dockerversion命令

1前言

Docker最近推出了可以运行在Win10和Mac上的稳定版本,让我们赶紧来体验一下。

2安装准备

需要的条件为: 64bit Windows 10,开启Hyper-V

21 下载Docker for Windows

从官网的下面地址可以下载

https://downloaddockercom/win/stable/InstallDockermsi

22 开启win10的Hyper-V

控制面板 -> 程序 -> 启用或关闭Windows功能 -> 选中Hyper-V

这里写描述

完成后自动重启

3安装Docker

用刚才下载的安装包安装,安装完成后,启动Docker

这里写描述

这里写描述

如果没有开启Hyper-V,启动Docker的时候会提示开启Hyper-V

这里写描述

如果启动的时候,提示内存不足,启动失败,可以在setting设定中调节VM内存大小

这里写描述

4使用Docker

41 查看版本等信息

[Docker] 入门教程

https://wwwjianshucom/writer#/notebooks/20574865/notes/37511203

我们从 logo 上可以看出来, 说白了, 这个东西就是一个管理容器的工(zhang)具(yu), 我们可以方便的使用它来管理我们的 docker 容器, 可以极大程度的简化命令行的复杂操作

如果你是 Mac 或 Windows 用户使用桌面版本的 Docker 应用默认就会替你安装 docker-compose (下文中用dc代替), 如果是 centos 的话可以使用命令 yum -y install docker-compose 太简单了不做过多说明

查看版本,能显示出来证明安装成功了

接下来我们有需求了, 运行一个 service-a 挂载到 /usr/local , 映射端口为 8082 并添加 servicehost 域名映射内网 ip ,很多人可以想到那应该是一条冗长 docker 命令

这么一大坨,看起来十分不方便,那么我们就是用 docker-compose 来优化一下

首先创建一个名为 docker-composeyml 的文件

之后随便是用一个文本编辑器打开,写入下面内容

这样看起来是不是思路清晰多了呢,我们接下来运行一下

-d 后台运行,否则运行log就会出现在你的屏幕上。。。

然后查看一下运行状态

我们可以看到服务已经运行起来了,我们试着访问一下

http://localhost:8082/hello

成功,这一部分告一段落。

有的人会问,多个服务怎么运行呢?很简单,我们这里就来做一下。

下面我要做的是开启三个服务 service-a , service-b , service-eureka ,分别是一个注册中心和两个服务。

我们来完善一下 docker-composeyml

我们来运行一下

注册中心

访问service-a

访问service-b

到这里我们已经可以运行起来多个服务了!!!!下课 - -

我们可以看到 docker-compose 会自动识别容器的开启状态,替我们开启需要开启的那一个

1可能很多人对我的 echo 1921681126 servicehost >> /etc/hosts 不是很理解

这里说一下,这句命令的意思是,把 servicehost 域名加入到 hosts 文件,目的是为了能让我的 eureka 发现我的服务,而不是把地址写死在配置文件中,这句命令对应的服务配置为

 一:从运行一个简单的 Python Web 程序说起

  启动Docker客户端并登陆。在客户端中输入以下内容:

  $ sudo docker run -d -P training/webapp python apppy

  之一次输入上面命令时,Docker会先从云端镜像库中下载training/webapp镜像。

  1运行截图

  下面我们来详细看看这条命令的具体内容,这一部分我们可以在官方文档中找到详细的英文解释,这里笔者将其翻译过来并加了些自己的理解。

  前面我们已经说过,Docker虚拟机系统实际也是基于Linux内核,所以这条语句实际上就是Linux的命令,我们可以输入以下内容查看docker命令的详解:

  $ sudo docker

 

  2docker命令的子命令列表

  再回到之一条中,我们使用的子命令是run。

  在子命令列表中我们看到run子命令解释是:run Run a command in a new container,也就是在一个新的容器中运行一条命令。

  我们的run命令后面跟的可选项有-d和-P。

  查阅官方文档我们可以知道,-d表示Docker会把当前命令的容器放到后台执行并监控起来。-P则表示让Docker映射任何容器内部需要的端口到虚拟机上。这里需要对Docker一些概念有所了解,我们这里暂且简单地理解为Docker虚拟机下的每个Docker容器都是一台子虚拟机,每个子虚拟机都有一块虚拟网卡,当外部要访问容器时都必须通过Docker虚拟机,而-P就做了相关的端口映射。

  命令执行后返回的一长串字符串(也就是fc4028b21d84f5c075821ca2425d74d45dea87cd28c4eb92620ae39ddec22f46)则是Docker的容器ID,这是一个唯一的值,我们可以以它为标识对容器做相应的操作。

  当我们需要查看和管理当前后台运行的所有容器时,我们可以输入以下命令。

  $ sudo docker ps

  图3容器详细信息

  这里我们可以看到容器的详细信息,包括容器ID(精简的ID),镜像,命令,创建时间,状态,端口,以及容器名字。

  接下来的training/webapp就是我们运行的容器的源了,Docker中称之为镜像,这个镜像是Docker官方之前就创建好的,里面包含了一个简单Python Flask web应用。

  最后,我们在容器中执行了python apppy,python apppy启动了我们的web应用。

  二:访问页面——从 Linux 和 Windows 的区别到对 Docker 层次的简单理解

  从上面我们查看运行容器的详细信息时我们看到了,在PORTS这一栏中,有这样的信息:

  0000:49153->5000/tcp

  上文中提到Docker虚拟机对容器做了端口映射,这里我们可以更直观的看到了,Docker虚拟机中的49153端口映射到了容器的5000端口(这里我们运行的是web程序,所以是tcp协议,其他容器有需要可以指定成udp协议)。

  在官方文档中,这时我们访问localhost:49153,应该就能出现Hello world了,但是笔者在这个步骤根本访问不到这个页面。

  图4此时访问,浏览器一直处于等待状态

  因此这里我们需要重新看看这个虚拟 *** 的结构,要看整个 *** 的结构,我们应该先了解Docker的层次结构。在Linux中,Docker的逻辑结构是这样的:

  硬件 < Linux系统(Docker Kernel) < Docker容器

  而我们在前文中提过,在Windows中要运行Docker,实际上是在虚拟机下运行的,所以在Windows中Docker的逻辑结构应该是:

  硬件 < Windows系统 < Docker虚拟机(Docker Kernel) < Docker容器。

  因此官方文档中用例应该是基于Linux下的,Linux此时访问localhost:49153是没有问题的,因为Docker Kernel此时把49153端口映射给了容器的5000端口,而Windows则不行,因为我们只是把Docker虚拟机的49153端口映射给了容器,我们在浏览器中输入localhost:49153明显是访问的Windows层级别。

  理解到这里问题就已经解决了,我们只需进入VirtualBox中,将Docker虚拟机的 *** 做个桥接,或者端口映射就行了。

  进入VirtualBox主界面,选中Docker虚拟机(boot2docker-vm),单击设置按钮,在设置中选择 *** ,这里我们发现Docker虚拟机默认选择了“ *** 地址转换(NAT)”。

  图5Docker虚拟机的 *** 连接方式默认是NAT

  而且端口转发中还默认有两个端口映射。

  图6Docker虚拟机和宿主机默认的端口映射

  不难猜测这里可能是Docker客户端和Docker虚拟机进行通信的端口,因此我们不能将Docker虚拟机的 *** 连接方式改成桥接了,否则Docker客户端无法和Docker虚拟机进行通信。

  因此我们这里选择添加一个端口映射,将Windows系统的80端口映射到Docker虚拟机的的49153端口上去。端口映射的名称随便取,协议一定要是TCP(HTTP基于TCP)

  图7添加映射端口

  此时我们可以在Windows下的浏览器直接访问localhost了(一般来说浏览器默认访问80端口,80端口可以省略),因为我们直接映射了80端口到Docker虚拟机的49153端口上,而Docker虚拟机的49153端口又映射到了我们刚刚创建的Docker容器的5000端口上,我们的web程序正是运行在该容器的5000端口上。

  

  8Hello world!

  总结:

  本文实际上只运行了一个简单的web程序,用例也是基于官方文档,而且如果读者是在Linux运行的话输入完之一条命令应该直接在浏览器中访问了。因此本文主要是对Docker的run命令做了简单的解释,并且通过Docker在Linux和Windows下的区别来简单理解Docker逻辑层次结构。

  希望对初学者有一些帮助,笔者自己也是Docker的初学者,文章错处,万请见谅指正。

Docker 引擎使用 Linux 特有的内核特性,因此不能通过 Windows 内核运行,所以,(在 Windows 上)Docker 引擎创建了一个小的虚拟系统运行 Linux 并利用它的资源和内核。这样,Windows Docker 客户端就可以用这个虚拟的 Docker 引擎来构建、运行以及管理 Docker 容器。有个叫 Boot2Docker 的团队开发了一个同名的应用程序,它创建了一个虚拟机来运行基于Tiny Core Linux特制的小型 Linux,来在 Windows 上运行 Docker 容器。它完全运行在内存中,需要大约 27M 内存并能在 5秒 (因人而异) 内启动。因此,在用于 Windows 的 Docker 引擎被开发出来之前,我们在 Windows 机器里只能运行 Linux 容器。

下面是安装 Docker 客户端并在上面运行容器的简单步骤。

1 下载 Boot2Docker

在我们开始安装之前,我们需要 Boot2Docker 的可执行文件。可以从 它的 Github 下载最新版本的 Boot2Docker。在这篇指南中,我们从网站中下载版本 v161。我们从那网页中用我们喜欢的浏览器或者下载管理器下载了名为 docker-installexe 的文件。

2 安装 Boot2Docker

现在我们运行安装文件,它会安装 Window Docker 客户端、用于 Windows 的 Git(MSYS-git)、VirtualBox、Boot2Docker Linux ISO 以及 Boot2Docker 管理工具,这些对于开箱即用地运行全功能的 Docker 引擎都至关重要。

3 运行 Boot2Docker

安装完成必要的组件之后,我们从桌面上的“Boot2Docker Start”快捷方式启动 Boot2Docker。它会要求你输入以后用于验证的 SSH 密钥。然后会启动一个配置好的用于管理在虚拟机中运行的 Docker 的 unix shell。

为了检查是否正确配置,运行下面的 docker version 命令。

docker version

4 运行 Docker

由于 Boot2Docker Start 自动启动了一个已经正确设置好环境变量的 shell,我们可以马上开始使用 Docker。请注意,如果我们要将 Boot2Docker 作为一个远程 Docker 守护进程,那么不要在 docker 命令之前加 sudo。

现在,让我们来试试 hello-world 例子镜像,它会下载 hello-world 镜像,运行并输出 "Hello from Docker" 信息。

$ docker run hello-world

5 使用命令提示符(CMD) 运行 Docker

现在,如果你想开始用命令提示符使用 Docker,你可以打开命令提示符(CMDexe)。由于 Boot2Docker 要求 sshexe 在 PATH 中,我们需要在命令提示符中输入以下命令使得 %PATH% 环境变量中包括 Git 安装目录下的 bin 文件夹。

set PATH=%PATH%;"c:\Program Files (x86)\Git\bin"

运行上面的命令之后,我们可以在命令提示符中运行 boot2docker start 启动 Boot2Docker 虚拟机。

boot2docker start

注意: 如果你看到 machine does no exist 的错误信息,就运行 boot2docker init 命令。

然后复制上图中控制台标出命令到 cmdexe 中为控制台窗口设置环境变量,然后我们就可以像平常一样运行 docker 容器了。

6 使用 PowerShell 运行 Docker

为了能在 PowerShell 中运行 Docker,我们需要启动一个 PowerShell 窗口并添加 sshexe 到 PATH 变量。

$Env:Path="${Env:Path};c:\Program Files (x86)\Git\bin"

运行完上面的命令,我们还需要运行

boot2docker start

这会打印用于设置环境变量连接到虚拟机内部运行的 Docker 的 PowerShell 命令。我们只需要在 PowerShell 中运行这些命令就可以和平常一样运行 docker 容器。

7 用 PUTTY 登录

Boot2Docker 会在%USERPROFILE%ssh 目录生成和使用用于登录的公共和私有密钥,我们也需要使用这个文件夹中的私有密钥。私有密钥需要转换为 PuTTY 的格式。我们可以通过 puttygenexe 实现。

我们需要打开 puttygenexe 并从 %USERPROFILE%ssh\id_boot2docker 中导入("File"->"Load" 菜单)私钥,然后点击 "Save Private Key"。然后用保存的文件通过 PuTTY 用 docker@127001:2022 登录。

8 Boot2Docker 选项

Boot2Docker 管理工具提供了一些命令,如下所示。

$ boot2docker

Usage: boot2dockerexe [<options>]{help|init|up|ssh|save|down|poweroff|reset|restart|config|status|info|ip|shellinit|delete|download|upgrade|version}[<args>]

总结

通过 Docker Windows 客户端使用 Docker 很有趣。Boot2Docker 管理工具是一个能使任何 Docker 容器能像在 Linux 主机上平滑运行的很棒的应用程序。如果你更仔细的话,你会发现 boot2docker 默认用户的用户名是 docker,密码是 tcuser。最新版本的 boot2docker 设置了一个 host-only 的 *** 适配器提供访问容器的端口。一般来说是 19216859103,但可以通过 VirtualBox 的 DHCP 实现改变。

当前版本的 docker-desktop 已经默认开启支持WSL2,安装时保持默认选项直接下一步,安装完毕之后重启电脑。之后docker会弹出WSL2尚未配置完毕,点击提示框中的链接,安装MSI扩展包,重启电脑即可愉快地使用docker。

想在Windows上运行docker,可谓是一言难尽。从最初的docker-toolbox到基于Hyper-v虚拟化的docker-desktop,无论是哪个方式,都有一堆一堆的坑点。

想要在windows上愉快地玩耍docker,难道就只能virtualbox装个linux再装docker?(或者docker-client配远程docker-daemon?)

于是,我决定换个坑踩。

以管理员运行Powershell(开启WSL,如已开启可跳过)

之后重新启动计算机。

以管理员身份打开 PowerShell 并运行:

启用这些更改后,需要重新启动计算机。

在 PowerShell 中运行:

打开Microsoft Store,搜索 ubuntu 并安装。

之后启动刚刚安装的Ubuntu。

打开刚刚安装的Ubuntu,安装依赖:

信任 Docker 的 GPG 公钥:

对于 amd64 架构的计算机,添加软件仓库:

最后安装

安装大功告成了,运行

不出意外的话,大概率会报错。

将当前用户添加到docker用户组

之后重启 windows计算机

重启完成后,打开Ubuntu,运行

输出[OK]。

运行

没有报错,