文章目录
- Docker概述
- Docker介绍
- Docker与虚拟机的区别
- Docker的使用场景
- Docker的核心概念及安装方式
- 使用docker有什么意义?
- 运行时
- Docker引擎(Docker Engine)
- 名称空间(Namespaces)
- 部署19版的docker
- docker镜像操作
- 查询docker 版本
- 查看镜像列表
- 搜索镜像
- 下载镜像
- 获取镜像信息
- 添加镜像标签(重命名,别名)
- 删除镜像
- 镜像导出
- 镜像导入
- 容器操作
- 查询容器
- 创建容器
- 启动容器
- 停止容器
- 持续后台运行
- 进入容器
- 容器导出
- 删除容器
- 强制删除容器
- 批量删除容器
- 批量删除"exit" 状态的容器
- 容器导入(生成镜像)
Docker概述
Docker介绍
是一种轻量级的“虚拟机”(KVM ,workstations ,openstack kvm实例)
在Linux容器里运行应用的开源工具(对外开放源码的工具)
特殊的虚拟化实现方式
应用程序与基础架构分开,从而可以快速交付软件。是一个开源的应用容器引擎,让开发者可以打包大门的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或者Window机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
解析:
相互隔离
docker是一种轻量级的虚拟机
在Linux容器里运行应用的开源工具
拆分应用,并且进行解耦
查看的是本地yum源对应仓库中的软件包所有的服务、版本
yum list docker --show-duplicates
秒级别部署
沙箱(Sandbox):计算机安全领域,沙箱是一种程序的隔离运行机制,Docker在2003年一炮而红,直到现在,已经成为容器技术的代名词。Docker从一开始就以提供标准化的运行时环境(支持应用程序的底层环境)为目标,真正做到“build once,run anywhere”。可以将同一个构建版本用于开发,测试,预发布,生产等任何环境,并且做到了与底层操作系统的解耦。在此基础上还进一步发展出了CaaS(容器即服务)技术。
Docker 镜像
Docker与虚拟机的区别
启动速度:
虚拟机在虚拟化层,通过虚拟化层对底层物理硬件资源的调用支持,所以有调用时间的消耗。
container:只需要部署Docker引擎,不需要向宿主机调用资源环境
磁盘占用:
虚拟机:先安装完整的操作系统
container:只需要安装一个引擎软件
数量:
虚拟机:使用底层的硬件资源,把底层硬件资源进行分割后提供给自己使用
container:使用Docker引擎,容器,使用进程,线程
Docker解决了KVM孤岛的问题,预配置(传参:在构建容器之前,就把配置环境传入)
Docker的使用场景
打包应用程序简单部署
可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦)即自身提供操作系统环境,可支持应用,不需要内部容器和外部解析关联,例如:服务器从腾讯云迁移到阿里云持续集成(打包镜像)和持续交付(CI/CD)(以容器的方式把服务提供出去) :开发到测试发布部署微服务
提供PAAS产品(平台即服务) {OpenStack 的云主机类似于阿里云的ECS,属于IAAS、 Docker (K8S) 属于PAAS}
例如:服务器从腾讯云迁移到阿里云
Docker的核心概念及安装方式
镜像:
一个面向Docker容器引擎的只读模板(应用的只读模板,运行方式:以容器方式创建出来)
容器:
从镜像创建的运行实例(创建出一个可读,写,运行的具体应用)
仓库:
集中保存镜像的地方(存储镜像)
私有仓库类型:doderhub(公共镜像),harbor,registry(harbor的一个分支)
CentOS安装Docker的两种方式
使用CURL获得DOcker的安装脚本进行安装
使用YUM仓库来安装Docker
2013年,发布了docker把容器化技术做成了标准化平台
使用docker有什么意义?
docker引擎统一了基础设施环境-docker环境
docker引擎统一了程序打包(装箱)方式-docker镜像
docker引擎统一了程序部署(运行)方式-docker容器
解析:
不同平台环境只要安装了docker引擎就可以使用docker容器技术(便利之处,不挑剔底层环境)
实现底层虚拟化形式
传统java工程师会需要把软件进行打包,生成jar包,然后给与运维工程师进行部署,而现在,借助jenkins和git这些工具就能直接对镜像进行打包,然后上传到仓库/打包成模板
运行时
虚拟机的一种,一般指进程级别的虚拟机。
运行时是指一个程序在运行(或者在被执行)的依赖。也就是说,当你打开一个程序使它在电脑上运行的时候,那个程序就是处于运行时刻。在一些编程语言中, 把某些可以重用的程序或者实例打包或者重建成为“运行库"。这些实例可以在它们运行的时候被连接或者被任何程序调用,同时依赖于运行时系统。
Docker引擎(Docker Engine)
Docker Engine是具有以下主要组件的客户端-服务器应用程序:服务器是一种长期运行的程序,称为守护程序进程( dockerd. 命令)即随着一个服务的开启而生成的,持续工作在后台,对这服务的运行做支持,是一个特殊的进程,守护服务正常运行。
REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口。(因为docker是一个典型的C/S架构,docker的server端工作在后台(进行具体的镜像操作,处理服务),docker的client端工作在前台通过rest api接口进行前后端交互)
名称空间(Namespaces)
Docker使用一种称为namespaces提供容器的隔离工作区的技术。运行容器时,Docker 会为该容器创建一组名称空间。
这些名称空间提供了一层隔离。容器的每个方面都在单独的名称空间中运行,并
且其访问仅限于该名称空间。
应用A与应用B隔离的必备条件(namespace名称空间隔离) :
容器隔离了6个名称空间(namespace资源隔离用容器化技术封装)
Docker Engine在Linux上使用以下名称空间:
mount 管理文件系统挂载点(MNT:mount),文件系统,挂载点,(限制在同一名称,同一目录下只能被挂载一次,不能互用。)
user 操作进程的用户和用户组 (进程跑起来需要依赖个用户: root. 普通用户、其他用户,所以也需要以用户层面进行隔离)
pid 进程隔离(PID: 进程ID)进程编号
uts 隔离内核和版本标识符。(UTS:Unix时间共享系统),主机名和主机域
ipc 管理访问IPC资源(IPC: 进程间通信),信号量、消息队列,共享内存(同一个操作系统上,进程之间的通讯,可以共享内存、共享操作系统消息队列,使用隔离可以将让不同的进程在写入数据时,不会写入在同一个内存空间中) I
net 管理网络接口(NET: 网络),网络设备、网络协议栈、端口等
只有实现了以上6种隔离,我们才能认为,使用容器进行了封装
部署19版的docker
关闭防火墙
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@localhost ~]# grep -v "#" /etc/selinux/config
[root@server1 ~]# vi /etc/resolv.conf
安装依赖包
[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.repo配置文件之后,才可以正常安装Docker-CE(社区版Docker引擎)
安装Docker-CE(社区版Docker引擎)
[root@localhost yum.repos.d]# yum install -y docker-ce
[root@localhost ~]# systemctl start docker 开启服务
[root@localhost ~]# systemctl enable docker 自启动
设置镜像加速
登录阿里云网站进行访问申请
https://help.aliyun.com/document_detail/60750.html
添加镜像加速地址
网络优化
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@localhost ~]# systemctl restart network
[root@localhost ~]# systemctl restart docker
docker镜像操作
[root@localhost docker]# docker run hello-world
1、docker client客户端(在前端)连接到了服务端(在后端)(服务端是以一个守护进程的形式跑在操作系统里面的)
典型的C/S架构
2、由docker服务端的守护进程从docker hub(doxker镜像仓库)上下载了镜像
3、服务端创建了一个新的容器,然后从拉去的这个镜像启动了一个容器,容器执行了脚本可执行程序让我们可以查看/使用(客户端告诉服务端动作操作,服务端是真正进行操作角色)
4、docker服务端把这些信息流(传递)返回到客户端并展示出来, (展示在终端上或者其他位置)
docker client可以是多种形式, 比如" docker"命令具所在的终端
查询docker 版本
[root@localhost docker]# docker version
Version: 20.10.5
API version: 1.41
Go version: go1.13.15
Git commit: 55c4c88
Built: Tue Mar 2 20:33:55 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.5
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: 363e9a8
Built: Tue Mar 2 20:32:17 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.4
GitCommit: 05f951a3781f4f2c1911b05e61c160e9c30eaa8e
runc:
Version: 1.0.0-rc93
GitCommit: 12644e614e25b05da6fd08a38ffa0cfe1903fdec
docker-init:
Version: 0.19.0
GitCommit: de40ad0
[root@localhost docker]# docker info
查看镜像列表
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 14 months ago 13.3kB
搜索镜像
[root@localhost docker]# docker search nginx
下载镜像
docker pull 镜像名称
[root@localhost docker]# docker pull nginx
获取镜像信息
docker inspect 镜像ID
[root@localhost ~]# docker inspect f6d0b4767a6c
添加镜像标签(重命名,别名)
[root@localhost docker]# docker tag nginx:latest nginx:xlx
删除镜像
docker rmi 镜像名称
[root@localhost docker]# docker rmi nginx:latest
docker rmi 镜像标签
[root@localhost docker]# docker rmi f6d0b4767a6c
加上 -f 可以全部删除
镜像导出
docker save -o 文件名 镜像名
[root@localhost docker]# docker save -o nginx-image nginx:latest
镜像导入
使用场景,有的生产环境,企业不直接使用docker私有仓库,而是存放在一个ftp服务器中, 按需上传下载
[root@localhost docker]# docker load < nginx-image
容器操作
查询容器
[root@localhost docker]# docker ps -a
创建容器
[root@localhost docker]# docker create -it nginx:latest /bin/bash
创建 对应镜像 执行环境
-i 让容器的标准输入保持打开
-t 分配一个伪终端(即在登录容器时可以有一个操作界面)
启动容器
docker start 容器 id
[root@localhost docker]# docker start fa336c9fd943
启动容器(一次性执行)
[root@localhost docker]# docker run centos:7 /usr/bin/bash -c ls /
执行命令 执行环境 执行命令根目录显示
docker run
1、先检测本地是否有镜像
2、本地没有该镜像,则会向镜像仓库拉去这个镜像
3、先create(创建)、 再start(启动)把该镜像的容器运行起来
停止容器
docker stop 容器ID
[root@localhost docker]# docker stop fa336c9fd943
持续后台运行
[root@localhost docker]# docker run -d centos:7 /bin/bash -c "while true;do echo hello;done"
执行在后台 执行命令 持续循环执行hello命令
进入容器
使用run
[root@localhost docker]# docker run -it nginx:latest /bin/bash
exec (容器必须为开启状态)
docker exec -it 容器ID /bin/bash
[root@localhost docker]# docker exec -it f9c1e84076e3 /bin/bash
容器导出
docker export 容器ID >文件名
[root@localhost docker]# docker export b428ab08477d > hello-world
删除容器
docker rm 容器ID
无法删除正在运行时的容器
[root@lcoalhost docker]# docker rm f9c1e84076e3
强制删除容器
docker rm -f 容器ID
批量删除容器
docker ps -a | awk '{print "docker rm "$1"}' | bash
批量删除"exit" 状态的容器
执行强制删除命令
for i in `docker ps -a | grep -i exit | awk '{print $1}'`; do docker rm -f $i;done
查看列表 过滤不区分大小写exit状态
容器导入(生成镜像)
docker import 导出的文件名(容器) 指定镜像名称
cat 导出的文件名(容器) | docker import - 指定镜像名称
只会生成镜像,不会生成容器
[root@localhost docker]# docker import hello-world hello-world
[root@localhost docker]# cat nginx_a | docker import - nginx:latest
docker状态
Exitd (0) 正常退出
Exitd (非0值) 异常退出 Exitd (137) 停止容器时出现状态
Created 创建容器
up 容器正常运行时的状态