前言:
- Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
Docker基本概念
Docker概述
- Docker是一个用于开发,交付和运行应用程序的开放平台,Docker可以将应用程序和基础架构分开,从而快速的交付软件,借助Docker,可以以与管理应用程序相同的方式来管理基础架构,通过利用Docker的快速交付、测试和部署代码的方法,可以大大减少编写代码和在生产环境中运行代码之间的延迟
Docker 平台
-
Docker以容器的方式实现了应用程序的隔离,隔离和安全性可以给主机上同时运行多个容器。容器时轻量级的,因为不需要要管理撑的额外负担,而时直接在主机的内核中运行。
-
与vm虚拟机相比,可以在给定的硬件组合上运行更多的容器。甚至可以在虚拟机的主机中运行docker,以下为Docker与VM之间部分区别
container | VM | |
---|---|---|
启动速度 | 秒级 | 分钟级 |
运行性能 | 接近原生 | 5%左右损失 |
磁盘占用 | MB | GB |
数量 | 成百上千 | 一般几十台 |
隔离性 | 进程级别 | 系统级 |
操作系统 | 主要支持linux | 几乎支持所有系统 |
封装程度 | 之打包项目代码和依赖关系,共享宿主内核 | 完整得操作系统 |
docker提供了工具和平台来管理容器的生命周期:
① 使用容器开发应用程序及其支持组件
② 容器称为分发和测试应用程序的单元
③ 准备就绪后,可以将应用程序作为容器或协调服务器部署到生产环境中,无论生产环境是本地数据数据中心,云提供商还是两者的混合,其工作原理都相同
Docker引擎
Docker Engine是具有以下主要组件的客户端—服务器应用程序
① 服务器是一种长期运行的程序,称为守护进程(dockerd 命令)
② REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口
③ 命令行界面(CLI)客户端(docker命令)
- CLI使用Docker REST API通过脚本或直接CLI命令控制,或者与Docker守护程序交互。许多其他Docker应用程序都使用基础API和CLI
- 守护程序创建和管理Docker对象,例如 图像、容器、网络和卷
Docker应用
快速交付应用程序
- Docker通过允许开发人员使用提供应用程序和服务的本地容器在标准化环境中工作,从而简化了开发声明周期。容器非常适合持续集成和持续交付(CI/CD) 工作流程
响应式部署和扩展
- Docker基于容器的平台允许高读可移植的工作负载。Docker容器可以在开发人员的笔记本电脑、数据中心的物理或虚拟机、云提供商或混合环境中运行
- Docker的可移植性和轻量级的特性还可以让运维人员轻松的动态管理工作负载,并根据业务需求指示实时扩展或关闭应用程序和服务
更多工作负载
- Docker轻巧快速,它为基于虚拟机管理程序的虚拟机提供了可行且经济高效的替代方案,因此可以利用更多的计算能力来实现业务目标,Docker非常适合高密度环境和中小型部署。
Docker 架构
- Docker 使用客户端—服务器架构,Docker客户端与Docker守护进程进行对话,该守护进程完成了构建,运行和分发Docker容器的繁重工作。Docker客户端和守护程序可以在统一系统上运行,或者可以将Docker客户端连接到远程Docker守护程序。Docker客户都安和守护程序在UNIX套接字或网络接口上使用REST API进行通信
Docker 主要组成
Docker Client :客户端
Docker Daemon :守护进程
Docker Images:镜像
Docker Container:容器
Docker Registry:镜像仓管
Docker守护进程
- Docker守护程序倾听Docker API请求并管理Docker对象,例如图片、容器、网络和卷,守护程序还可与其他守护程序通信以管理Docker服务
Docker 客户端
- Docker 客户端是许多Docker用户与Docker交互的主要方式。当使用诸如 docker run此类命令的适合,客户端会将这些命令发送到dockerd(守护进程命令) 以执行这些命令,该docker命令使用Docker API。Docker 客户客户端可以与多个守护进程通信
Docker 注册表
- Docker 注册表存储Docker镜像。Docker Hub是所有人都可以使用的公共注册表,并且Docker配置为默认在Docker Hub上查找镜像。甚至可以建立自己的私人注册表。如果使用Docker数据中心(DDC),则其中包括Docker可信注册表(DTR)
底层技术
- Docker使用GO语言编写,并利用Linux内核的多个功能来交付其功能
命名空间
-
Docker使用 namespace 提供容器的隔离工作区的技术。运行容器时,Docker会为该容器创建以组名称空间
-
这些名称空间提供了一层隔离。容器的每个方面都在单独的名称空间内运行,并且其访问仅限于该名称空间
Docker Engine在Linux上使用以下名称空间:
pid 名称空间:进程隔离(PID:进程ID)
net 名称空间:管理网络接口(NET:网络)
ipc 名称空间:管理访问IPC资源(IPC:进程间通信)
mnt 名称空间:管理文件系统挂载点(MNT)
uts 名称空间:隔离内核和版本标识符 (UTS:Unix时间共享系统)
对照组
- Linux上的Docker引擎还依赖于另一种控制组(cgroups)的技术。cgroup将应用程序限制为一组特定的资源。控制组允许 Docker Engine 将可用的硬件资源共享给容器,并由选择的实施限制和约束,例如:限制特定容器可用的内存
联合文件系统
- 联合文件系统或UnionFS是通过创建图层进行操作的文件系统,使其非常轻便且快速。Docker Engine使用UnionFS为容器提供构建模块。Docker Engine可以使用多个UnionFS变体,包括AUFS,btrfs,vfs和DeviceMapper。
容器格式
- Docker Engine 将名称空间,控制组和UnionFS组合到一个称为容器格式的包装器中,默认容器格式为libcontainer。
Docker 基础安装部署
先关掉防火墙、核心防护
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 镜像名称 操作指令
- 示例:
#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