在Windows环境下使用docker
Widows下的Docker工具有两个:Docker Toolbox,和Docker Desktop,其中后者是在win10下才能使用的,提供了更强大的功能。由于我个人的电脑是win7环境,用的就是docker toolbox。
Windows的docker的原理是:利用虚拟机虚拟一个linux,win7下是virtualbox, win10下是hyperv,然后在这个虚拟机中跑docker。其实在linux上也有这种方式,具体可以参考docker-machine,工作模式如下。
- 将docker分为docker client和docker server两部分
- docker client通过docker-machine命令在docker server中创建docker虚拟机
- docker client将docker命令关联到docker虚拟机上,此时docker命令就是直接下发到相应的docker虚拟机了

对于docker toolbox来说,docker client对应的是本机,而docker server对应的则是虚拟机了。不过docker machine本身是一个比较灵活的管理方式,可docker server可以是虚拟机,可以是实体机,也可以是云服务器。
PS:现在windows也有原生可以跑win32程序的docker了,具体可以参考这篇文章:BUILD AND RUN YOUR FIRST DOCKER WINDOWS SERVER CONTAINER
创建虚拟机
创建虚拟机最简单的命令形式为
docker-machine create myvm
创建完成后,就在VirtualBox中增加了一个虚拟机。它会使用一个Boot2Docker的镜像,这是一个专门优化的linux版本,体积较小,方便发布。不过第一次创建的时候貌似会远程下载该镜像,虽然不大,但最好还是使用相应不可说的工具。
除了这个最基础的命令外,也可以在创建的时候指定一些其它参数,如内存、磁盘空间、cpu个数等。具体请参看docker-machine命令行。对于已经创建好的虚拟机,如果要修改其参数,也可以直接在VirtualBox中修改。(一个比较常见的操作就是移动虚拟磁盘的存储位置)
查看虚拟机
常见好虚拟机后,可以通过docker-machine env命令查看虚拟机基本环境信息。
> docker-machine env myvm
SET DOCKER_TLS_VERIFY=1
SET DOCKER_HOST=tcp://192.168.99.100:2376
SET DOCKER_CERT_PATH=C:\Users\XXX\.docker\machine\machines\myvm
SET DOCKER_MACHINE_NAME=myvm
SET COMPOSE_CONVERT_WINDOWS_PATHS=true
REM Run this command to configure your shell:
REM @FOR /f "tokens=*" %i IN ('docker-machine env myvm') DO @%i
关联虚拟机
常见好虚拟机后,docker命令就直接关联到虚拟机中了。一个问题是,如何知道docker命令关联到那个虚拟机的。我们可以通过docker-machine ls命令查看当前docker虚拟机状态。
> docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default * virtualbox Running tcp://192.168.99.102:2376 v18.09.2
myvm - virtualbox Running tcp://192.168.99.100:2376 v18.09.2
可以看出,当前活跃的是名为default的虚拟机。
那么,我们如何修改活跃的虚拟机呢,实际上docker-toolbox会在系统中设置一堆环境变量:
DOCKER_HOST=tcp://192.168.99.102:2376
DOCKER_MACHINE_NAME=default
DOCKER_TLS_VERIFY=1
DOCKER_TOOLBOX_INSTALL_PATH=C:\Program Files\Docker Toolbox
docker工具是通过这些环境变量判断当前活跃的虚拟机的。也就是说,只要修改该环境变量参数即可切换虚拟机。敏锐的人可能会发现这个和docker-machine env中的输出非常类似,并且docker-machine env中最后还告诉你了如何应用这些环境变量。
REM Run this command to configure your shell:
REM @FOR /f "tokens=*" %i IN ('docker-machine env myvm') DO @%i
根据其提示,直接使用@FOR /f "tokens=*" %i IN ('docker-machine env myvm') DO @%i命令即可。
关联好虚拟机后,剩下的使用方式就和本地docker使用一样了。
虚拟机命令行
创建好虚拟机后,也可以通过docker-machine ssh myvm命令进入其虚拟机命令行,从而进行虚拟机相关操作。
不过这个命令行只有zsh,有的终端下会出现乱码(默认的控制台就有乱码),此时可以通过使用cmder等终端来解决。
设置国内镜像源
设置国内镜像源相信是广大国内用户必不可少的一步,对于Boot2Docker这个linux的设置方式如下:
docker-machine ssh default
sudo sed -i "s|EXTRA_ARGS='|EXTRA_ARGS='--registry-mirror=https://registry.docker-cn.com |g" /var/lib/boot2docker/profile
exit
docker-machine restart default
设置共享文件夹
很多时候,我们想让docker的数据文件夹写入本地windows的文件系统。解决方案比较简单:由于dock server是在virtualbox的虚拟机,只需要首先挂在一个共享文件夹,然后启动docker的时候,将其写入那个共享文件夹在虚拟机中的路径即可。
其实docker toolbox本身也想到了这一点,默认就将C:\Users给共享给virtualbox了,映射成了文件夹/c/Users。不过这种方式往往不符合我们的使用习惯,这个时候需要自己在virtualbox中建文件夹了。(估计virtualbox也有建共享文件夹的api,如果能用命令行的话就方便些,后期找到了再补充)
修改默认docker虚拟机的位置
docker虚拟机默认创建在c盘,有的有洁癖的人还是不是很习惯的,想自定义其存储位置。docker toolbox 没有提供手动设置的方式,但我们可以通过修改配置项的方式来实现我们的目的。
- 在Windows的系统环境添加MACHINE_STORAGE_PATH ,指向自定义虚拟机的位置,如D:\VM\machines
- 复制boot2docker.iso到虚拟机的位置同级目录cache上(D:\VM\cache),如果不是最新的话需要下载最新。
- 停止现有的所有虚拟机,移动至新位置,重新启动虚拟机
参考文章
在Windows环境下使用docker的更多相关文章
- windows 环境下搭建docker私有仓库
windows 环境下搭建docker私有仓库 1.在公用仓库中pull仓库镜像 docker pull regitry 2.启动仓库镜像 //-d意思是后台运行,-p是做端口映射,这里是将本地的50 ...
- Windows 环境下 Docker 使用及配置
原文引用: https://www.cnblogs.com/moashen/p/8067612.html 我们可以使用以下两种方式在Windows环境下使用docker: 1. 直接安装: Docke ...
- docker在Windows环境下的安装
Windows环境下安装 docker有两种安装包 一.Docker for Windows(目前只能在 64 位的 Windows10 专业版.企业版.教育版下才能安装) 二.Docker Tool ...
- 【Docker】win10环境下安装Docker
一.进入Docker官网 首先先到Docker官网下载最新官方Docker for Windows:Docker下载 在官网内可以查看到Docker的开发文档. 根据官网提示,Windows环境下下载 ...
- 关于docker在windows环境下运行的第一次体验
关于docker在windows环境下执行的原理 1.1. 首先是Docker Quickstart启动,如果在虚拟机Oracle VM VirtualBox不存在default虚 ...
- Docker学习<一>--初体验Windows环境下安装
背景 今天想试用spring boot与jwt协议的实现,配套就需要使用redis,但redis似乎windows环境版本部署起来不是那么舒心,果断尝试使用docker. 下载 下载地址: 稳定版:h ...
- Windows环境下docker的安装与配置
Docker是一种容器技术,可以在操作系统中隔离出若干个独立的程序运行环境,这些环境既可以共享宿主机的资源,另一方面他们之间相互独立,互不影响,也不会对宿主机的环境产生影响.与虚拟化技术不同的是,Do ...
- Windows环境下写Linux sh脚本的一次挖坑和填坑
最近在研究Docker集群和安装的时候,需要准备若干台机器.所以我为节约时间,打算批量复制VM机器,然后用sh脚本命令执行机器名称和IP等基础配置信息的修改. 具体操作:我在windows环境下,用N ...
- 海纳百川无所不容,Win10环境下使用Docker容器式部署前后端分离项目Django+Vue.js
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_179 随着现代化产品研发的不断推进,我们会发现,几乎每个产品线都会包含功能各异的服务,而且服务与服务之间存在也会存在着错综复杂的依 ...
随机推荐
- centos6.7安装系统后看不到网卡无法配置IP的解决办法
新安装centos6.7后发现/etc/sysconfig/network-scripts目录下没有eth0的网卡配置,通过ifconfig可以看到eth0的硬件地址 于是新建网卡输入一下内容 # c ...
- Oracle数据库操作基本语法
创建表 SQL>create table classes( classId number(2), cname varchar2(40), birthda ...
- Day4--------------对文件的权限管理
一.文件权限 ls -l 显示当前文件详细信息 例: -rw-r--rwx.1 root root 1415 11月 9 20:21 anaconda-ks.cfg 依次顺序为:权限信 ...
- iOS 中的Certificate,Provisioning Profile 的一些注意 (不断完善中)
注册apple id 有1年多了,这些概念还是模模糊糊的,决定在这里总结一下. 请参阅官方文档 App Distribution Guide code singing的作用如下: Code signi ...
- 如何从现有版本升级到element UI2.0?使用npm-check-updates
转:https://blog.csdn.net/wojiaomaxiaoqi/article/details/78428738 登录element UI官网时提示2.0已经正式发布了,Element ...
- python易错题之作用域
name = "lzl" def f1(): print(name) def f2(): name = "eric" f1() f2() //结果为 lzl 记 ...
- python 全栈开发,Day130(多玩具端的遥控功能, 简单的双向聊天,聊天记录存放数据库,消息提醒,玩具主动发起消息,玩具主动发起点播)
先下载github代码,下面的操作,都是基于这个版本来的! https://github.com/987334176/Intelligent_toy/archive/v1.3.zip 注意:由于涉及到 ...
- python 全栈开发,Day51(常用内置对象,函数,伪数组 arguments,关于DOM的事件操作,DOM介绍)
昨日内容回顾 1.三种引入方式 1.行内js <div onclick = 'add(3,4)'></div> //声明一个函数 function add(a,b){ } 2. ...
- canvas绘制简易动画
在canvas画布中制作动画相对来说很简单,实际上就是不断变化的坐标.擦除.重绘的过程 1.使用setInterval方法设置动画的间隔时间. setInterval(code,millisec) s ...
- Spring之对象依赖关系(依赖注入Dependency Injection)
承接上篇: Spring中,如何给对象的属性赋值: 1:通过构造函数,如下所示: <!-- 1:构造函数赋初始值 --><bean id="user1" clas ...