Linux——Docker安装及镜像容器基本操作
Posted 孤岛上的笛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux——Docker安装及镜像容器基本操作相关的知识,希望对你有一定的参考价值。
目录标题
背景概述
以Linux而言,Linux操作系统会有一个主进程pid=1派生出其他进程来控制不同服务
例如:pid=2 -->Python pid=3–>Java pid=4–>php,三个服务可能会互相影响
使用者期望将这三个不同的服务,跑在不同的运行时环境中实现互相不影响,同时不会增加服务器成本。
因此在发展过程中延伸出,能否将这三种服务分别封装起来即KVM虚拟技术,实现了一个操作系统模拟多个多个操作系统/不同的运行时环境
随着技术发展,虚拟化技术开销较大(只要运行一个py脚本,想要使用虚拟化方式实现,还需要安装一个操作系统,并不方便/合理)
则延伸出容器技术
虚拟化层的抽象层(用户层)剥离,使用docker engine
来代替(来宾操作系统去除),只要通过引擎就可以直接连接到宿主机操作系统中,极大减小了开销。
如何实现应用和应用的隔离
应用和应用的隔离,如何进行判断
以操作系统维度
应用于应用隔离,在操作系统中,是通过namespaces(名称空间、命名空间)实现的,只要实现以下6个空间隔离,才能认为两个应用实现了完全/完整隔离
容器隔离了6个名称空间(namespace资源隔离-用容器化技术封装)
mount 文件系统,挂载点——一个文件系统内,不能重复挂载一个指定目录
user 操作进程的用户和用户组
pid 进程编号
uts 主机名和主机域
ipc 信号量、消息队列,共享内存(理解,不同的应用调用内存资源的时候应该使用不同的内存空间)
net 网络设备、网络协议栈、端口等
该pid命名空间:进程隔离(PID:进程ID)
该net命名空间:管理网络接口(NET:网络)
该ipc命名空间:管理访问IPC资源(IPC:进程间通信)
该mnt命名空间:管理文件系统挂载点(MNT:mount)
该uts命名空间:隔离内核和版本标识符(UTS:unix时间共享系统)
是一种轻量级的“虚拟机”
在Linux容器里运行应用的开源工具
Docker核心概念
镜像:
一个面向Docker容器引擎的只读模板
容器:
从镜像创建的运行示例
仓库:
集中保存镜像的地方
要求:内核在3.8以上(排除了centos6)因为在最晚的一个名称空间开发出来是在3.8版本
docker 1.3版本迭代docker-ce decker-ee 1.7版本因为企业版和社区版
Docker使用场景
打包应用程序简单部署
可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦),例如:服务器从腾讯云迁移到阿里云
持续集成和持续交付(CI/CD):开发到测试发布
部署微服务
提供PAAS产品(平台即服务)OpenStack的云主机类似于阿里云的ECS,属于IAAS、Docker(K8S)属于PAAS
Docker引擎
Docker Engine是具有以下主要组件的C/S客户端-服务器应用程序:
server端:服务器是一种长期运行的程序,称为守护程序进程()(dockerd命令)
client端:rest apl,他指定程序可以用来与守护程序进行通信并指示其操作的接口
Docker的架构
Docker使用客户端-服务器架构。docker客户端与docker守护进程进行对话,该守护进程完成了构建,运行和发布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:镜像
容器可以被打包成镜像:一组资源集合,包含了应用程序软件包、应用程序相关的依赖包、运行应用程序所需要的基础环境(泛指操作系统环境)
Docker container:容器
基于镜像的一种运行时环境
Docker registry:镜像仓库
存储镜像的地方,默认在公共仓库(Docker Hub)上查找,也可以搞个人/私有仓库(docker-harbor)
区别
不同点 | container | VM |
---|---|---|
启动速度 | 秒级 | 分钟级 |
运行性能 | 接近原生(直接在内核中运行) | %左右损失 |
磁盘占用 | MB | GB(操作系统镜像2G) |
数量 | 成百上千 | 一般几十台 |
隔离性 | 进程级别 | 系统级别(更彻底) |
操作系统 | 主要支持Linux | 几乎所有 |
封装程度 | 只打包项目代码和依赖关系,共享宿主机内核 | 完整的操作系统,与宿主机隔离 |
问:docker和vm解决了虚拟机的什么问题
vm:没什么好讲的
docker解决了vm的一个环境孤岛的问题,docker可以自定义传参(创建镜像\\容器、启动(基于镜像启动)之前)
一张图带你看懂docker和传统KVM虚拟化的区别:
控制组
Linux上的Docker引擎还依赖于另一种称为控制组
(cgroups)的技术。cgroups将应用程序限制为一组特定的资源,控制组允许Docker Enginc将可用的硬件资源共享给容器,并有选择地实施限制和约束。例如:可用限制特定容器可用内存
总结
Docker有着很好的隔离效果正常如果需要运行一个py脚本的话还要有对应的操作系统对应的环境来实现虽然虚拟化技术可以做到但是为了这点小事还要再专门搞一个虚拟机所麻烦多浪费资源,而docker直接通过引擎就可以实现,通过镜像创建容器来达到对应的环境
小结:
docker是容器引擎,把Linux的cgroup(资源管理技术)、namespace(命名空间)等容器底层技术进行完美的封装、并抽象为用户提供创建和管理容器的边界界面(命令行Cli、api等)
问:docker和虚拟化比有什么优势?
docker把容器化技术做成了标准化平台(docker统一/指定了容器化技术的标准化平台)
docker引擎统一了基础设置环境-docker环境(可以在image里面封装一个简易的操作系统)
docker引擎统一了程序打包(装箱)方式-docker镜像(装箱即构建imags镜像)
docker引擎统一了程序部署(运行)方式-docker容器
实现了一次构建、多次多处使用
问:docker和vm解决了虚拟机的什么问题
vm:没什么好讲的
docker解决了vm的一个环境孤岛的问题,docker可以自定义传参(创建镜像\\容器、启动(基于镜像启动)之前)
CentOS安装Docker
部署20版的docker
安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
设置阿里云镜像
cd /etc/yum.repos.d
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker-ce 社区版
yum install -y docker-ce
环境配置
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
vim /etc/selinux/config
SELINUX=disabled
启动docker
systemctl start docker
systemctl enable docker
镜像加速
在控制台搜索容器镜像服务
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
systemctl restart network
systemctl restart docker
生产环境配置文件
vim /etc/docker/daemon.json
docker配置文件
"graph":"/data/docker",
"storage-driver":"overlay2",
"insecure-registries":["registry.access.redhat.com","quary.io"]
"reqistry-mirrors":["https://q"]
"bip":"172.7.5.1/24",
"exec-opts":["native.cgroupdriver=systemd"],
"live-restore":true
以上是建议的配置项
docker容器网络生产经验
docker的网络建议和宿主机的IP“对照”
比如宿主机 10.2.5.6 容器的地址就可以修改为172.5.6.1 这样方便在故障发生时,更容易定位故障节点位置
"graph":"/data/docker",
数据目录
"storage-driver":"overlay2",
存储引擎
"insecure-registries":["registry.access.redhat.com","quary.io"]
私有仓库
"reqistry-mirrors":["https://q"]
镜像加速
"bip":"172.7.5.1/24",
docker网络
"exec-opts":["native.cgroupdriver=systemd"],
启动时候的额外参数(驱动)
"live-restore":true
当docker容器引擎挂掉的时候,使用docker跑起来的容器还能运行(分离)
systemctl daemon-reload
systemctl restart docker
镜像操作
docker run hello-world
1.docker client
客户端连接到了服务器(服务端是以一个守护进程的形式跑在操作系统里面的)
典型的C/S架构
2.由docker服务端的守护进程从docker hub上下载了镜像
3.服务端创建了一个新的容器,然后从拉取的这个镜像启动了一个容器,容器执行了脚本/可执行程序让我们可以查看/使用
4.docker
服务端把这些信息流(传递)返回到客户端并展现出来,(展示在终端上)docker client 可以是多种形式,比如“docker”命令工具所在的终端
查询docker版本
docker version && docker info
搜索镜像
docker search nginx
docker search centos:7
指定搜索版本
下载镜像
docker pull 镜像名称
docker pull nginx
查看镜像列表
docker images
查看当前docker下的下载镜像信息
获取镜像信息
docker inspect 镜像ID
添加镜像标签
docker tag nginx:latest nginx:v1
删除
docker rmi 镜像名称
docker rmi 镜像标签
docker rmi 镜像ID
三种方式,但正在运行的镜像无法删除需关闭
镜像导出
docker save -o 文件名 镜像名
文件名这里可以指定路径
示例
docker save -o nginx_docker nginx:latest
镜像导入
docker load < nginx_docker
通过导入的方式是加载速度很快
使用场景,有的生产环境,企业不直接使用docker私有仓库,而是存放在一个ftp服务器中,按需上传下载
容器操作
查询容器
docker ps -a
创建容器
docker create -it nginx:latest /bin/bash
-i 让容器的标准输入保持打开
-t 分配一个伪终端
-d 后台守护进程的方式运行
启动容器
docker start 容器ID
启动容器(一次性执行)
docker run centos:7 /usr/bin/bash -c ls /
停止容器
docker stop 容器ID
持续后台运行
docker run -d centos:7 /bin/bash -c "while true;do echo hello;done"
分配一个循环一直执行
持续查看容器
watch -n 2 docker ps -a
两秒看一次
进入容器
①使用run
docker run -it nginx:latest /bin/bash
②exec(容器必须为开启状态)
docker exec -it 容器ID /bin/bash
容器导出
docker export 容器ID > 文件名
示例
docker export 容器ID > nginx_a
容器导入(生成镜像)
docker import 导出的文件名(容器)指定镜像名称
示例
docker import nginx_a nginx:latest
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 -aq)
批量删除“exit”状态的容器
for i in $(docker ps -a| grep -i exit | awk 'print $1');do docker rm -f $i;done
以上是关于Linux——Docker安装及镜像容器基本操作的主要内容,如果未能解决你的问题,请参考以下文章