为什么 出现docker
在上面这幅图,我们看到了,docker容器的优势,简单点数说,就是 解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术
之前的虚拟机(virtual machine)就是带环境安装的一种解决方案。
它可以在一种操作系统里面运行另一种操作系统,比如在Windows 系统里面运行Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。
graphic
虚拟机的缺点:
1 资源占用多 2 冗余步骤多 3 启动慢
便笺
由于前面虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。
Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
graphic
比较了 Docker 和传统虚拟化方式的不同之处:
*传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
*而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
- 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
Docker的简介
Docker时Docker.Lnc公司开源的一个基于LXC技术之上搭建的Container容器引擎,源代码托管在Github上,基于Go语言并遵从Apache2.0协议开源。
Docker属于Linux容器的一种封装,提供简单易用的容器使用接口。
Docker将应用程序与该程序的依赖,打包在一个文件里面。这个文件就 Dockerfile运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了Docker,就不用担心环境问题。
特性 :
在docker的网站上提到了docker的典型场景:
- Automating the packaging and deployment of applications(使应用的打包与部署自动化)
- Creation of lightweight, private PAAS environments(创建轻量、私密的PAAS环境)
- Automated testing and continuous integration/deployment(实现自动化测试和持续的集成/部署)
- Deploying and scaling web apps, databases and backend services(部署与扩展webapp、数据库和后台服务)
这里我们先理解几个概念 :
容器(Container)
谈到容器这里可不是 装东西的容器,在这里容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。
容器镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
换句话说,镜像就是进程,容器就是线程,线程是进程的最小的执行单元,而 容器就是镜像的最小执行单元, 容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
镜像(Image)
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
通过运行images启动容器,一个images是一个可执行的包,其中包括运行应用程序所需要的所有内容-代码,运行时,库、环境变量和配置文件。
以Java类为比喻,镜像就好比Java写好的类,容器就是Java类实例化后的对象,创建容器之前必须有镜像. 根据 镜像创建容器
仓库(Repository)
Docker 仓库是用来包含镜像的位置,Docker提供一个注册服务器(Register)来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像。
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。 这里我们会讲到 Dockerhub
Docker hub是docker公司维护的公共仓库,用户可以免费使用,也可以购买私有仓库。
Docker的安装
- Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。
通过 uname -r 命令查看你当前的内核版本
uname -r
- 使用 root 权限登录 Centos。确保 yum 包更新到最新。
sudo yum update
- 卸载旧的 (如果安装过旧版本的话)
sudo yum remove docker docker-common docker-selinux docker-engine
- 安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 设置yum源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 可以查看所有仓库中所有docker版本,并选择特定版本安装
yum list docker-ce --showduplicates | sort -r
- 安装docker
sudo yum install docker-ce #由于repo中默认只开启stable仓库,故这里安装的是最新稳定版17.12.0
sudo yum install <FQPN> # 例如:sudo yum install docker-ce-17.12.0.ce
- 启动加上开机自启动
sudo systemctl start docker
sudo systemctl enable docker
不想 自启动的话 那就
service start docker
查看是否安装成功
docker version
安装过后的配置文件
cat /etc/sysconfig/docker
现在 Docker的镜像拉取速度有点慢 我们改下配置
编辑该文件: vi /etc/docker/daemon.json 修改配置 // 如果该文件不存在就手动创建;说明:在centos7.x下,通过vi。
输入下面内容,如果存在就用逗号隔开,在加一个
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
常用操作
查看容器
docker ps 查看正在运行的容器
docker ps -a 查看所有的容器
docker ps -l 查看最后一次运行的容器
docker ps -f status=exited 查看停止的容器
删除镜像
docker rmi IMAGE_ID 删除指定镜像
docker rmi `docker images -q` 删除所有镜像
删除容器
(注意这里不要搞混, 根据镜像运行容器,一个镜像可以运行多个容器),当初我就是镜像容器傻傻分不清
docker rm $CONTAINER_ID/NAME 删除指定的容器(只能删除停止的容器)
docker rm $CONTAINER_ID/NAME -f 表示强制删除
docker rm `docker ps -a -q` 删除所有的容器
部署应用 以mysql为例
当然这里也可以指定版本 例如 docker pull mysql:latest 表示最新版
拉取镜像
docker pull mysql
查看镜像
docker images
docker run -di --name demo_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
上面命令 参数说明:
创建容器命令:docker run
- -i:表示运行容器
- -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
- –name :为创建的容器命名。
- -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
- -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射