Docker是什么?干什么用的
虚拟化资源,最初目的是提高硬件资源利用率,目前有灵活、方便扩容、缩容,可以以软件形式模拟物理硬件设备的功能。
Docker是一种轻量级的“虚拟机”,是一种再Linux容器里运行应用的开源工具
Docker的使用场景一般为打包应用程序简化部署、可脱离底层硬件任意迁移。
Docker与虚拟机的区别
虚拟化层的抽象层(用户层)剥离,使用docker engine来替代(来宾操作系统去除),只要通过引擎就可以直接连接到宿主机操作系统中,极大减小了开销。
docker资源消耗低,不需要像虚拟化再做一个完整的系统。
封装程序 只打包项目代码和依赖关系,共享宿主机内核 完整的操作系统,与宿主机隔离
docker解决了vm的一个环境孤岛问题
docker可以自定义传参(创建-创建镜像/容器、启动(基于镜像启动)之前)
如何判断应用与应用之间的隔离
根据六个名称空间隔离判断
容器隔离了6个名称空间(namespace资源隔离-用容器化技术封装)
mount | 文件系统,挂载点 | 管理文件系统挂载点 |
---|---|---|
user | 操作进程的用户和用户组 | |
pid | 进程编号 | 进程隔离 |
uts | 主机名和主机域}隔离内核和版本标识符 | |
ipc | 信号量、消息队列、共享内存 | 管理访问IPC资源(IPC:进程间通信) |
net | 网络设备、网络协议栈、端口等 | 管理网络接口 |
注意 :最晚的一个名称空间是3.8版本,所以没有Centos6的事了
docker的底层原理
cgroups和namespaces两者构成了docker的底层原理
cgroups是linux内核态中资源管理的模块,管理一些系统资源
docker引擎对内核版本的要求至少是3.8+,因为那个版本有cgroups
cgroups资源控制和namespaces结合控制管理了6个名称空间资源
做docker有什么意义(实现3个统一)
docker引擎统一了基础设施环境→images
docker引擎同意了程序打包(装箱)方式-docker镜像→images
docker引擎统一了程序部署(运行)方式-docker容器→基于镜像→运行为容器(可运行的环境)
统统资源整合成Image
实现了一次构建、多次、多出使用
docker的三要素/组件
镜像→模板
容器→基于镜像,运行时状态
仓库→存放镜像模板
镜像:一组资源集合,包含了应用车光绪软件包、应用程序相关的依赖包、运行应用程序所需要的基础环境(泛指操作系统环境),可以理解为容器的模板
容器:基于镜像的一种运行时状态
仓库:存放image镜像,仓库大类:1、公共仓库→docker hub
2、私有仓库→registry harbor
docker的引擎
docker engine是具有以下主要组件的C/S客户端-服务端应用程序
Server端:服务器是一种长期运行的程序,成为守护程序进程(dockerd命令)
Client端:REST API,它指定程序可以用来与守护进程进行通信并指示其操作的接口
命令行界面(CLI)客户端(docker命令)
运行原理
1、docker client 客户端连接到了服务的(服务端是一个守护进程的形式跑在操作系统里面的)restful api 典型的C/S架构
2、由docker服务端的守护进程从docker hub 上下载了镜像
3、服务端创建了一个新的容器,然后从拉去的这个镜像启动了一个容器,容器执行了脚本/可执行程序让我们可以查看/使用
4、docker 服务端把这些信息流(传递)返回到客户端并展示出来, (展示在终端上)。
docker client 可以是多种形式,比如"docker"命令工具所在的终端
安装docker
安装依赖包
[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
设置阿里云镜像源
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker-ce社区版
[root@localhost yum.repos.d]# yum install -y docker-ce
配置环境
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
vim /etc/selinux/config
SELINUX=disabled
systemctl start docker
systemctl enable docker
docker十条管理命令(运维常用命令)
#查询docker版本
docker version
docker info
#搜索镜像
docker search nginx
docker search centos:7
#下载镜像
docker pull 镜像名称
docker pull nginx
#查看镜像列表
docker images 查看当前docker下的下载镜像信息
#获取镜像信息
docker inspect 镜像ID
#添加镜像标签
docker tag nginx:latest nginx:lnmp
相当于做了一个软链接
#删除镜像
docker rmi 镜像名称
docker rmi 镜像标签
#镜像导出
docker save -o 文件名 镜像名
docker save -o nginx_docker nginx:latest
#镜像导入
docker load < nginx
使用场景,有的生产环境,企业不直接使用docker私有仓库,而是存放再一个ftp服务器中,按需上传下载
#查询容器
docker ps -a
#创建容器
docker create -it nginx:latest /bin/bash
-i 让容器的标准输入保持打开
-t 分配一个伪终端
-d 后台守护进程的方式运行
#启动容器
docker start 容器id
#启动容器(一次性执行)
docker run centos:7 /usr/bin/bash -c ls /
#停止容器
docker stop 容器ID
#持续后台运行
docker run -d centos:7 /bin/bash -c "while true;do echo hello;done"
#进入容器
①使用run
docker run -it nginx:latest /bin/bash
②exec(容器必须为开启状态)
docker exec -it 容器ID /bin/bash
####################
docker run -it 会常见前台进程,但是会在输入exit后终止进程
docker attach 会通过连接stdin,连接到容器内输入输出流,会在输入exit后终止进程
docker exex -it 会连接到容器,可以像SSH一样进入容器内部,进行操作,可以通过exit退出容器,不影响容器运行。
#容器导出
docker export 容器ID > 文件名
#容器导入(生成镜像)
docker import 导出的文件名(容器)指定镜像名称
#删除容器
docker rm 容器ID
#强制删除容器(正在运行的)
docker rm -f 容器ID
#批量删除容器
docker ps -a | awk '{print "docker rm "$1}' | bash
这个其实是删除所有不在运行时的容器
# 删除所有非running的容器
docker rm `docker ps -q`
对于有标签的容器,先要删除带标签的名称容器,在删除容器ID,否则会报错
#批量删除“exit”状态的容器
for i in `docker ps -a | grep -i exit | awk '{print $1}'`; do docker rm -f $i;done