容器:简单来说它就是对应用程序封装和交付;它的技术核心有3个内核技术组成(NameSpace进程隔离:把一个进程放在独立的内存空间里,隔离进程。CGroups命名空间:内核级的资源管理控制器。SELinux)。容器和物理机是相通的,它是工作在物理机上。
Docker是一套完整容器管理系统,它提供了一系列命令可以让用户更方便直接的使用而不需要关心底层内核技术。
|---镜像 相当于启动一个实例用的文件,是启动容器的核心,它是一个静态的可以被用户互相分享的文件
Docker -----|---容器 就是一个运行的实例,也可以理解为镜像的动态的状态,我们通过它来操作和管理
|---仓库 主要是存放镜像的仓库,Docker官方提供的公共镜像仓库叫(Registry)
镜像采用分层设计,使用快照的COW技术(写时复制)确保底层数据不丢失。使用联合加载,联合mount的技术挂载。前端具有读写功能,后端只读。
Docker只能运行在Linux7以上或者CentOS6及以上版本,内核3.1.0以上,64位操作系统上
安装Docker平台所需要的软件(如果镜像没有需要单独下载)
– docker-engine
– docker-engine-selinux
Docker镜像基本命令(后都跟名字:标签)
– docker images //查看镜像列表
– docker history //查看镜像制作历
– docker inspect //查看镜像底层信息(了解镜像环境变量、存储卷、标签等信息)
– docker pull //下载镜像
– docker push //上传镜像
– docker rmi //删除本地镜像(启动容器时删除镜像会提示错误)
– docker save //镜像另存为tar包
– docker load //使用tar包导入镜像
– docker search //搜索镜像
– docker tag //修改镜像名称和标签
[root@KD ~]# docker images
镜像仓库名称 标签 镜像ID号 创建时间 大小
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 980e0e4c79ec 8 months ago 196.7 MB
• 保存本地镜像另存为tar文件,方便其他人使用tar包导入镜像
[root@KD~]# docker save centos > centos.tar
• 使用tar包文件导入镜像
[root@KD ~]# docker load < centos.tar
• 重命名镜像名称(相当于复制)
[root@KD ~]# docker tag centos:latest(源) test:v1(目标)
Docker容器基本命令(后都跟ID号)
– docker run //运行容器(常用的3参数:-i 交互式,-t终端,-d后台进程 非交互式;it常一起用,d常单独用)
– docker ps //查看容器列表(常用参数:-a显示所有, -p显示容器ID号)
– docker stop //关闭容器
– docker start //启动容器
– docker restart //重启容器
– docker attach|exec //进入容器
– docker inspect //查看容器底层信息
– docker top //查看容器进程列表
– docker rm //删除容器
• 进入容器
– docker attach 进入容器,exit会导致容器关闭,按ctrl+p,然后松开p在按q,ctrl一直不松 可以退出容器不关闭
– docker exec -it 进入容器,退出时不会关闭容器
自定义镜像和仓库
在使用镜像启动容器后,在改镜像的基础上进行修改,然后在另存为另一个镜像。
docker commit 旧容器ID 新镜像名:新标签
使用Dockerfile文件自定义镜像Dockerfile文件格式
– FROM:基础镜像
– MAINTAINER:镜像创建者信息
– EXPOSE:开放的端口
– ENV:设置变量
– ADD:复制文件到镜像(此文件是和Dockerflie在一个目录里的文件)
– RUN:制作镜像时执行的命令,可以有多个
– WORKDIR:定义容器默认工作目录
– CMD:容器启动时执行的命令,仅可以有一条CMD
使用Dockerfile工作流程
– mkdir build
– cd build
– vim Dockerfile
– docker build -t imagename Dockerfile //imagename是新镜像的名称:新标签
registry基本概念:共享镜像的一台服务器(镜像化的一台服务器)
流程:
1、docker pull registry //创建自定义私有仓库
2、[root@KD]# vim /etc/docker/daemon.json //创建配置文件写服务器的地址,让它使用http传输,不用https传输,因为默认会用https传
{
"insecure-registries" : ["192.168.4.10:5000"]
}
3、systemctl restart docker //重启docker服务
4、docker run -d -p 5000:5000 registry //后台启动自定义私有仓库,并把容器5000端口绑定到物理机5000端口
5、docker tag mycentos:latset 192.168.4.10:5000/mycentos:latset //打标签(相当于告诉它把那个镜像传到那里去)
6、docker push 192.168.4.10:5000/mycentos:latset //上传镜像到自定义仓库
测试:
1、[root@KD]# vim /etc/docker/daemon.json //创建daemon配置文件写服务器的地址,让它使用http传输,不用https传输,因为默认会用https传
{
"insecure-registries" : ["192.168.4.10:5000"]
}
2、systemctl restart docker //重启docker服务
3、docker run -it 192.168.4.10:5000/mycentos:latset //用服务器上的镜像启动容器
查询私有仓库里面的镜像:
1、能ping同私有仓库地址
2、curl http://私有仓库IP地址:5000/v2/_catalog 查看私有仓库里面有那些镜像(v2是版本)
3、curl http://私有仓库IP地址:5000/v2/镜像名称/tags/list 查看私有仓库镜像有那些标签(v2是版本)
持久化存储
docker容器不保持任何数据
• 重要数据请使用外部卷存储(数据持久化)
• 容器可以挂载真实机目录或共享存储为卷
将真实机目录挂载到容器中提供持久化存储
[root@KD ~]# docker run -v /data:/data -it centos bash (-v 物理机文件加:容器里文件夹)
备注:主机文件夹映射到容器文件夹会清空容器里文件夹的数据,主机的文件【可以是挂载的其它服务的共享数据】
一台共享存储服务器可以提供给所有Docker主机使用
• 共享存储服务器(NAS、SAN、DAS等)
• 如:
– 使用NFS创建共享存储服务器
– 客户端挂载NFS共享,并最终映射到容器中
Docker网络架构
一台docker服务器中的容器间是相通的因为安装docker后会有一个虚拟交换机,每个容器都连上了此虚拟交换机。
在docker服务器上安装一个软件包bridge-utils,这个是管理虚拟交换机的软件。
brctl show //查看虚拟交换机上连接了那些网线,虚拟交换机默认名字是docker0
brctl delif docker0 网卡ID //拔掉虚拟交换机docker0上叫网卡ID的网线
brctl addif docker0 网卡ID //插上虚拟交换机docker0上叫网卡ID的网线
docker network list //查看虚拟交换机
自定义创建虚拟交换机名字为docker1 使用192.168.4.0网段的地址
docker network create --subnet 192.168.4.0/24 -d bridge -o com.network.bridge.name=docker1 docker1
启动容器指定使用那个虚拟交换机
docker run -it --network=docker1 docker自定义仓库IP:5000/镜像名:标签
启动容器进行端口绑定就是在防火墙iptables里添加规则