Docker以容器的方式实现了应用程序的隔离,隔离和安全性可以给主机上同时运行多个容器。容器时轻量级的,因为不需要要管理撑的额外负担,而时直接在主机的内核中运行。
与vm虚拟机相比,可以在给定的硬件组合上运行更多的容器。甚至可以在虚拟机的主机中运行docker,以下为Docker与VM之间部分区别
container | VM | |
---|---|---|
启动速度 | 秒级 | 分钟级 |
运行性能 | 接近原生 | 5%左右损失 |
磁盘占用 | MB | GB |
数量 | 成百上千 | 一般几十台 |
隔离性 | 进程级别 | 系统级 |
操作系统 | 主要支持linux | 几乎支持所有系统 |
封装程度 | 之打包项目代码和依赖关系,共享宿主内核 | 完整得操作系统 |
docker提供了工具和平台来管理容器的生命周期:
① 使用容器开发应用程序及其支持组件
② 容器称为分发和测试应用程序的单元
③ 准备就绪后,可以将应用程序作为容器或协调服务器部署到生产环境中,无论生产环境是本地数据数据中心,云提供商还是两者的混合,其工作原理都相同
Docker Engine是具有以下主要组件的客户端—服务器应用程序
① 服务器是一种长期运行的程序,称为守护进程(dockerd 命令)
② REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口
③ 命令行界面(CLI)客户端(docker命令)
快速交付应用程序
响应式部署和扩展
更多工作负载
Docker 主要组成
Docker Client :客户端
Docker Daemon :守护进程
Docker Images:镜像
Docker Container:容器
Docker Registry:镜像仓管
Docker守护进程
Docker 客户端
Docker 注册表
底层技术
命名空间
Docker使用 namespace 提供容器的隔离工作区的技术。运行容器时,Docker会为该容器创建以组名称空间
这些名称空间提供了一层隔离。容器的每个方面都在单独的名称空间内运行,并且其访问仅限于该名称空间
Docker Engine在Linux上使用以下名称空间:
pid 名称空间:进程隔离(PID:进程ID)
net 名称空间:管理网络接口(NET:网络)
ipc 名称空间:管理访问IPC资源(IPC:进程间通信)
mnt 名称空间:管理文件系统挂载点(MNT)
uts 名称空间:隔离内核和版本标识符 (UTS:Unix时间共享系统)
对照组
联合文件系统
容器格式
先关掉防火墙、核心防护
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i "7s/enforcing/disabled/" /etc/selinux/config
安装Docker引擎依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#在阿里云的yum源点中下载repo配置文件
#生成的为置在本机的/etc/yum.d/目录下
#只有在下载完docker-ce.repo配置文件后,才可以正常安装Docker-CE(社区版Docker引擎)
安装Docker-CE引擎
yum install -y docker-ce
开启Docker,并设置为开启自启
systemctl start docker.service
systemctl enable docker.service
查询Docker版本
docker version
镜像加速、网络优化
这里我使用的镜像加速地址是在阿里云官方申请的:https://82q0z7ak.mirror.aliyuncs.com,此处不再赘述
需注意:镜像加速加载完成后需要重启进程和docker
systemctl daemon-reload
systemctl restart docker
网络优化
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
net.ipv4.ip_forward = 1
service network restart
estarting network (via systemctl): [ 确定 ]
systemctl restart docker
镜像基本操作命令
镜像搜索
格式:dcoker search 关键字
示例:
docker search nginx
下载nginx镜像
格式 :docker pull 关键字
示例:
docker pull nginx
查看镜像
格式:docker images
实例:
docker images
借助IMAGE ID标签 详细查看镜像信息
格式:docker inspect 镜像ID
实例:
docker inspect 35
格式:docker tag 镜像标签 新标签
实例:
docker tag nginx:latest nginx:chen
docker images
删除镜像
格式:docker rmi 镜像标签
示例:
docker rmi nginx:chen
格式:docker save -o 导出的文件名 镜像标签
示例:
docker save -o nginx nginx:latest
ls
格式:docker load < 镜像文件
实例:
先删除镜像 docker rmi 35
再把上一步导出的 导入
docker load < nginx
容器列表查询
格式:docker ps -a (-a 列出最近一次启动的容器)
示例:
docker ps -a
格式:docker create -it 选项 /bin/bash
-i 让容器的标准输入保持打开
-t 让Docker分配一个伪终端
示例:
docker create -it nginx:latest /bin/bash
#/bin/bash 指定终端
#statys :created 创建状态,暂时还未开启
#container id 容器ID
格式:docker start 容器ID
示例
docker start f5
#docker run 一次性运行centos:7镜像(如在本地未发现镜像会自动在容器仓库中下载该镜像) -c (command指令,进入到centos:7容器) ls / (执行ls /命令)
docker run centos:7 /usr/bin/bash -c ls /
如果不希望执行完命令后结束进程,可以给一条循环语句命令,如下:
docker run -d centos:7 /bin/bash -c "while true;do echo hello;done"
进入容器
格式:
① docker run -it 容器名 容器环境
② 在容器为运行状态下:docker e’x’ec -it 容器ID 容器环境
示例:
docker run -it nginx:latest /bin/bash
格式:
docker export 容器ID > 导出的容器名 (容器导出)
cat 容器名 | docker import - 镜像名 (生成镜像,不会生成容器)
示例:
docker export 079 > centos
ls
格式:docker rm 容器ID (必须先停止再删除)
示例:
docker rm 07