docker基本原理与安装

82 阅读11分钟

前言

Docker 是在 Linux 容器里运行应用的一种开源工具,是一种轻量级的虚拟机。把容积化技术做成了标准化平台。

一、Docker 概述

Dcoker是基于容器技术的轻量级虛拟化解决方案,docker是由容器引擎,把linux的cgroup、namespaces等容器底层技术进行完美的封装、并抽象为用户提供创建和管理容器的便捷界面(命令行Cli、api等) C/s

1.虚拟化三种模式

全虚拟化(50%)

半虚拟化(软、硬件结合的方式)

直通(以全硬件的方式实现虚拟化的功能)

2.虚拟化功能

在一个操作系统内,模拟多个操作系统

以软件的方式模拟物理设备的功能

3.三个层面

操作系统层

抽象层

内核层

4.Docker三要素

镜像:模板。组资源集合,包含了应用程序软件包、应用程序相关的依赖包、运行应用程序所需要的基础环境(泛指操作系统环境),可以理解为容器的模板

容器:基于镜像的一种运行时状态

仓库:存放image镜像模板;仓库分类: 公共仓库一》docker hub,私有仓库registry harbor

二、Docker容器概述

1.底层原理

(1)名称空间( Namespaces):提供容器的隔离工作区的技术

容器完美的实现了6个名称空问隔离(namespace资源隔离-用容器化技术封装)

(2)控制组(Control groups):资源管理功能,将应用程序限制为一组特定的资源

控制组允许Docker Engine将可用的硬件资源共享给容器,并有选择地实施限制和约束

linux六大namespace(命名空间):

namespace系统调用参数隔离内容
UTSCLONE_NEWUTS主机名和域名
IPCCLONE_NEWWIPS信号量,消息队列和共享内存
PIDCLONE_NEWPID进程编号
NETWORKCLONE_NEWNET网络设备,网络栈,端口等
MOUNTCLONE_NEWNS挂载点(文件系统)
USERCLONE_NEWUSER用户和用户组(3.8以后的内核才支持)

2.Docker和虚拟化的区别

特性Docker 容器虚拟机虚拟化
启动速度秒级分钟级
运行性能接近原生(直接在内核中运行)10%-20%50%左右损失
磁盘占用50-100MB3-5G
数量成百上千,每个进程可控制一个容器几十个
隔离性进程级别操作系统(更彻底)
操作系统主要支持Linux几乎所有
封装程度只封装目标代码和依赖关系,共享宿主机内核完整的操作系统,与宿主机隔离

3.使用docker有什么意义

相同版本的docker引擎

打包成镜像包,拖到另一个操作系统中(把引擎放在镜像中,带着镜像到处跑)

利用引擎把这个镜像再去运行为之前的相同的一模一样的容器了

镜像——>封装的某一时刻的服务/应用状态

容器——>应用跑起来的状态(正常提供服务的状态—运行时running)

4.docker的应用场景

打包应用程序简单部署。

可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦)例如:需要把服务器从腾讯云迁移到阿里云,如果采用的是 Docker 容器技术,整个迁移的过程只需要在新的服务器上启动我们需要的容器就可以了。

5.Docker引擎( Docker Engine)

Docker Engine是具有以下主要组件的C/S客户端—服务器应用程序

server端:服务器是一种长期运行的程序,称为守护程序进程(dockerd命令)

CLIENT端: REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口 通过client客户端传入命令,比如以下:

  • docker run:运行
  • docker start:开启
  • docker rm:删除
  • 与sever端进行交互,控制server端进行应命令的操作

三、安装Docker

1.关闭防火墙策略

#关闭防火墙和selinux  
systemctl stop firewalld.service  
setenforce 0

image.png

2.安装依赖包

#安装依赖包

yum install -y yum-utils device-mapper-persistent-data lvm2
--------------------------------------------------------------------------------------------
#yum-utils:提供了 yum-config-manager 工具。 
#device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
#device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
--------------------------------------------------------------------------------------------

image.png

#设置阿里云镜像源 
yum-config-manager --add-repo <https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo>

image.png

3.安装docker-ce社区版

#安装 Docker-CE并设置为开机自动启动 
yum install -y docker-ce docker-ce-cli containerd.io
#docker-ce-cli、containerd.io 会作为依赖包被安装

systemctl start docker.service

systemctl enable docker.service

image.png

image.png

4.相关命令–查看

安装好的Docker系统有两个程序,Docker服务端和Docker客户端。其中Docker服务端是一个服务进程,负责管理所有容器。 Docker客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下Docker服务端和客户端运行在一台机器上。

 #查看 docker 版本信息
 docker version
 #注意:Yum安装默认安装最新版本,目前最新版本是2020版本。但工作中不会用这么新的版本,前一个版本是2019版本。
 
 #docker信息查看
 docker info
 //查看的部分信息如下:
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Docker Buildx (Docker Inc., v0.9.1-docker)
  scan: Docker Scan (Docker Inc., v0.23.0)

 
 Server:
  Containers: 0                #容器数量
   Running: 0
   Paused: 0
   Stopped: 0
  Images: 0                    #镜像数量
  Server Version: 20.10.22     #server版本
  Storage Driver: overlay2     #docker使用的是overlay2 文件驱动
   Backing Filesystem: xfs     #宿主机上的底层文件系统
   Supports d_type: true
   Native Overlay Diff: true
   userxattr: false
  Logging Driver: json-file
  Cgroup Driver: cgroupfs      #cgroups 驱动,默认为cgroupfs,也可以修改为systemd
  Cgroup Version: 1
  Plugins:
   Volume: local
   Network: bridge host ipvlan macvlan null overlay
   Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
  Swarm: inactive
 

image.png

image.png

四、Docker镜像操作

#搜索镜像 
格式:docker search 关键字 
docker search nginx

image.png

#获取镜像 
格式:docker pull 仓库名称[:标签] 
#如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest 标签。 
docker pull nginx

image.png

#镜像加速下载 浏览器访问 <https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors> 获取镜像加速器配置

mkdir -p /etc/docker 
tee /etc/docker/daemon.json <<-'EOF' 
{ 
"registry-mirrors": ["<https://ae3f5qei.mirror.aliyuncs.com>"] 
} 
EOF 
systemctl daemon-reload 
systemctl restart docker

image.png

#查看镜像信息 镜像下载后存放在 /var/lib/docker 。 Docker 相关的本地资源存放在 /var/lib/docker/ 目录下,其中 containers 目录存放容器信息,image 目录存放镜像信息,overlay2 目录下存放具体的镜像底层文件。

#查看下载的镜像文件信息 
cat /var/lib/docker/image/overlay2/repositories.json

image.png

#查看下载到本地的所有镜像 
docker images
-----------------------------------------------------------  
REPOSITORY:镜像属于的仓库;  
TAG:镜像的标签信息,标记同一个仓库中的不同镜像;  
IMAGE ID:镜像的唯一ID 号,唯一标识一个镜像;  
CREATED:镜像创建时间;  
VIRTUAL SIZE:镜像大小;

image.png

image.png #根据镜像的唯一标识 ID 号,获取镜像详细信息 格式:docker inspect 镜像ID号

docker inspect a99a39d070bf

image.png

#为本地的镜像添加新的标签 
格式:docker tag 名称:[标签] 新名称:[新标签] 
docker tag nginx:latest nginx:new

docker images | grep nginx

image.png

 #删除镜像
 格式:
 docker rmi 仓库名称:标签              
 #当一个镜像有多个标签时,只是删除其中指定的标签
 ​
 或者
 docker rmi 镜像ID号 [-f]                       
 #会彻底删除该镜像,注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。#如果镜像id有多个标签得加上-f
 
 docker rmi nginx:new
 

image.png

#存出镜像:将镜像保存成为本地文件 
格式:docker save -o 存储文件名 存储的镜像  

docker save -o nginx nginx:latest 
#存出镜像命名为nginx存在当前目录下 ls -lh

image.png

#载入镜像====:将镜像文件导入到镜像库中 
格式: docker load < 存出的文件 
或者 docker load -i 存出的文件

docker load < nginx

image.png

#上传镜像 
#默认上传到 docker Hub 官方公共仓库,需要注册使用公共仓库的账号。<https://hub.docker.com> 可以使用 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。 在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用 docker push 命令进行上传。

docker tag nginx:latest soscscs/nginx:web 
#添加新的标签时必须在前面加上自己的dockerhub的username 
docker login 
#登录公共仓库 
Username:soscscs 
password:abc123456 
docker push soscscs/nginx:web #上传镜像

image.png

image.png

五、Docker 容器操作

容器创建:就是将镜像加载到容器的过程。

新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。

格式:docker create [选项] 镜像 
常用选项: 
-i:让容器开启标准输入 
-t:让 Docker 分配一个伪终端 
-it :合起来实现和容器交互的作用,运行一个交互式会话 shell

docker create -it nginx:latest /bin/bash

image.png

查看容器的运行状态

 docker ps -a [q]            
 #-a 选项可以显示所有的容器,不加-a显示运行容器状态
 #-q 查看id号
 -----------------------------------------------------------------
 docker ps -a字段解释
 CONTAINER ID 容器的ID号
 IMAGE:加载的镜像
 COMMAND:运行的程序
 CREATED:创建时间
 STATUS:当前的状态
 PORTS:端口映射
 NAMES:名称
 

image.png

启动容器

格式:docker start 容器的ID/名称 

docker start d90f9757a234 
docker ps -a

image.png

创建并启动容器

可以直接执行 docker run 命令, 等同于先执行 docker create 命令,再执行 docker start 命令。 注意:容器是一个与其中运行的 shell 命令共存亡的终端,命令运行容器运行, 命令结束容器退出。

docker 容器默认会把容器内部第一个进程,也就是 pid=1 的程序作为docker容器是否正在运行的依据,如果docker容器中 pid = 1 的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉。

当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是:

  • (1)检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
  • (2)利用镜像创建并启动一个容器;
  • (3)分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
  • (4)从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
  • (5)分配一个地址池中的 IP 地址给容器;
  • (6)执行用户指定的应用程序,执行完毕后容器被终止运行。
docker run centos:7 /usr/bin/bash -c ls / 
docker ps -a 
#会发现创建了一个新容器并启动执行一条 shell 命令,之后就停止了

image.png

docker run -itd --name test1 centos:7 /bin/bash 
#创建容器并持续运行容器

image.png

终止容器运行

格式:docker stop 容器的ID/名称 

docker stop 
docker ps -a

image.png

容器的进入

需要进入容器进行命令操作时,可以使用 docker exec 命令进入运行着的容器。

格式:docker exec -it 容器ID/名称 /bin/bash 
#-i 选项表示让容器的输入保持打开 
#-t 选项表示让 Docker 分配一个伪终端

docker start bc8366f9680a 
#进入容器前,确保容器正在运行 
docker exec -it bc8366f9680a /bin/bash 
ls 
exit 
#退出容器后,容器仍在运行 
docker ps -a

docker run -it centos:7 bash 
#不加 -d 选项会创建容器后直接进入容器,但是退出容器,容器也会停止

image.png

image.png

容器的导出与导入

用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export 命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。

#导出格式:docker export 容器ID/名称 > 文件名 
docker export 6b22573f8285 > centos7.tar

#导入格式:cat 文件名 | docker import – 镜像名称:标签 
cat centos7.tar | docker import - centos7:test 
#导入后会生成镜像,但不会创建容器

image.png

容器与宿主机之间的数据拷贝——docker cp

使用 docker cp拷贝
 
 #容器复制到主机
 格式:docker cp 容器ID/名称:路径   主机路径
 docker cp 2592d3fad0fb:/opt/test.txt /opt/abc123.txt
 
 #主机复制到容器
格式: docker 主机路径  容器ID/名称:路径
docker cp /opt/test.txt 2592d3fad0fb:/opt/

删除容器

格式:docker rm [-f] 容器ID/名称 
docker stop bc8366f9680a 
docker rm bc8366f9680a 
#删除已经终止状态的容器

docker rm -f 6b22573f8285 
#强制删除正在运行的容器

docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash 
或
docker ps -a | awk 'NR>=2{print $1}'| xargs docker stop
#批量停止容器

docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash 
或
docker ps -a | awk 'NR>=2{print $1}'| xargs docker rm
#批量删除所有容器 

docker images | awk 'NR>=2{print "docker rmi "$3}' | bash 
#批量删除镜像 

docker images | grep none | awk '{print $3}' | xargs docker rmi 
#删除none镜像

docker rm $(docker ps -a -q) 
#批量清理后台停止的容器

image.png

image.png

总结

镜像管理命令

 docker search [仓库/镜像名]      #搜索镜像
 docker pull [仓库/镜像名]        #获取镜像
 docker images                  #查看本地镜像
 docker inspect [镜像ID]         #查看镜像的详细信息
 docker rmi [镜像ID/镜像名称:标签] -f        #删除镜像
 docker save -o 镜像文件.tar 镜像名称:标签    #生成镜像文件
 docker load -i[或<] 镜像文件               #加载镜像文件     
 docker push 仓库名/镜像名:标签              #推送镜像到仓库
 docker tag 库名:标签 新库名/新标签           #修改库名及标签
复制代码

总结容器管理命令

 docker create -i [--name=容器名称]镜像名      #创建容器
 docker create -it [--name=容器名称] 镜像名<命令>  
 docker start <容器ID/名称>                   #开启容器
 docker ps -a                                #查看所有容器状态
 docker stop <容器ID/名称>                    #关闭容器
 docker rm <容器ID/名称> [-f]                 #删除容器
 docker rm $(docker ps -aq)                  #批量删
 docker rmi $(docker images -q) -f           #批量删
 docker run [--name] -id                     #创建并运行
 docker exec -it <容器ID/名称> bash|sh         #进入容器
 docker logs 容器ID/名称                       #查看容器日志
 docker cp 容器ID/名称:路径                     #将容器内文件复制到宿主机
 docker export 容器ID/名称 > 导出文件            #容器的导出
 cat 导出文件 | docker import - 镜像名称:标签    #容器导入