虚拟化一般分为硬件级虚拟化(hardware-level-virtualization)和操作系统级虚拟化(os-level-virtualization)。硬件级虚拟化是运行在硬件之上的虚拟化技术,它的管理软件需要模拟的就是一个完整的操作系统,也就是我们通常所说的基于Hyper-V的虚拟化技术,VMWare、VirtualBox、Xen和阿里云ESC都是使用这种技术。
操作系统级虚拟化就是运行在操作系统之上的,它模拟的是运行在操作系统上的多个不同进程,并将其封装在一个封闭的容器里面,也称为容器化技术。Docker正是容器虚拟化中目前最流行的一种实现。
现在又大批提供云服务的公司。总的来说,基本可以归为一下几类。
写的多一点,是为了让大家在Docker的路上走的更远,而不是单纯的学一个Hello-World实现。
Docker是基于Go语言实现的云开源项目。
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。
Linux 容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用运行在 Docker 容器上面,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
Docker镜像的设计,使得Docker得以打破过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。
简单一点,解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
传统的虚拟机技术
以前使用虚拟机,可以在一种操作系统里面运行另一种操作系统,但是使用虚拟机也有很多缺点,比如:资源占用多、步骤冗余、启动慢等等。
容器虚拟化技术
Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。
比较了 Docker 和传统虚拟化方式的不同之处:
使用docker的好处:
开发/运维(DevOps)–》一次构建、随处运行。
镜像(image)
Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
容器(container)
Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
Docker | 面向对象 |
---|---|
镜像 | 类 |
容器 | 对象实例 |
最大的公开仓库是 Docker Hub(https://hub.docker.com/),
存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云 等。
总结
需要正确的理解仓储/镜像/容器这几个概念:
Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就似乎 image镜像文件。只有通过这个镜像文件才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
- image 文件生成的容器实例,本身也是一个文件,称为镜像文件。
- 一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器
- 至于仓储,就是放了一堆镜像的地方,我们可以把镜像发布到仓储中,需要的时候从仓储中拉下来就可以了。
参考docker官网安装教程
启动docker
[root@localhost ~]# systemctl start docker
开机启动docker
[root@localhost ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi‐user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
停止docker
[root@localhost ~]# systemctl stop docker
查看docker版本
5. 运行第一个容器
hello-world镜像是Docker官网推荐的第一个学习镜像,他的功能很简单,运行后将输出一段日志在终端上。
[root@zxg /]# docker run hello-world
这条命令包含了三部分:
这条命令首先会在本地查找是否有hello-world这个镜像,如果没有,则会自动从Dockerhub(Docker主仓库 https://hub.docker.com
)去拉取,之后会启动一个程序,并把镜像装载进容器中运行。
Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器,是一个运行时环境,就是我们前面说到的集装箱。
docker有着比虚拟机更少的抽象层。由于docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
docker利用的是宿主机的内核,而不需要Guest OS。因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返个过程,因此新建一个docker容器只需要几秒钟。
Docker容器 | 虚拟机(VM) | |
---|---|---|
操作系统 | 与宿主共享OS | 宿主机OS上运行虚拟机OS |
存储大小 | 镜像小,便于存储与传输 | 镜像庞大(vmdk、vdi等) |
运行性能 | 几乎无额外性能损失 | 操作系统额外的CPU、内存消耗 |
移植性 | 轻便、灵活、适用于Linux | 笨重,与虚拟化技术耦合度高 |
硬件亲和性 | 面向软件开发者 | 面向硬件运维者 |
所有的Docker的命令格式都如下:
docker [OPTIONS] COMMAND [arg.....]
命令:docker images [OPTIONS] 镜像名
docker images 列出本地主机上的镜像.
OPTIONS说明:
-a :列出本地所有的镜像(含中间映像层)
-q :只显示镜像ID
--digests :显示镜像的摘要信息
--no-trunc :显示完整的镜像信息
docker search 镜像名
在主仓库查找镜像:https://hub.docker.com
命令:docker search [OPTIONS] 镜像名字
OPTIONS说明:
--no-trunc : 显示完整的镜像描述
-s : 列出收藏数不小于指定值的镜像。
--automated : 只列出 automated build类型的镜像;
docker rmi 镜像id 来删除镜像
删除单个镜像: docker rmi -f 镜像ID
删除多个镜像: docker rmi -f 镜像名1:TAG 镜像名2:TAG
删除全部: docker rmi -f $(docker images -qa)
创建并启动容器:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明(常用):有些是一个减号,有些是两个减号
--name="容器新名字": 为容器指定一个名称;
-d: 后台运行容器,并返回容器ID,也即启动守护式容器;
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-P: 随机端口映射;
-p: 指定端口映射,有以下四种格式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
端口映射很有必要,比如下面启动了三个mysql分别映射三个端口。
docker run ‐p 3306:3306 ‐‐name mysql01 ‐e MYSQL_ROOT_PASSWORD=123456 ‐d mysql
docker run ‐p 3307:3306 ‐‐name mysql02 ‐e MYSQL_ROOT_PASSWORD=123456 ‐d mysql
docker run ‐p 3308:3306 ‐‐name mysql03 ‐e MYSQL_ROOT_PASSWORD=123456 ‐d mysql
列出当前所有正在运行的容器:docker ps [OPTIONS]
OPTIONS说明:
-a :列出当前所有正在运行的容器+历史上运行过的
-l :显示最近创建的容器。
-n:显示最近n个创建的容器。
-q :静默模式,只显示容器编号。
--no-trunc :不截断输出。
退出容器:
exit: 容器停止并退出
ctrl+P+Q: 容器不停止退出
启动容器: docker start 容器ID或者容器名
重启容器: docker restart 容器ID或者容器名
停止容器: docker stop 容器ID或者容器名
强制停止容器: docker kill 容器ID或者容器名
删除已停止容器: docker rm 容器ID
一次性删除多个容器:
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
**启动守护式容器** : docker run -d 容器名
Docker容器后台运行,就必须有一个前台进程,将要运行的程序以前台进程的形式运行。
查看容器日志:docker logs -f -t --tail 容器ID
-f 跟随最新的日志打印
-t 加入时间戳
--tail 数字 显示最后多少条
查看容器内运行的进程:docker top 容器ID
查看容器内部细节:docker inspect 容器ID
进入正在运行的容器并以命令行交互:
docker exec -it 容器ID bashShell
docker attach 容器ID
以启动redis容器为例,进入交互模式
首先创建并启动一个redis容器
查看容器
平时使用国外的镜像下载速度太慢,可以改用阿里云镜像加速。
相关博客
(二) Docker 镜像与容器的区别与存储结构
(三) Docker容器数据卷 详细讲解
(四) Docker之Dockerfile编写与指令解析,自定义镜像实战