前言:
什么是docker镜像
从整体的角度来讲,一个完整的Docker镜像可以支撑一个
Docker容器的运行,在Docker容器运行过程中主要提供文件系
统视角,例如,一个ubuntu14.04的镜像,提供了一个基本的
ubuntu:14.04的发行版本,当然此镜像是不包含操作系统 Linux
内核的,它和真实主机是公用一个系统内核的。
Docker简介:
Docker是在Linux容器里运行应用的开源工具,是一种轻量级的虚拟化
方式,Docker的设计宗旨是通过对应用软件的封装、发布、部署、
运行等生命周期的管理,达到应用组件级别,一次组装,多次使用,
的目的,这里的组件可以是一个应用,也可以是一套服务,甚至
可以是一个完整的操作系统,
Docker的优势:
Docker的容器技术可以在一台主机上轻松地为任何应用创建个轻量级
的、可移植的,自给自足的容器,通过这种容器打包应用程序,
简化了重新部署,调试这些琐碎的重复工作,极大的提高了工作效率
采用Docker容器技术,迁移只需要在新的服务器上启动需要的
容器即可。
Docker容器很快,启动和停止在妙级实现,比传统的虚拟机
要快的多。
Docker核利用容器来实现类似VM的功能,从而以更加节省的
硬件资源提供,使得在一台主机上同时运行数干个Docker容器
成为可能。
Docker操作简单,还可以通过Dockerfile配置镜像文件,支持
灵活的自动化创建和部署。
Docker核心概念
镜像(image)
Docker的镜像是创建容器的基础,类似虚拟机的快照
可以理解为是一个面向Docker容器引擎的只读模版
比如,一个镜像可以是一个完整的centos操作系统,也可以
是一个安装了Mysql的应用程序,称之为一个镜像,镜像
文件用户可以自己创建和更新现有的镜像,也可以从网上
下载已经做好的应用镜像直接使用,
正文:
一、进行docker的安装
[root@server1 ~]# yum install -y * ###进行软件和依赖性的安装
进行服务的启动和开机自启设定:
systemctl start docker ###进行服务的开启
systemctl enable dokcer ###进行服务的开启自启
docker info ###进行docker信息的查看
进行软件的安装,使得docker命令运行时可以使用table进行自动补齐:
yum install bash-* -y ###进行软件的安装
使用公网进行镜像的拉取:(使得虚拟机可以进行上网)
docker search nginx ###进行nginx镜像的搜索
docker pull nginx ###进行nginx镜像的获取
也可以使用网络源进行镜像的下载:
vim /etc/docker/daemon.json ###进行网络下载镜像文件的创建
systemctl daemon-reload
systemctl restart docker
该地址可以在aliyun上进行获取,
进行镜像的导入(在aliyun上进行地址的获取)
[root@server1 docker]# docker pull /what_oo/game2048
[root@server1 docker]# docker images
进行镜像的启动:
[root@server1 docker]# docker run -d -p 80:80 --name vm1 game2048
netstat -antlp ###进行端口的查看
在浏览器上进行查看:
进行ubuntu镜像的导入:
docker load -i ubuntu ###进行docker镜像的导入(ubuntu镜像包已经下载)
docker images ###进行docker当前拥有镜像的查看
docker run -it --name ubuntu ###进行ubuntu镜像的运行
进入到ubuntu中进行内核信息的查看
在真机上进行系统内核的查看:
两者的内核信息相同,可见两者公用一个内核。
进行ubuntu中信息的查看:
ip addr show ###进行ubuntu中ip的查看
crtl+p+q ###是该镜像在后台进行运行
docker inspect vm1 ###进行vm1元数据的查看
我们使用ubuntu再次开启一个docker
docker run -it --name vm2 ubuntu ###进行ubuntu镜像进程的开启
ip addr show ###进行ip的查看(与vm1相比ip是进行递增的)
在物理机上进行当前运行容器的查看
docker ps ###查看当前运行的容器
进行容器的关闭和拉起:
在容器中使用按键 Crtl+d 进行容器进程的退出
docker ps ###进行当前运行容器的查看
docker starr vm2 ###进行容器的开启
docker attach vm2 ###进行容器进行的拉起
进行容器的删除:
docker ps -a ###查看当前所有容器(启动和停止的)
docker rm vm2 ###进行vm2容器的删除
docker ps -a ###进行所有容器的再次查看
docker的镜像分层:
docker里的镜像绝大多数都是在别的镜像的基础上进行创建
的,也就是使用镜像的分层结构。
一个docker镜像是由多个可读的镜像层组成的,然后运行的
容器会在这个docker的镜像上面多加一层可写的容器层,任何
的对文件的更改只存在在此容器层,因此任何对容器的操作均
不会影响到镜像。
如何实现:
至于容器是如何获取镜像层文件而又不影响到镜像层的呢?docker是这样
实现的,如果需要获取某个文件,那么容器就会从上到下去下一层的镜像
中进行文件的拉取,如果该文件不存在,那么就会去下一个镜像去寻找,
直到最后一层,对用户而言,用户面向的是一个叠加的文件系统。而任何
对于文件的操作都会记录在容器层,例如修改文件,容器层会把镜像文件
拷贝到容器层里面进行修改,删除文件则会在容器层内记录删除文件的记录,
使用docker分层结构的优势:
其一:基本上每个软件都是基于镜像去运行的,因此,一旦某个底层环境出现了问题,就不
需要去修改全部基于该镜像软件的镜像,只需要修改底层环境的镜像。
其二:可以进行资源的共享,其他相同环境的软件镜像都共同去享用
一个环境镜像,而不需要每个软件镜像都要创建一个底层环境。
我们进行已有镜像层数的查看:(以ubuntu为例)
[root@server1 docker镜像]# docker history ubuntu:latest ###进行镜像层数的查看
在ubuntu镜像的基础上进行容器的建立
docker run -it --name vm2 ubuntu ###进行容器的建立
在容器中:
touch /mnt/file{1..10}
Ctrl+p+q进行容器的后台运行
[root@server1 docker镜像]# docker commit -m 'add files' vm2 ubuntu:v1
###进行镜像的提交
docker history ubuntu:v1 ###进行镜像层数的查看
进行镜像容器的创建和容器中文件的创建
进行镜像的提交和镜像层数的查看:
我们发现该镜像的层数比我们最初ubuntu镜像多了一层,该层就是我们在ubuntu层数
的基础上进行提交的,因此它会增加一层。
当容器vm2损坏时,我们可以通过镜像文件来恢复。
实验:进行vm2容器的删除,使用ubuntu:再次建立新的容器
[root@server1 docker镜像]# docker stop vm2
[root@server1 docker镜像]# docker rm vm2 ###进行容器vm2的删除
[root@server1 docker镜像]# docker ps -a
使用新提交的镜像进行容器的创建
docker run -it --name vm2 ubuntu:v1
ls /mnt/ ###进行文件的查看
进行文件的删除和镜像的提交
[root@server1 docker镜像]# docker commit -m 'rm files' vm2 ubuntu:v2 ###提交镜像
[root@server1 docker镜像]# docker history ubuntu:v2 ###进行镜像层数的查看
我们发现相比之前的层数,新提交的镜像层数有多了一层,通过镜像的层级结构,我们可以很
容易的恢复丢失或者损坏的数据。