什么是容器:

容器技术是应用程序封装和交付的核心技术;

容器技术的核心组成:
– Cgroups(Control Groups)-资源管理
– NameSpace-进程隔离
– SELinux安全

由于是在物理机上实施隔离,启动一个容器,可以像启动一个进程一样快速;

什么是Docker:

•Docker是一套完整的容器管理系统;
• Docker提供了一组命令,让用户更加方便直接地使用容器技术,而不需要过多关心底层内核技术.

Docker优点:
• 相比于传统的虚拟化技术,容器更加简洁高效;
• 传统虚拟机需要给每个VM安装操作系统;
• 容器使用的共享公共库和程序;

Docker缺点:
• 容器的隔离性没有虚拟化强;
• 共用Linux内核,安全性有先天缺陷;
• SELinux难以驾驭;
• 监控容器和容器排错是挑战;

安装前准备:
• 需要64位操作系统
• 至少RHEL6.5以上的版本,强烈推荐RHEL7
• 关闭防火墙(不是必须)

安装Docker:

下载光盘:RHEL7OSP-extras.iso

[root@docker1 ~]# yum -y install docker
[root@docker1 ~]# systemctl restart docker             //重启服务
[root@docker1 ~]# systemctl enable docker            //设置开机自启

什么是镜像:

• 在Docker中容器是基于镜像启动的;
• 镜像是启动容器的核心;
• 镜像采用分层设计;
• 使用快照的COW技术,确保底层数据不丢失;

Docker hub镜像仓库:
• https://hub.docker.com
• Docker官方提供公共镜像的仓库(Registry)

[root@docker1 ~]# docker search busybox               //从公共镜像仓库查找busybox镜像
[root@docker1 ~]# docker search centos                  //从公共镜像仓库查找centos镜像
[root@docker1 ~]# docker search nginx                    //从公共镜像仓库查找nginx镜像

上传和下载镜像:

[root@docker1 ~]# docker help pull               //列出下载命令pull的格式

[root@docker1 ~]# docker search busybox

root@docker1 ~]# docker pull docker.io/busybox        //后面的是镜像的名字NAME

[root@docker1 ~]# docdocker help push               //列出上传命令push的命令格式

[root@docker1 ~]# docker push docker.io/busybox     //官方仓库不允许上传,需部署自定义仓库

导出和导入镜像:

导出镜像(将本地镜像导出为tar文件):

[root@docker1 ~]#docker help  save

[root@docker1 ~]#docker images                   //列出本机的所有镜像

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/busybox   latest              e4db68de4ff2        5 days ago          1.224 MB

[root@docker1 ~]#docker  save  docker.io/busybox:latest  -o  /root/busybox.tar       //要导出的镜像是REPOSITORY(名称):TAG(标记),-o选项后面跟导出镜像的tar包路径和名字 



导入镜像(通过tar包文件导入镜像):

[root@docker1 ~]#docker help load                //查看导入镜像命令格式

[root@docker1 ~]#docker load -i /root/busybox.tar    //通过tar包文件导入镜像

[root@docker1 ~]#docker images              //查看镜像是否导入成功

启动镜像(会生成一个容器):

[root@docker1 ~]# docker images

[root@docker1 ~]#docker run -it docker.io/busybox:latest   /bin/bash             //-it中选项<i>代表的是交互式,<t>指终端,/bin/bash容器内的解释器,与真机无关,含义是:以解释器/bin/bash开启一个交互式终端容器busybox,如果不知道解释器是哪个也可以不用写

//这种方式创建容器会直接进入容器,退出需要ctrl+P+Q,因为这是以上帝的身份进入的,exit退出会杀死上帝进程,导致容量损坏,数据全部丢失.

root@docker1 ~]#docker  ps         //显示正在运行的容器信息,包括容器ID

root@docker1 ~]#docker exec -it  容器id  解释器              

root@docker1 ~]#docker exec -it   1c7c07ebe852     sh        //这种方式是以子进程的方式进入的,退出可以使用ctrl+D或者exit

新生成的容器需要安装的基本命令:

root@docker1 ~]#yum -y install net-tools  vim  iproute  lftp  psmisc  tree                //需要先搭建yum源

Docker基本命令:

命令列表:
– docker run      //运行容器
– docker ps        //查看容器列表
– docker stop       //关闭容器
– docker start      //启动容器
– docker restart      //重启容器
– docker attach|exec          //进入容器
– docker inspect          //查看容器底层信息
– docker top     //查看容器进程列表
– docker rm       //删除容器, <-f> 强制删除

举例说明:

root@docker1 ~]#docker images             //查看镜像列表

root@docker1 ~]#docker history docker.io/busybox:latest      //查看镜像文件的更改历史

root@docker1 ~]#docker run -itd docker.io/nginx:latest            //创建一个nginx容器,<d>让其在后端运行

root@docker1 ~]#docker ps                        //可以docker容器的ID号

root@docker1 ~]#docker ps -a                   //查看所有的容器,包括运行的和已经关闭的

root@docker1 ~]#docker ps -aq                  //仅显示容器id

root@docker1 ~]#docker rm $(docker ps -aq)       //删除所有的容器,docker支持命令的执行结果作为下一条命令的参数

root@docker1 ~]#dpcler exec -it  ef5dc96cb638(容器ID)    /bin/bash             //用bash解释器进入nginx容器内部

root@docker1 ~]# docker inspect 810ebeb61f43           //可以看到容器的IP地址,网关,MAC地址.最后的ID号也可以只写前几个符号,只要跟其他的ID没有重复就可以

root@docker1 ~]#docker pull  docker.io/nginx:latest           //下载镜像

root@docker1 ~]#docker push docker.io/nginx:latest           //上传镜像

root@docker1 ~]#docker rmi -f docker.io/busybox:latest          //删除镜像,<-f>指的是强制删除.容器启动时删除镜像会提示错误,可以加<-f>强制删除

root@docker1 ~]#docker  tag  docker.io/nginx:latest  nginx:test       //更改名字和标签,前面的改为后面的



docker commit(创建新镜像):

上面提到一个命令history, 它可以查看一个镜像之前经历过几次修改,,docker commit作用是在容器基础上修改,另存为一个新镜像.

root@docker1 ~]#docker run -it docker.io/centos         //修改(增删改数据、安装软件、修改配置文件等)

root@docker1 ~]#docker commit  8d07ecd7e345(ID)   mycentOS:test         //生成新的镜像mycentOS

使用Dockerfile创建镜像文件:

Dockerfile语法格式:
– FROM:基础镜像
– MAINTAINER:镜像创建者信息
– EXPOSE:开放的端口
– ENV:设置变量
– ADD:复制文件到镜像
– RUN:制作镜像时执行的命令,可以有多个
– WORKDIR:定义容器默认工作目录
– CMD:容器启动时执行的命令,仅可以有一条CMD

dockerfile案例:

[root@docker ~]# mkdir   docker_build                //创建dockerfile的存放目录

[root@docker ~]# cd  docker_build

[root@docker docker_build]#vim  dockerfile          //这个文件名字不能改变

FROM   mycentos:test                     //要创建的镜像来源哪个镜像 
ADD   local.repo   /etc/yum.repos.d/local.repo              //将本机的local.repo文件添加到容器中
RUN   yum -y install vim net-tools iproute psmisc tree lftp            //在容器中运行命令
RUN   yum -y install httpd
WORKDIR  /var/www/html                         //默认是不会保留上一条命令切换的目录的,workdir让后面的命令在这个目录下操作
ADD   index.html index.html
EXPOSE  80                                                //开放80端口
EXPOSE  443                                              //开放443端口
ENV   EnvironmentFile=/etc/sysconfig/httpd            //定义环境变量
CMD  ["/usr/sbin/httpd","-DFOREGROUND"]             //最原始的启动服务的命令
[root@docker docker_build]#docker  build  -t  file_centos:redhat  .       //创建镜像mycentos标签为redhat



启动服务的最初始命令的路径(dockerfile的CMD经常使用):

[root@docker ~]# ls  /usr/lib/systemd/system/httpd.service             //例如apache服务的启动文件

EnvironmentFile=/etc/sysconfig/httpd                            //环境变量
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND           //实际启动命令
[root@docker ~]#echo  $OPTIONS         //发现这个变量实际是空的,所以在dockerfile中没有写



自定义私有仓库:

安装私有仓库(服务器):

[root@docker ~]#yum  -y  install  docker-distribution            //安装私有仓库服务器

[root@docker ~]# systemctl restart docker-distribution          //启动服务

[root@docker ~]# systemctl enable docker-distribution           //设置开机自启

[root@docker ~]# netstat  -ntulp                    //查看5000端口启动

测试:

[root@docker ~]# curl http://docker:5000/v2/          //结果出现{ }代表可用

私有仓库配置文件及数据存储路径:

– /etc/docker-distribution/registry/config.yml
– /var/lib/registry

[root@docker ~]# rpm -qc docker-distribution          //也可以通过这条命令查看配置文件位置

客户端配置(此次配置设置docker既是私有仓库的服务器,也是客户端):

[root@docker ~]# vim /etc/sysconfig/docker

13  ADD_REGISTRY='--add-registry docker:5000'        //指明docker私有仓库服务器地址 

24  INSECURE_REGISTRY='--insecure-registry'    //24行,允许非加密方式访问仓库

为镜像创建标签:

– 这里的地址要写 宿主机 的 IP 地址或主机名
– docker tag 镜像:标签 IP:5000/镜像:latest

[root@docker ~]# docker  tag  docker.io/busybox:latest  docker:5000/busybox:latest   //为busybox创建标签

上传镜像:
– 上传镜像的标签内包含地址和端口号
– docker push IP:5000/镜像:latest

[root@docker ~]#docker push docker:5000/busybox:latest     //上传镜像到私有仓库

进入客户端:

[root@client ~]#yum -y install docker            //安装客户端软件

[root@client ~]#vim  /etc/sysconfig/docker        //修改配置文件,跟服务器的修改成一样的内容

13  ADD_REGISTRY='--add-registry docker:5000'        //指明docker私有仓库服务器地址 

24  INSECURE_REGISTRY='--insecure-registry'    //24行,允许非加密方式访问仓库

[root@client ~]#curl http://docker:5000/v2/_catalog         //查看私有仓库里的镜像名,但却没有标签,不好创建容器

{"repositories":["busybox"]}

[root@client ~]# curl  http://docker:5000/v2/busybox/tags/list         //通过上面查到的名字列出标签

{"name":"busybox","tags":["latest"]}

[root@client ~]#docker run -it  docker:5000/busybox:latest           //根据镜像文件创建容器