目录
前言
一、Docker概述
1、云计算三层架构
2、Docker是什么?
3、Docker与虚拟机的区别
4、Docker的使用场景
5、使用docker的意义
6、Docker引擎(Docker Engine)
7、docker的三要素
8、docker的底层原理
9、名称空间(Namespaces)
10、Docker的架构(Docker architecture)
11、docker的工作原理
二、部署20版的docker
1、安装依赖包
2、设置阿里云镜像源
3、安装docker-ce社区版
4、环境配置
三、设置镜像加速
四、网络优化
五、docker镜像基础命令
1、查看docker版本信息
2、搜索镜像
3、下载镜像(默认是从docker hub )
4、查看镜像列表
5、获取镜像信息
6、添加镜像标签
7、删除
8、镜像导出
9、镜像导入
六、docker容器基础命令
1、查询容器
2、创建容器
3、启动容器
4、停止容器
5、重启容器
6、运行容器
7、进入容器
8、容器导出
9、容器导入(生成镜像)
10、删除容器
11、批量删除容器(正则匹配)
12、删除非up状态的rm -f :强制删除
13、批量册除"exit"状态(指定状态)的容器
14、查询所有当前容器资源消耗信息
总结
Docker是一个开源的应用容器引擎,开发者可以打包自己的应用到容器里面,然后迁移到其他机器的docker应用中,可以实现快速部署。
简单的理解,docker就是一个软件集装箱化平台,就像船只、火车、卡车运输集装箱而不论其内部的货物一样,软件容器充当软件部署的标准单元,其中可以包含不同的代码和依赖项。
按照这种方式容器化软件,开发人员和 IT 专业人员只需进行极少修改或不修改,即可将其部署到不同的环境,如果出现的故障,也可以通过镜像,快速恢复服务。
服务 | 说明 | 应用 |
IAAS | 基础设施及服务 | 硬件(服务器、网络设置、防火墙等)虚拟化 网络虚拟化(大二层) 例:openstack |
PAAS | 平台及服务 | 环境 例:数据库、 docker 、kubernetes |
SAAS | 应用及服务 | 应用 例:应用商店的应用 |
Docker是一种轻量级的“虚拟机”,是一个开源的应用容器引擎。容器是完全使用沙箱机制,相互之间不会有任何接口
轻量级表示它体积小,灵活
而说它是虚拟机,又不是真正的虚拟机,因为它里面没有系统
开源表示它是免费的
不同点 | container(容器) | VM(虚拟机) |
启动速度 | 秒级(进程控制) | 分钟级(来宾操作系统管理) |
运行性能 | 接近原生(共享内核)(直接在内核中运行90% ) | 50%左右损失 |
磁盘占用 | MB | GB(探作系统镜像2G) |
数量 | 成百上千 | 一般几十台 |
隔离性 | 进程级别 | 系统级别(更彻底) |
操作系统 | 主要支持Linux系统 | 几乎所有 |
安全性 (因为隔离性) | 低(使用原系统内核) | 高 |
封装程度 | 只打包项目代码和依赖关系,共享宿主机内核 | 完整的操作系统,与宿主机隔离 |
K8s image镜像 + container容器的方式;
war jar ——》github gitlab 私有仓库(代码仓库)——》jenkins(测试)(应用程序封装/构建镜像)—》运维下载,使用容器技术进行运行/发布;
打包应用程序简化部署;
可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦);
例:服务器从腾讯云迁移到阿里云
持续集成和持续交付( CI/CD):开发到测试发布;
部署微服务;
提供PAAS产品(平台即服务){OpenStack的云主机类似于阿里云的ECS,属于IAAS、Docker (K8S)属于PAAS}。
docker 引擎统一了基础设施环境——docker容器环境
docker 引擎统一了程序打包(装箱)方式——docker 镜像
docker引擎统一了程序部署(运行)方式——docker容器
镜像——》封装的某一个时刻的服务/应用状态
容器——》应用跑起来的状态(正常提供服务的状态——运行时)
Docker Engine是具有以下主要组件的客户端-服务器应用程序:服务器是一种长期运行的程序,称为守护程序进程( dockerd命令)。
REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口。
①Docker images:镜像
②Docker container:容器
③Docker registry:镜像仓库
存储镜像的地方,默认在公共的Docker Hub上查找,可以搞个人仓库。
cgroup和namespaces两者构成了docker底层原理
docker 引擎对内核版本是有要求的(至少是3.8+)
docker需要cgroups 的资源管理功能
Docker使用一种称为namespaces提供容器的隔离工作区的技术。运行容器时,Docker会为该容器创建一组名称空间。这些名称空间提供了一层隔离。容器的每个方面都在单独的名称空间中运行,并且其访问仅限于该名称空间。
mount | 文件系统,挂载点—》一个文件系统内,不能重复挂载一个指定自录,例如:/mnt |
user | 操作进程的用户和用户组 |
pid | 进程编号 |
uts | 主机名和主机域 |
ipc | 信号量、消息队列,共享内存(理解,不同的应用调用内存资源的时候应该使用不同的内存空间) |
net | 网络设备、网络协议栈、端口等 |
Docker使用客户端-服务器架构。Docker 客户端与pocker守护进程进行对话,该守护进程完成了构建,运行和分发Docker容器的繁重工作
Docker区别于传统的虚拟化,不需要虚拟硬件资源,直接使用容器引擎,所以速度快
Docker client:客户端/提供一个与用户交互,展示的平台+管理、控制docker服务端(功能)的工具 docker
Docker客户端(docker)是许多Docker用户与Docker交互的主要方式。当您使用诸如之类的命令时docker run,客户端会将这些命令发送到dockerd,以执行这些命令。该docker命令使用Docker API。Docker客户端可以与多个守护程序通信。
Docker daemon:守护进程
Docker守护程序( dockerd)侦听Docker API请求并管理Docker对象,例如图像,容器,网络和卷。守护程序还可以与其他守护程序通信以管理Docker服务。Docker images:镜像
1、docker client客户端连接到了服务端(服务端是以一个守护进程的形式跑在操作系统里面的)restful api典型的c/s架构
2、由docker服务端的守护进程从docker hub 上下载了镜像(PS:服务端会先检查本地系统是否有这个镜像)
3、服务端创建了一个新的容器,然后从拉去的这个镜像启动了一个容器,容器执行了脚本/可执行程序让我们可以查看/使用(client)
4、docker服务端把这些信息流(传递)返回到客户端并展示出来,(展示在终端上)
docker client可以是多种形式,比如"docker"命令工具所在的终端
[root@docker ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
#yum-utils提供了yum-config-manager
#device mapper存储驱动程序需要device-mapper-persistent-data和lvm2
#Device Mapper 是Linux2.6内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
cd /etc/yum.repos.d/
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce
[root@docker yum.repos.d]# systemctl stop firewalld
[root@docker yum.repos.d]# systemctl disable firewalld
[root@docker yum.repos.d]# setenforce 0
[root@docker yum.repos.d]# vim /etc/selinux/config
[root@docker yum.repos.d]# systemctl start docker
[root@docker yum.repos.d]# systemctl enable docker
配置阿里云镜像加速,不然下载速度很慢
[root@docker yum.repos.d]# systemctl daemon-reload
[root@docker yum.repos.d]# systemctl restart docker
[root@docker yum.repos.d]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@docker yum.repos.d]# sysctl -p #加载内核配置
[root@docker yum.repos.d]# systemctl restart network
[root@docker yum.repos.d]# systemctl restart docker
[root@docker yum.repos.d]# docker -v
[root@docker yum.repos.d]# docker version
[root@docker yum.repos.d]# docker info
docker search 服务名
例如:
[root@docker opt]# docker search nginx
——》可以自己制作镜像,然后上传到docker hub 上
优化:有效减少镜像大小(dockerfile优化方向-》对于部分企业而言,是一种加分项)
docker pull镜像名称,
例如:
[root@docker opt]# docker pull nginx
[root@docker opt]# docker images
docker inspect 镜像ID
例如:
[root@docker opt]# docker inspect ea335eea17ab
docker tag 仓库名:原镜像名 仓库名:新镜像名
例如:
[root@docker opt]# docker tag nginx:latest nginx:test
[root@docker opt]# docker images
[root@docker opt]# docker images | grep nginx
docker rmi 镜像名称
docker rmi 镜像的ID
docker rmi 镜像名称:标签
例如:
[root@docker opt]# docker rmi ea335eea17ab
[root@docker opt]# docker images
[root@docker opt]# docker rmi nginx:test
[root@docker opt]# docker images
[root@docker opt]# docker rmi `docker images -aq` #删除所有镜像
[root@docker opt]# docker rmi `docker images | grep "nginx"` #删除nginx的镜像
docker save -o 文件名 镜像名
例:
[root@docker opt]# docker save -o nginx_v1 nginx:latest
docker save -o 存放镜像的位置 仓库名:镜像名
例:
[root@docker opt]# docker save -o /opt/nginx_qw nginx:latest
方法一:
docker load < 本地导出的镜像名
方法二:
docker --input 本地导出的镜像名
例如:
docker load < nginx_v1
docker load --input nginx_qw
容器的STATUS状态
- up是正在运行的
- Exited (0)是正常停止的容器
- Exited (非0)异常停止的容器
[root@docker opt]# docker ps #查看运行中的容器
[root@docker opt]# docker ps -a #查询所有容器,包括未运行的
docker create [选项] 镜像运行的程序
-i 让容器的标准输入保持打开
-t 分配一个伪终端
-d 后台守护进程的方式运行
例:
[root@docker opt]# docker create -it nginx:latest /bin/bash
docker start 容器ID #启动一个或多个已经被停止的容器
启动容器((一次性执行)
docker run centos:7 /usr/bin/bash -c ls /
docker stop 容器ID
docker restart 容器ID
run指令运行
①检测本地有没有该镜像(没有的话直接到docker hub上下载) ②create(将镜像创建为容器)+ start将创建好的容器运行起来run和start的作用有些类似,准确来说run相当于create+start;一般第一次可以使用run,后面维护还是使用start/stop/restart。
docker run [选项] 镜像 [命令] [变量]
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-c 命令表示后面的参数将会作为字符串读入作为执行的命令
-v: 绑定一个卷
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
--name="名称": 为容器指定一个名称
--link name:alias 添加链接到另一个容器,格式“--link容器名:别名”
例如:
docker run nginx
docker run -d nginx
docker run -d nginx /bin/bash -c "ls"
使用run
docker run -it nginx: latest /bin/bashexec (容器必须为开启状态)
docker exec -it容器ID /bin/bash
exec和shell 是两种运行模式
PS:
docker run -it会创建前台进程,但是会在输入exit后终止进程。
docker attach 会通过连接stdin,连接到容器内输入输出流,会在输入exit后终止容器进程.
docker exec -it 会连接到容器,可以像sSH一样进入容器内部,进行操作,可以通过exit退出容器,不影响容器运行。
docker export 容器ID > 文件名
示例:
docker export 容器ID > nginx_a
docker import 导出的文件名(容器) 指定镜像名称
示例:
docker import nginx_a nginx : latest
cat 文件名(容器)| docker import - nginx:latest
docker rm 容器ID
#强制册删除容器(正在运行的)
docker rm -f 容器ID
docker ps -a | awk '{print "docker rm "$1}' | bash
docker rm `docker ps -q`
for i in `docker ps -a | grep -i exit | awk '{print $1}'`; do docker rm -f $i; done
docker stats
Docker是一个用于开发,交付和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分开,从而可以快速交付软件。是一个开源的应用容器引擎,让开发者可以打包大门的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或者Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
沙箱(Sandbox):在计算机安全领域,沙箱是一种程序的隔离运行机制Docker在2013年一炮而红,直到现在,已经成为容器技术的代名词。Docker 从一开始就以提供标准化的运行时环境为目标,真正做到“build once, run anywhere",可以将同一个构建版本用于开发、测试、预发布、生产等任何环境,并且做到了与底层操作系统的解耦。在此基础上还进一步发展出了CaaS(容器即服务)技术。
1、Docker的空间名称:mount、user、pif、uts、ipc、net
2、Docker的核心概念:镜像、容器、仓库
3、镜像的操作①查找指定的镜像:docker search 服务名;②下载镜像:docker pull 服务名;③查看镜像列表及镜像信息:docker inspect 镜像的ID;④添加新标签:docker tag 仓库名:原镜像名 仓库名:新镜像名;⑤删除镜像:docker rmi 镜像的ID/docker rmi 仓库名:镜像名;⑥将镜像存储到本机上:docker save -o 存放镜像的位置 仓库名:镜像名;⑦载入镜像:docker load < 本地导出的镜像名/docker --input 本地导出的镜像名
4、容器的操作①查看容器运行状态:docker ps -a;②创建容器:docker create [选项] 镜像运行的程序;③启动、停止、重启容器:docker start 容器ID:启动一个或多个已经被停止的容器/docker stop 容器ID:停止一个运行中的容器/docker restart 容器ID:重启容器;④运行容器:docker run [选项] 镜像 [命令] [变量];⑤进入、退出容器:docker exec [选项] 容器 命令;⑥容器导出、导入:docker export 容器ID > 备份文件名/docker import - 仓库名:镜像名;⑦删除容器:docker rm 容器ID