docker是什么
官方解释
docker是一个开源的容器应用引擎,基于go语言。我们可以用docker部署出一个个的容器,每一个容器可以看作是一个虚拟的系统。这就类似于我们在我们的电脑上安装了虚拟机(比如centos,Ubuntu等),只是docker性能更强,占用空间更少,并且拥有更丰富的功能。
个人理解
如果重装过系统,或者安装过虚拟机都知道,所谓安装系统都需要一个镜像,这个镜像可以是官方提供的原版镜像,也可以是某些人制作了预装了某些软件的ghost镜像;而使用docker部署容器,也需要镜像,这些镜像也是可以是纯正的系统文件,也可以是预装了软件的镜像,我们使用预装了软件的镜像部署出来的容器,容器就有那个软件,甚至启动容器后会自动运行那个软件,比如一个redis的镜像可以直接运行出一个redis服务的容器,而不需要我们去容器中下载安装部署redis;一个镜像甚至可以快速部署出多个容器;比如你只需要咔咔咔,就可以快速部署出多个redis服务。
docker和传统VM有什么不同
从理论上说Docker Container概念并不新鲜,各种虚拟机也起着类似的作用。Docker Container和普通的虚拟机Image相比,最大的区别是它并不包含操作系统内核,它和宿主机共用一套操作系统内核。
Docker 的作用
现实中,我们要海运各种不同的货物,比如火车,汽车,大型器械,或者其他各种小件商品,如果直接把他们丢到船上,会出现这些商品随地滑落,并且不便整理,为了解决这个问题,我们发明了集装箱。
简单的说Docker是一个构建在LXC之上的,基于进程容器(Processcontainer)的轻量级VM解决方案。Docker的初衷也就是将各种应用程序和他们所依赖的运行环境打包成标准的container/image,进而发布到不同的平台上运行。
那么docker的作用有哪些呢?
- Docker解决了运行环境和配置问题,方便发布,也就方便做持续集成。,比如同一份代码在我这边明明可以正常运行,但是到你那边却出现了问题。这可能就是环境问题了。如果用docker的话,将整个环境都一起打包过去,那么不存在环境问题了。
- 更轻量的虚拟化,节省了虚拟机的性能损耗。
docker的结构
核心概念
- 镜像
类似于安装系统的ISO文件/ghost文件,各种软件和应用的集成。 - 容器
类似于虚拟机,是镜像部署以后出来的东西。 - 仓库
存放镜像的一个场所,我们可以从这个仓库中获取各种各样的镜像文件;它有公共仓库和私有仓库,公共仓库是docker公司自己的仓库,私有仓库我们可以自己搭建。
架构
相比普通虚拟机,docker省去操作系统,整个层级简化;普通虚拟机基于虚拟化的硬件平台,而docker则是直接在宿主平台上运行各种应用。其本质是在底层使用LXC启动一个Linux Container,通过cgroup/namespace等机制对不同的container内运行的应用程序进行隔离,权限管理和quota分配等每个container拥有自己独立的各种命名空间(亦即资源)包括:PID进程, MNT文件系统, NET网络, IPC, UTS主机名等。
docker的安装
- 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
- 创建目录并且添加daemon.json文件
sudo mkdir /etc/docker
vim /etc/docker/daemon.json
{
"storage-driver": "devicemapper"
}
- 启动docker
sudo systemctl start docker
- 重看docker是否启动成功和docker信息
sudo docker info
运行一个docker实例
例子:运行一个apache服务器的容器,查看实例,并且进入容器中。
- 使用httpd的镜像运行一个Apache服务器容器
docker run -d -p 8020:80 httpd
-- 这里的-p 8020:80
是指把docker容器中的Apache服务器的80端口映射到本机的8020端口。 - 查看实例
docker ps
[root@centos _data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
db242c680ba9 httpd "httpd-foreground" 2 days ago Up 23 hours 0.0.0.0:8020->80/tcp pedantic_franklin
-- 已经可以看到一个container_id为db242c680ba9的httpd镜像容器在运行。
- 进入容器并且查看
docker exec -it db242c680ba9 bash
-- 我们都说docker容器是一个轻量级的虚拟机,用exec命令我们就可以进入这个虚拟机中,如果想退出就是用exec。 - 访问我们开启的Apache服务
ps -aux | grep docker-proxy
-- 宿主机中用该命令查看我们开启docker容器的ip为172.17.0.4。
curl -i 172.17.0.4
-- 访问服务