什么是容器:
容器技术是应用程序封装和交付的核心技术;
容器技术的核心组成:
– 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 //根据镜像文件创建容器