欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

在Windows里使用Docker

程序员文章站 2022-06-24 08:50:23
...
<转自https://sanwen8.cn/p/2f88vQh.html>
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:ba1688fec34f66d8a7ff5b42e697****25d8232c72bf0e38ad06dda10cad157293
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'
ab6ffafedcbdc70450b8c02b0853****010f68debd7f58b78f46fb2042b857567
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中的sz和rz命令可以与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
参考

http://core0.staticworld.net/images/article/2014/10/docker_windows-100525105-primary.idge.jpg

https://www.zhihu.com/question/422****24/

https://zh.wikipedia.org/zh-cn/Docker_(軟體)

https://www.gitbook.com/book/yeasy/docker_practice/details

http://tuhrig.de/mount-windows-folder-to-boot2docker-vm/