Docker - 虚拟化系统
2016-08-10
和虚拟机的不同之处就是,虚拟机是在硬件层面的模拟,而 Docker 是用系统提供的软件容器接口来实现模拟, Docker 占用资源比虚拟机要小。
但是 Docker 在 Mac 下的体验并不好,一天之内遇到了好几次 crashed. 而且容器内访问主机的文件速度非常慢。
各个教程讲得都很详细,什么是镜像,什么是容器,怎么使用等等,我就不重复了,没什么意义。 我只记录一下我自己的使过程,方便以后查看。
-
去 Docker 仓库: https://hub.docker.com/ 找到想要的镜像
-
获取镜像
docker pull ubuntu:14.04
-
列出本地的所有镜像
docker images
-
基于这个镜像启动和创建一个容器
-i
参数表示打开容器的标准输入
-t
参数表示分配一个伪终端并绑定到容器的标准输入上,这样我们可以通过终端和容器进行交互
bash
让容器运行这个命令docker run -it ubuntu:14.04 bash
-
使用
exit
命令退出容器,容器中指定的应用终结时,容器也自动终止,所以我们退出终端,容器就自动终止了 -
查看已经终止的容器
docker ps -a
-
重新启动容器
docker start bd8259c5f77d
-
再次和这个容器进行交互
docker exec -it bd8259c5f77d bash
-
将这个容器的修改提交,生成一个新的镜像
docker stop bd8259c5f77d docker commit bd8259c5f77d some-image-name:v0.1
实际操作
-
获取或者更新镜像
docker pull ubuntu:14.04
-
列出本地的所有镜像
docker images
-
创建一个容器,并且通过终端进行交互
docker run -it ubuntu:14.04 bash
-
在容器中配置一些环境,安装 MySQL, Ruby 等
apt-get update apt-get install mysql-server mysql-client libmysqlclient-dev ...
-
提交修改,生成新的镜像。
72d0d8a85e18
可通过docker ps -a
来查看docker commit -m "some messages" -a "author" 72d0d8a85e18 some-image-name:0.1
-
从新的镜像运行,映射端口,挂载主机文件夹
docker run -it -v host-code-dir:/root/Code -p 53306:3306 some-image-name:0.1 bash
-
如果我们还需要在镜像运行的使用启动 MySQL 等,可以这么做
-
建立启动脚本
vi /root/start.sh
例如需要启动 MySQL 和 Bash
#!/bin/bash /etc/init.d/mysql start /bin/bash
-
赋予可执行权限
chmod +x /root/start.sh
-
下次可以这么启动镜像
docker run -it -v host-code-dir:/root/Code -p 53306:3306 some-image-name:0.1 /root/start.sh
-
-
修改了一些东西再次提交
-
我们可以通过
docker history IMAGE
来查看提交的信息,
如果我们需要导出镜像,直接使用docker save
会将提交的所有信息保留,有时候我们不希望这么做, 我们希望导出最后的版本,不要附加提交的所有信息参考:http://tuhrig.de/flatten-a-docker-container-or-image/
docker run IMAGE docker export <CONTAINER ID> | docker import - some-image-name:0.2
-
导出镜像
docker save -o some-image-name-0.2.tar some-image-name:0.2
-
导入镜像
docker load --input some-image-name-0.2.tar
一些有用的命令
-
停止所有的容器
docker stop $(docker ps -a -q)
-
删除所有的容器
docker rm $(docker ps -a -q)