文章目录

  • 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与虚拟机的区别

docker里面服务的安装路径在哪里 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

docker里面服务的安装路径在哪里 docker服务管理_docker_02


docker里面服务的安装路径在哪里 docker服务管理_Docker_03


添加镜像加速地址

docker里面服务的安装路径在哪里 docker服务管理_docker_04


网络优化

[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

docker里面服务的安装路径在哪里 docker服务管理_docker里面服务的安装路径在哪里_05

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                    容器正常运行时的状态