Docker基础管理命令解析
Docker容器中封装的是服务,应用程序,具有隔离性k8s在1.20包括1.20版本之前支持Docker,之后不支持。docker作为一种特殊的虚拟化实现方式,其配置命令也较为特殊,本文就docker的基础管理命令进行了简单讲解
·
前言
Docker容器中封装的是服务,应用程序,具有隔离性
k8s在1.20包括1.20版本之前支持Docker,之后不支持。
一 Docker概述
1.1 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 镜像
1.2 Docker与虚拟机的区别
解析:
启动速度:
虚拟机在虚拟化层,通过虚拟化层对底层物理硬件资源的调用支持,所以有调用时间的消耗。
container:只需要部署Docker引擎,不需要向宿主机调用资源环境
磁盘占用:
虚拟机:先安装完整的操作系统
container:只需要安装一个引擎软件
数量:
虚拟机:使用底层的硬件资源,把底层硬件资源进行分割后提供给自己使用
container:使用Docker引擎,容器,使用进程,线程
Docker解决了KVM孤岛的问题,预配置(传参:在构建容器之前,就把配置环境传入)
1.3 Docker的使用场景
打包应用程序简单部署
可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦)即自身提供操作系统环境,可支持应用,不需要内部容器和外部解析关联,例如:服务器从腾讯云迁移到阿里云持续集成(打包镜像)和持续交付(CI/CD)(以容器的方式把服务提供出去) :开发到测试发布部署微服务
提供PAAS产品(平台即服务) {OpenStack 的云主机类似于阿里云的ECS,属于IAAS、 Docker (K8S) 属于PAAS}
例如:服务器从腾讯云迁移到阿里云
1.4 Docker的核心概念及安装方式
镜像:
一个面向Docker容器引擎的只读模板(应用的只读模板,运行方式:以容器方式创建出来)
容器:
从镜像创建的运行实例(创建出一个可读,写,运行的具体应用)
仓库:
集中保存镜像的地方(存储镜像)
私有仓库类型:doderhub(公共镜像),harbor,registry(harbor的一个分支)
CentOS安装Docker的两种方式
使用CURL获得DOcker的安装脚本进行安装
使用YUM仓库来安装Docker
2013年,发布了docker把容器化技术做成了标准化平台
1.4.1 使用docker有什么意义?
docker引擎统一了基础设施环境-docker环境
docker引擎统一了程序打包(装箱)方式-docker镜像
docker引擎统一了程序部署(运行)方式-docker容器
解析:
不同平台环境只要安装了docker引擎就可以使用docker容器技术(便利之处,不挑剔底层环境)
实现底层虚拟化形式
传统java工程师会需要把软件进行打包,生成jar包,然后给与运维工程师进行部署,而现在,借助jenkins和git这些工具就能直接对镜像进行打包,然后上传到仓库/打包成模板
1.4.2 运行时
虚拟机的一种,一般指进程级别的虚拟机。
运行时是指一个程序在运行(或者在被执行)的依赖。也就是说,当你打开一个程序使它在电脑上运行的时候,那个程序就是处于运行时刻。在一些编程语言中, 把某些可以重用的程序或者实例打包或者重建成为“运行库"。这些实例可以在它们运行的时候被连接或者被任何程序调用,同时依赖于运行时系统。
1.5 Docker引擎(Docker Engine)
Docker Engine是具有以下主要组件的客户端-服务器应用程序:服务器是一种长期运行的程序,称为守护程序进程( dockerd. 命令)即随着一个服务的开启而生成的,持续工作在后台,对这服务的运行做支持,是一个特殊的进程,守护服务正常运行。
REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口。(因为docker是一个典型的C/S架构,docker的server端工作在后台(进行具体的镜像操作,处理服务),docker的client端工作在前台通过rest api接口进行前后端交互)
1.6 名称空间(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
2.1 环境部署
2.1.1 关闭防火墙
[root@server1 ~]# systemctl stop firewalld
[root@server1 ~]# systemctl disable firewalld
[root@server1 ~]# setenforce 0
[root@server1 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@server1 ~]# grep -v "#" /etc/selinux/config
[root@server1 ~]# vi /etc/resolv.conf
2.1.2 安装依赖包
[root@server1 ~]# 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内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构
2.1.3 设置阿里云镜像源
[root@server1 ~]# cd /etc/yum.repos.d/
[root@server1 yum.repos.d]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
只有在下载完docker.repo配置文件之后,才可以正常安装Docker-CE(社区版Docker引擎)
2.1.4 安装Docker-CE(社区版Docker引擎)
[root@server1 yum.repos.d]# yum install -y docker-ce
[root@server1 ~]# systemctl start docker 开启服务
[root@server1 ~]# systemctl enable docker 自启动
2.2 设置镜像加速
登录阿里云网站进行访问申请
https://help.aliyun.com/document_detail/60750.html
2.2.1 添加镜像加速地址
/etc/docker/daemon.json配置文件中
三 docker镜像操作
[root@server1 docker]# docker run hello-world
解析:
1、docker client客户端(在前端)连接到了服务端(在后端)(服务端是以一个守护进程的形式跑在操作系统里面的)
典型的C/S架构
2、由docker服务端的守护进程从docker hub(doxker镜像仓库)上下载了镜像
3、服务端创建了一个新的容器,然后从拉去的这个镜像启动了一个容器,容器执行了脚本可执行程序让我们可以查看/使用(客户端告诉服务端动作操作,服务端是真正进行操作角色)
4、docker服务端把这些信息流(传递)返回到客户端并展示出来, (展示在终端上或者其他位置)
docker client可以是多种形式, 比如" docker"命令具所在的终端
3.1 查询docker 版本
[root@server1 docker]# docker version
[root@server1 docker]# docker info
查询到的server服务端信息比docker version更为丰富
3.2 查看镜像列表
[root@server1 docker]# docker images
名称 标签 镜像ID 创建时间 大小
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 14 months ago 13.3kB
3.3 搜索镜像
[root@server1 docker]# docker search nginx
注意:Linux发行版: alpine centos redhat Debian (apt包管理, centos 是rpm)生产环境可能会用的
3.4 下载镜像
docker pull 镜像名称
例如:
[root@server1 docker]# docker pull nginx
[root@server1 ~]# docker images
3.5 获取镜像信息
docker inspect 镜像ID
[root@server1 ~]# docker inspect f6d0b4767a6c
3.6 添加镜像标签(重命名,别名)
[root@server1 docker]# docker tag nginx:latest nginx:mmm
3.7 删除镜像
docker rmi 镜像名称
[root@server1 docker]# docker rmi nginx:latest
docker rmi 镜像标签
[root@server1 docker]# docker rmi f6d0b4767a6c
3.8 镜像导出
docker save -o 文件名 镜像名
[root@server1 docker]# docker save -o nginx-image nginx:latest
3.9 镜像导入
使用场景,有的生产环境,企业不直接使用docker私有仓库,而是存放在一个ftp服务器中, 按需上传下载
[root@server1 docker]# docker load < nginx-image
四 容器操作
4.1 查询容器
[root@server1 docker]# docker ps -a
4.2 创建容器
[root@server1 docker]# docker create -it nginx:latest /bin/bash
创建 对应镜像 执行环境
-i 让容器的标准输入保持打开
-t 分配一个伪终端(即在登录容器时可以有一个操作界面)
4.3 启动容器
docker start 容器 id
[root@server1 docker]# docker start fa336c9fd943
4.3.1 启动容器(一次性执行)
[root@server1 docker]# docker run centos:7 /usr/bin/bash -c ls /
执行命令 执行环境 执行命令根目录显示
[root@server1 docker]# docker ps -a
解析:
docker run
1、先检测本地是否有镜像
2、本地没有该镜像,则会向镜像仓库拉去这个镜像
3、先create(创建)、 再start(启动)把该镜像的容器运行起来
4.4 停止容器
docker stop 容器ID
[root@server1 docker]# docker stop fa336c9fd943
4.5 持续后台运行
[root@server1 docker]# docker run -d centos:7 /bin/bash -c "while true;do echo hello;done"
执行在后台 执行命令 持续循环执行hello命令
4.6 进入容器
4.6.1 使用run
[root@server1 docker]# docker run -it nginx:latest /bin/bash
exit和ctrl+d 退出(当前终端)
4.6.2 exec (容器必须为开启状态)
docker exec -it 容器ID /bin/bash
[root@server1 docker]# docker exec -it f9c1e84076e3 /bin/bash
4.7 容器导出
docker export 容器ID >文件名
[root@server1 docker]# docker export b428ab08477d > hello-world
4.8 删除容器
docker rm 容器ID
无法删除正在运行时的容器
[root@server1 docker]# docker rm f9c1e84076e3
需要先停止才可以删除
[root@server1 docker]# docker stop f9c1e84076e3
[root@server1 docker]# docker ps -a
[root@server1 docker]# docker rm f9c1e84076e3
4.8.1 强制删除容器
docker rm -f 容器ID
4.8.2 批量删除容器
docker ps -a | awk '{print "docker rm "$1"}' | bash
4.9 批量删除"exit" 状态的容器
执行强制删除命令
for i in `docker ps -a | grep -i exit | awk '{print $1}'`; do docker rm -f $i;done
查看列表 过滤不区分大小写exit状态
[root@server1 docker]# for i in `docker ps -a | grep -i exit | awk '{print $1}'`; do docker rm -f $i;done
4.10 容器导入(生成镜像)
docker import 导出的文件名(容器) 指定镜像名称
cat 导出的文件名(容器) | docker import - 指定镜像名称
只会生成镜像,不会生成容器
[root@server1 docker]# docker import hello-world hello-world
[root@server1 docker]# cat nginx_a | docker import - nginx:latest
总结
docker状态
Exitd (0) 正常退出
Exitd (非0值) 异常退出 Exitd (137) 停止容器时出现状态
Created 创建容器
up 容器正常运行时的状态
更多推荐
已为社区贡献1条内容
所有评论(0)