Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Dockert使你的运维成本降低,并且更容易管理您的项目,很多人可能对于Docker认为就是简化的虚拟机?但是其实不然,
容器(Docker)其实是一种沙盒技术。顾名思义,沙盒就是能够像一个集装箱一样把你的应用‘装’起来,这样,应用和应用之间就因为有了边界而不至于互相干扰;而且被撞到集装箱的应用也可以被到处搬来搬去;
作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机方式相比具有显著优势:
特性 | 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
硬盘使用 | 一般为MB(最小容器2.67MB) | 一般为GB |
性能 | 接近原生 | 弱于原生 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
假设你已经有一个Ubuntu操作系统,并且运行了Docker
接下来创建一个容器:
docker run -it busybox /bin/sh
-it 参数告诉了Docker项目在启动容器后,需要给我们分配一个文本输入输出环境,即TTY,跟容器的标准输入相关联,这样我们就可以和这个Docker容器进行交互了。而 /bin/sh
就是我们Docker容器中运行的程序。
这样,我的服务器就变成了宿主机,而一个运行着/bin/sh
的容器就在这个宿主机里运行。
对于上面的例子和原理,如果你已经玩过Docker,相比不会陌生,此时,如果在容器中执行ps
就会发现有趣的事情:
可以看到,在Docker里最开始执行的/bin/sh
就是这个容器内部的第一好进程(PID =1),
而这个容器一共有俩个进程在运行,这就意味着,前面执行的/bin/sh
以及ps,已经被Docker隔离在一个跟宿主机完全不同的世界。
本来,每当我们在宿主机上运行一个/bin/sh
程序,操作系统都会给它分配一个PID(进程号),比如PID=100 。这个编号是进程的唯一标识,就像是你的身份证一样。
现在,我们要通过Docker
在容器当中运行这个/bin/sh
程序,这时,Docker就会在这个100号创建的时候给他施展一个'障眼法',让他永远看不到前面的99的进程,这样它就会误认为自己就是1号进程。
这种机制其实就是对被隔离的应用的进程空间动手脚,使得这些进程只能‘看到‘重新计算过的PID,比如PID=1,可实际上,在宿主机的操作系统里它还是100号进程。
这种技术技术Linux 中的 Namespace
机制。Namespace
的使用方式也很有意思:它其实只是Linux创建新进程的一个可选参数。
安装命令如下
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
或者使用国内 daocloud 一件安装
curl -sSL https://get.daocloud.io/docker | sh
注:如果存在旧版本请先卸载
sudo apt-get remove docker docker-engine docker.io containerd runc
docker tag <image> <repository>:<tag> # 标记镜像
docker pull <repository>:<tag> # 从docker hub下载镜像
docker rmi <image> # 删除镜像
docker images # 查看镜像
docker run -d -p 8080:8080 <image> # 启动容器
docker ps # 查看容器
docker exec -it <container> bash # 在容器中执行命令
docker stop <container> # 停止容器
docker rm <container> # 删除容器
docker rmi <image> # 删除镜像
docker images -a # 查看所有镜像
docker images -f "dangling=true" # 查看未使用的镜像
docker images -f "dangling=true" -q # 查看未使用的镜像id
docker images -f "dangling=true" -q | xargs docker rmi # 删除未使用的镜像
docker images -f "dangling=true" -q | xargs docker rmi -f # 强制删除未使用的镜像
docker images -a | grep <image> # 查看镜像是否存在
docker images --help # 查看docker images命令帮助
docker image prune # 删除未使用的镜像
docker iamge # 查看镜像
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器(包括未运行的容器)
docker stop 容器名称|容器id # 停止容器
docker rm 容器名称|容器id # 删除容器
docker rmi 镜像名称|镜像id # 删除镜像
docker run -d -p 80:80 --name=nginx nginx # 启动容器
docker exec -it 容器名称|容器id /bin/bash # 进入容器
docker system prune -f # 强制删除build缓存
本文为从零开始写 Docker 系列第十六篇,利用 linux 下的 Veth、Bridge、iptables 等等相关技术,构建容器网络模型,为容器插上”网线“。