在Windows里使用Docker

Docker才是真爱啊。

1 曾经的双系统

对于初学Linux的同学,装双系统是一个很大的挑战。下载镜像、上谷歌、上不去谷歌、试各种方法、终于上去了、开始找镜像、下载镜像、刻录光盘、分区、改BIOS启动项顺序、终于装上了、修改引导、改软件源,blablabla。只有经历过的人才懂,精疲力竭。

实际在使用时,也并不舒服。想象一下,正在Linux里愉快的写代码呢,不得不上QQ处理一件事情。好嘛,重启,进Windows。要记得,此刻Linux还开着若干个Terminal,以及N个打开的浏览器Tab页呢!为什么不用QQ for Linux,为什么不用Wine,为什么不用QQ for Web?真心的不好用啊。

再比如,迅雷、Office、Photoshop,这些常用软件在Linux里找不到好的替代品。当然,可以选择Aria2、WPS for Linux,可是并没有原配的好啊。

最终,有人选择了Mac。当聊QQ的时候,调出Terminal是件多么时尚的是事情啊!

再或者,把女朋友的机器拿过来,左手Linux右手Windows,然后装个Synergy,也不失为一种选择。

或者,干脆装个虚拟机吧。

以上是过去式了,现在,我们有了新的选择——Docker。

2 插曲

Ubuntu on Windows都来了,还要啥自行车!Windows里也可以有Linux Shell了。

体验过的老司机说一下(Win10 14316),现在还不!稳!定!

当时我也是天真烂漫,格掉机器,Terminal弹出的一刹那,眼角湿润了!可是,当我装完了QQ等常用软件后发现,系统出错,各种不兼容。只能用Terminal的Windows,你们用过嘛。据说,更新为14367后,好多问题都解决了,还是先不要试了(逃

3 Docker使用四步曲

3.1 下载与安装

访问官方地址:https://www.docker.com/products/docker-toolbox,下载Windows版本的Docker Toolbox。

然后运行安装程序,一路Next即可。

3.2 启动

打开“Docker Quickstart Terminal”即可启动Docker。

经过简单的初始化后,会在Terminal中显示以下内容。需要记下绿色的IP地址,这里是“192.168.99.100”。

3.3 使用

1) Docker自带的Terminal不好用啊,使用Xshell等连接到Docker吧。IP地址使用上一步记来的那个,端口为22,用户名为“docker”,密码为“tcuser”:

2) 拉一个Ubuntu镜像下来,瞬间有了Ubuntu系统有木有:

docker@default:~$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
90d6565b970a: Pull complete 
40553bdb8474: Pull complete 
c3129e7479ab: Pull complete 
091663bd70db: Pull complete 
Digest: sha256:ba1688fec34f66d8a7ff5b42e6971625d8232c72bf0e38ad06dda10cad157293
Status: Downloaded newer image for ubuntu:latest

3) 查看本地有哪些镜像:

docker@default:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              cf62323fa025        2 days ago          125 MB

4) 使用下载的Ubuntu镜像创建一个“虚拟机”(container,即容器)并进入:

docker@default:~$ docker run -it ubuntu bash
root@20b0f4a7e5a3:/#

20b0f4a7e5a3便是创建的容器ID,可以看到,docker@default变成了root@20b0f4a7e5a3,表示我们已经进入到这个容器了。

5) 退出容器(容器将会关闭):

root@20b0f4a7e5a3:/# exit
exit
docker@default:~$

6) 因为容器之前已经创建过了,再次进入无需重复创建,直接启动并进入即可:

docker@default:~$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
20b0f4a7e5a3        ubuntu              "bash"              6 minutes ago       Exited (130) 7 seconds ago                       furious_sinoussi
docker@default:~$ docker start 2
2
docker@default:~$ docker attach 2
root@20b0f4a7e5a3:/#

docker ps -a可以查看所有的容器(包括关闭的),不加-a参数,则只查看启动的容器。执行docker attach 2可以进入到容器2中。对了,2是20b0f4a7e5a3的简写,也可以写20、20b、20b等等。

7) exit可以退出并关闭容器。有时候我们只是想短暂离开一下,稍后还会回去。那就不要用exit了,使用以下命令:

root@20b0f4a7e5a3:/# [在容器里执行CTRL+P+Q临时退出容器]

docker attach 2再次进入容器。

8) 可以在容器里装一些自己常用的软件,比如:

root@20b0f4a7e5a3:/# apt-get install git vim ...

9) 备份这个为自己量身定做的容器吧(制作成镜像):

docker@default:~$ docker export -o myubuntu.tar 2
或
docker@default:~$ docker export 2 > myubuntu.tar

10) 还原之前制作的镜像:

docker@default:~$ docker import myubuntu.tar yang/myubuntu
sha256:452310aef4d809bc410cb2d6a699ab39b9040c410a2580cd382eebed1acf6afe
docker@default:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
yang/myubuntu       latest              452310aef4d8        2 minutes ago       195 MB
ubuntu              latest              cf62323fa025        2 days ago          125 MB

3.4 进阶

1) 有时候我们希望容器在后台运行,而不是直接把命令的结果输出。

docker@default:~$ docker run ubuntu bash -c 'while true; do echo "hi"; sleep 1; done'
hi
hi
hi
...

以上是我们不希望的,我们希望这样:

docker@default:~$ docker run -d ubuntu bash -c 'while true; do echo "hi"; sleep 1; done'
ab6ffafedcbdc70450b8c02b0853534010f68debd7f58b78f46fb2042b857567
docker@default:~$ docker logs -f ab6
hi
hi
hi
...

docker logs可以获取容器的输出信息。

2) 一个容器可以登入多次,也就是开多个终端连接过去:

docker@default:~$ docker exec -it 20b0f4a7e5a3 bash

3) 有时候我们会在容器里起一个服务,比如HTTP。

对于一个已经存在的容器20b0f4a7e5a3,可以这样做:

docker@default:~$ docker stop 20b0f4a7e5a3
docker@default:~$ docker commit 20b0f4a7e5a3 ubuntu01
docker@default:~$ docker run -p 1234:1234 -it ubuntu01 bash

如果还未创建容器,则直接可以:

docker@default:~$ docker run -p 1234:1234 -it ubuntu bash

然后,需要设置VirtualBox的“网络→端口转发规则”选项:

名称 协议 主机IP 主机端口 子系统IP 子系统端口
myweb TCP 127.0.0.1 1234 1234

当容器中启动HTTP服务时,在Windows里访问:http://192.168.99.100:1234/即可。

4) 尽管Linux中的szrz命令可以与Windows互传文件,但还是没有共享一个文件夹来的方便啊。

首先,先在VirtualBox的“共享文件夹→添加共享文件夹”中设置:

  • 共享文件夹路径:X:\win_folder
  • 共享文件夹名称:win_folder
  • 假设win_folder里有3个文件:1.txt、test.mp3、2016.jpg

然后,在Docker里执行以下命令,把共享文件夹win_folder挂到/home/docker/vm_folder下:

docker@default:~$ mkdir -p /home/docker/vm_folder
docker@default:~$ sudo mount -t vboxsf win_folder /home/docker/vm_folder

为了能够让容器访问该共享文件夹,还需要:

docker@default:~$ docker run -it -v /home/docker/vm_folder:/container_folder ubuntu
root@afcf5f504e08:/#

其中,-v参数表示创建一个数据卷,并挂载到容器中。好啦,可以在容器里尽情使用啦:

root@afcf5f504e08:/# cd /container_folder/
root@afcf5f504e08:/# ls
1.txt test.mp3 2016.jpg

参考