锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

Docker 基础篇

时间:2022-10-18 01:00:00 智能温度变送器ad180fdd260s01传感器

1 Docker特点

  • Build, Ship and Run(施工、运输、运行)

  • Build?once,Run?anywhere(一次建造,到处运行)

  • 解决了运行环境及配置问题软件容器,容器虚拟化技术方便持续集成,有助于整体发布

2 容器部署发展简史

应用部署互联网企业生产环境的过程大致可分为三个阶段:

  • 物理机部署
  • 虚拟机部署
  • 容器化部署

2.1 物理机部署

物理机部署

2.1.1 特点

部署多个应用程序的服务器。

2.1.2 痛点

资源共享问题:进程间资源抢占。如果一个过程消耗了100%CPU资源,其他流程无法提供服务。或者一个过程生成的日志填满磁盘,所有的过程都会挂断。

2.1.3 解决方式

硬件资源在进程间隔离。

2.2 虚拟机部署

2.2.1 特点

虚拟机通过硬件虚拟化,即每台虚拟机提前从物理机分配cpu核数,内存, 磁盘,每台虚拟机一般只部署一个应用程序。从而解决了过程中资源隔离的问题。

2.2.2 痛点

在集群部署的情况下,软件的版本和配置文件容易碎片化:第一次安装应用集群虚拟机时,由于操作系统的镜像相同,软件版本和库依赖性一开始是统一的。但随着时间的推移,开源软件(tomcat, jdk, nginx)需要逐步升级,运维学生开始批量升级集群的软件版本,可能会有遗漏或升级失败。同时,一些开发学生会登录机器修改软件的版本或配置,以满足自己的需要。长此以往,一个应用集群的虚拟机的软件版本和配置逐渐碎片化。当网上出现问题,需要查到基础软件层面时,由于软件版本的碎片化,会使调查变得非常困难。

2.2.3 解决方式

容器技术

2.3 容器化部署

2.3.1 特点

容器技术不限于docker,但是docker目前这里最受欢迎docker为例。docker镜像文件是容器技术的核心之一。

2.3.2 镜像文件

镜像文件:流行的理解是一个集装箱,在过程运行过程中依赖于软件文件。
使用镜像文件:每台机器在应用集群部署时,首先会拉取指定版本的镜像文件。镜像安装后产生docker容器。容器的软件版本与所有机器的镜像文件相同。即使容器的软件版本在开发或运维过程中被修改,软件的变化也会随着容器的销毁而消灭。当应用程序重新部署现有的镜像文件时,生成docker容器与修改前的容器完全相同。如果容器需要升级软件版本,请修改镜像文件。这样,集群中的所有机器在部署时都会重新拉出新的镜像,软件也会一起升级。软件版混乱的问题,到docker在这里,得到了完美的解决。

2.3.3 一个小问题
  • 有了容器技术,为什么生产环境需要部署虚拟机?

由于虚拟功能实现了硬件资源的完全隔离,docker不行。

2.3.4 小总结
  • 传统的虚拟机技术是在虚拟出一套硬件后,在其上运行完整的操作系统,然后在系统上运行所需的应用程序;

  • 容器中的应用过程直接运行在宿主的核心,没有自己的核心或硬件虚拟。因此,它比传统的虚拟机更轻,启动更快;

  • 每个容器之间相互隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。

3 Docker官网

  • Docker官网:https://www.docker.com
  • Docker Hub官网(安装docker镜像仓库):https://hub.docker.com

4 Docker的基本组成

4.1 镜像(image)

  • docker镜像(image)只读模板,镜像可以用来创建docker一个镜像可以创建许多容器。

  • 相当于容器的源代码,docker类似于镜像文件Java类模板,而docker类似于容器实例java中new出来的实例对象。

4.2 容器(container)

4.2.1 从面向对象的角度理解

docker利用容器(container)一个或一组独立运行的应用程序或服务在容器中运行,容器类似于虚拟运行环境,容器是由镜像创建的运行实例。

镜像是静态定义,容器是镜像运行时的实体。

该容器为镜像提供了一个标准和隔离的操作环境,可以启动、停止和删除。每个容器都是一个相互隔离的平台,以确保安全。

4.2.2 从镜像容器的角度理解

容器可以看作是一个简单的版本Linux环境(包括root用户权限、流程空间、用户空间、用户空间和网络空间等。

4.3 仓库(repository)

  • 仓库是集中存储镜像文件的地方。类似于存储jar包的maven仓库、存放git项目的github等等。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

最大的公开仓库也是docker公司提供的官方仓库:Docker Hub,阿里云等国内公开仓库。

5 Docker安装

5.1 注意事项

  • docker它不是一个通用的容器工具,它依赖于现有和运行Linux内核环境。

docker本质上,它已经运行了Linux它创造了一个隔离的文件环境,所以它的执行效率几乎相当于部署Linux主机。

因此,docker必须部署在Linux如果其他系统想部署内核系统,docker虚拟必须安装Linux环境。

注:docker在Windows上依赖WSL(可以理解为一个Windows专用的Linux虚拟机)

5.2 前提条件

  • 目前,CentOS只支持发行版内核支持docker。

操作系统要求

1、CentOS 7或更高版本(不支持存档或测试版本)

2、必须启用CentOS Extras存储库。默认情况下,此存储库已启用,但如果已禁用,则需要 重新启用它。

建议使用存储驱动程序:overlay2

5.3 安装步骤

  • CentOS安装Docker官方文件:引擎:https://docs.docker.com/engine/install/centos
5.3.1 查看操作系统版本
  • 查看操作系统版本,确定是CentOS 7或更高版本
# 查看CentOS的操作系统版本
# CentOS Linux release 7.9.2009 (Core)
cat /etc/redhat-release
5.3.2 卸载旧版本
  • 如果安装了旧版本,先卸载它们以及关联的依赖项

旧版本的引擎包或依赖项:dockerdocker-engine

新版本的引擎包:docker-ce

sudo yum remove docker \
                docker-client \
                docker-client-latest \
                docker-common \
                docker-latest \
                docker-latest-logrotate \
                docker-logrotate \
                docker-engine
  • 上述操作只会删除docker本身,旧版本保存在/var/lib/docker/的内容,包括镜像、容器、卷和网络等会被保留。
5.3.3 安装GCC编译器相关
sudo yum -y install gcc
sudo yum -y install gcc-c++
5.3.4 设置stable镜像仓库
# 配置yum资源库
# 安装yum-config-manager
# yum-util提供yum-config-manager功能 
sudo yum install -y yum-utils

# 在yum资源库中添加docker资源库
# 官方地址(镜像在国外,下载比较慢,不推荐)
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 阿里云镜像(推荐)
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5.3.5 更新yum软件包索引
# 重建软件包索引,建立缓存(可选操作,建议运行,据说后续安装会快一些)
yum makecache fast
5.3.6 安装Docker引擎
  • 默认安装最新版本
# docker-ce是Docker引擎,docker-ce-cli是客户端
# 默认安装的docker引擎、客户端都是最新版本
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
  • 安装指定版本
# 在存储库中列出可用版本,然后选择安装
yum list docker-ce --showduplicates | sort -r

# 如下图,安装指定版本3:20.10.7-3.el7
# sudo yum install docker-ce- docker-ce-cli- containerd.io docker-compose-plugin
# VERSION_STRING:版本号,可用版本列表的第二列
sudo yum install docker-ce-17.09.0.ce docker-ce-cli-17.09.0.ce containerd.io docker-compose-plugin

5.3.7 启动Docker引擎
sudo systemctl start docker

# 启动后查看docker版本,可以看到Server: Docker Engine - Community(Docker守护进程)的版本号
docker version

5.3.8 运行hello-world测试
# 下载镜像hello-world:容器运行时,它会打印Hello from Docker!并退出
sudo docker run hello-world

5.3.9 卸载Docker步骤

1、关闭服务

systemctl stop docker

2、使用yum删除docker引擎

# 卸载 Docker 引擎、CLI、Containerd 和 Docker Compose 包
sudo yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin

3、删除镜像、容器、卷、自定义配置等文件

# 手动删除删除镜像、容器、卷、自定义配置等文件
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

6 配置镜像加速器(以阿里云为例)

6.1 镜像加速器的概念

由于docker的镜像需要从仓库拉取,这个仓库(dockerHub)在国内下载很慢,所以阿里云做了一个镜像加速功能,相当于把dockerHub的仓库拷贝了一份到国内,让国内用户方便下载。

6.2 配置步骤

  • 登录阿里云,进入 控制台 -> 容器镜像服务 -> 镜像工具 -> 镜像加速器
  • 里面提供了一个加速器地址:https://xxxxxxxx.mirror.aliyuncs.com
  • 将该地址配置到docker中:
# 通过修改daemon配置文件 /etc/docker/daemon.json 来使用加速器(初次使用是没有该文件的,直接新建文件即可)
vi /etc/docker/daemon.json

# daemon.json 文件内容
{ 
        
  "registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]  
}
  • 重载 daemon 程序刷新配置,重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker

7 docker run的过程

开始
Docker在本机中寻找该镜像
本机是否有该镜像
以该镜像为模板生产容器实例运行
去Docker Hub上查找该镜像
Hub能否找到该镜像
下载该镜像到本地
报错: 查不到该镜像
以该镜像为模板生成容器实例运行

8 为什么Docker会比VM虚拟机快

8.1 docker有着比虚拟机更少的抽象层

由于docker不需要实现硬件资源虚拟化,运行在docker容器上的程序都是直接使用实际物理机的硬件资源。因此在CPU、内存利用率上docker的效率有明显优势。

8.2 docker利用的是宿主机的内核,而不需要加载操作系统内核

当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。避免了引导、寻址、加载操作系统等比较费时费资源的过程。

当新建一个虚拟机时,虚拟机软件需要加载OS,这个过程耗时是分钟级的;而docker由于直接利用宿主机的操作系统,新建一个docker容器耗时只需几秒钟。

8.3 虚拟机与Docker容器对比

Docker容器 虚拟机(VM)
操作系统 与宿主机共享OS 宿主机OS上运行虚拟机OS
存储大小 镜像小,便于存储和传输 镜像庞大
运行性能 几乎无额外性能损失 操作系统额外的CPU、内存消耗
移植性 轻便、灵活,适应于Linux 笨重,与虚拟化技术耦合度高
硬件亲和性 面向软件开发者 面向硬件运维者
部署速度 快速,秒级 较慢,10s以上

9 Docker常用命令

9.1 Docker命令图

9.2 帮助、启动类命令

# 启动docker
systemctl start docker
# 停止docker
systemctl stop docker
# 重启docker
systemctl restart docker
# 查看docker状态
systemctl status docker
# 设置开机启动
systemctl enable docker
# 查看docker版本信息
docker version
# 查看docker概要信息
docker info
# 查看docker总体帮助文档
docker --help
# 查看docker命令帮助文档
# 例:docker run --help
docker [COMMAND] --help

9.3 镜像命令

9.3.1 查看本地镜像列表
# 查看本地镜像列表
docker images
# 列出本地镜像中 REPOSITORY 为 ubuntu 的镜像列表
docker images ubuntu
# 列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层)
docker images -a
# 只显示镜像ID
docker images -q
# 显示完整的镜像描述
docker images --no-trunc


# 同一仓库源可以有多个 TAG 版本,我们使用 REPOSITORY:TAG 来定义不同的镜像
# 如果不指定镜像的版本标签,默认使用最新版本。例如使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像

  • 列说明
列说明
REPOSITORY 镜像的仓库源
TAG 镜像的版本标签
IMAGE ID 镜像ID
CREATED 镜像创建时间
SIZE 镜像大小
9.3.2 查找镜像
# 查找所有包含 ubuntu 的镜像
docker search ubuntu
# 查找所有包含 ubuntu,且 stars 大于10的镜像
docker search -f stars=10 ubuntu
# 只列出前5个镜像
docker search --limit 5 ubuntu

  • 列说明
列说明
NAME 镜像名称
DESCRIPTION 镜像描述
OFFICIAL 是否 docker 官方发布
STARS 点赞数
AUTOMATED 是否是自动构建的
9.3.3 拉取镜像
# docker pull 镜像名称[:tag]
# 不加tag时,默认下载最新的镜像(即tag为latest)
docker pull ubuntu
9.3.4 删除镜像
# docker rmi 镜像名称
docker rmi ubuntu
# docker rmi (IMAGE ID)
docker rmi ba6acccedd29
# 删除多个镜像,使用空格分隔:docker rmi 镜像1 镜像2 镜像3
docker rmi ubuntu redis
# 强制删除镜像(如果没有删除对应的容器,删除镜像会报错,此时是可以使用-f强制删除的)
docker rmi -f ubuntu
# 删除全部镜像
docker rmi -f $(docker images -qa)
9.3.5 虚悬镜像
  • 概念:仓库名、标签都是的镜像,俗称虚悬镜像(dangling image)
  • 产生原因:这些镜像原本是有镜像名和标签的,随着镜像的维护,发布了新镜像后,由于新旧镜像同名(仓库名、标签均相同),旧镜像名称被取消,从而出现仓库名、标签均为的镜像。这类无标签镜像被称为虚悬镜像
# 查看所有的虚悬镜像
docker images -f dangling=true
# 一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的
# 删除虚悬镜像
docker rmi $(docker images -q -f dangling=true)

9.4 容器命令

9.4.1 新建启动容器
# 新建+启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

启动交互式容器

# 前台交互式启动
# 使用 ubuntu 镜像以交互模式启动一个容器。在容器内执行 /bin/bash(或者bash) 命令
docker run --it ubuntu /bin/bash
docker run --it ubuntu bash
  • 退出交互模式

方式一:在交互shell中输入 exit 即可退回宿主机(这种方式退出后,容器会停止运行)

方式二:使用快捷键 CTRL + P + Q (这种方式退出后容器仍然在运行)

启动守护式容器

# 后台守护式启动
# 大部分情况下,我们的docker服务是在后台运行的,可以通过 -d 指定容器的后台运行模式
# docker run -d 容器ID或容器名称
docker run -d redis

# docker容器后台运行,必须有一个前台进程,这个是docker的机制
# 容器运行的命令如果不是那些一直挂起的命令(如:top、tail等),这样的容器在后台启动后会立即自杀(因为它觉得没事可做了),例如:
docker run -d ubuntu
  • OPTIONS说明

--name:为容器指定一个名称(不指定的话系统会随机生成一个名称)
-d:后台运行容器并返回容器ID,也即启动守护式容器
-i:以交互模式(interactive)运行容器,通常与-t同时使用
-t:为容器重新分配一个伪输入终端(tty),通常与-i同时使用。也即启动交互式容器(前台有伪终端,等待交互)
-e:为容器添加环境变量
-P:随机端口映射。将容器内暴露的所有端口映射到宿主机随机端口
-p:指定端口映射

  • -p参数说明
参数 说明 举例
-p hostPort:containerPort 端口映射 -p 8080:80
-p ip:hostPort:containerPort 配置监听地址 -p 192.0.0.1:8080:80
-p ip::containerPort 随机分配端口 -p 192.0.0.1::80
-p hostPort1:containerPort1 -p hostPort2:containerPort2 指定多个端口映射 -p 6379:6379 -p 3306:3306
9.4.2 列出正在运行的容器
# docker ps [OPTIONS]
# 列出当前所有正在运行的容器
docker ps
# 列出当前所有正在运行的容器+历史上运行过的容器
docker ps -a
# 列出当前所有正在运行的容器+历史上运行过的容器的前2条记录
docker ps -n 2
# 列出当前所有正在运行的容器的容器编号
docker ps -q
  • OPTIONS说明

-a:列出当前所有正在运行的容器+历史上运行过的容器
-l:显示最新创建的容器
-n (num):显示最近创建的前num个容器
-q:只显示容器编号

9.4.3 容器其他启动停止命令
# 启动已经停止的容器
# docker start 容器ID或容器名称
docker start 9e7190eae5bd

# 重启容器
# docker restart 容器ID或容器名称
docker restart redis

# 停止容器
# docker stop 容器ID或容器名称
docker stop 9e7190eae5bd

# 强制停止容器
# docker kill 容器ID或容器名称
docker kill 9e7190eae5bd

# 删除已停止的容器
# docker rm 容器ID或容器名称
docker rm 9e7190eae5bd
# 强制删除正在运行的容器
# docker rm -f 容器ID或容器名称
docker rm -f 9e7190eae5bd
# 一次删除所有容器实例(谨慎操作)
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm -f
9.4.4 查看容器日志
# docker logs [OPTIONS] 容器ID或容器名称
docker logs 9e7190eae5bd
# 跟踪日志输出
docker logs -f 9e7190eae5bd
# 跟踪日志输出(带时间戳)
docker logs -tf 9e7190eae5bd
# 显示最后5行日志
docker logs -n 5 9e7190eae5bd
docker logs --tail 5 9e7190eae5bd

# 例
# 新建容器并以后台方式启动,执行每5秒打印日志的命令
# 注:sh -c 命令,它可以让 bash 将一个字串作为完整的命令来执行
docker run -d ubuntu /bin/sh -c "while true;do echo hi;sleep 5;done"
# 跟踪日志输出(-f和-tf的区别)
docker logs -f --tail 5 cd0a7ba8d0b5
docker logs -tf --tail 5 cd0a7ba8d0b5

9.4.5 查看容器内运行的进程
# docker top 容器ID或容器名称
docker top 9e7190eae5bd
9.4.6 查看容器内部细节(元数据)
# docker inspect 容器ID或容器名称
docker inspect 9e7190eae5bd
9.4.7 进入正在运行的容器并以命令行交互
# 第一种方式
# docker exec -it 容器ID bashShell
docker exec -it e863a5ed312a /bin/bash 

# 第二种方式
# docker attach 容器ID
# 如果有多个终端,都对同一个容器执行了 docker attach,就会出现类似投屏显示的效果。一个终端中输入输出的内容,在其他终端上也会同步的显示
docker attach e863a5ed312a
  • 上述两种方式的区别

exec 是在容器中打开新的终端,并且可以启动新的进程,此时用 exit 退出,不会导致容器的停止。

attach 直接进入容器启动命令的终端,不会启动新的进程,此时用 exit 退出,会导致容器的停止。

  • 推荐使用 docker exec 命令,因为退出容器终端,不会导致容器的停止

以redis为例(进入 redis 服务)

  • 一般先用 -d 后台启动程序,再用 exec 进入对应容器实例
# 方式一
# 先进入容器交互 shell
docker exec -it 7bba30997546 /bin/bash
# 再运行 redis-cli 进入 redis 服务
redis-cli

# 方式二
# 直接以命令 redis-cli 进入 redis 服务
docker exec -it 7bba30997546 redis-cli

9.4.8 容器与宿主机的文件拷贝

容器文件拷贝到宿主机

# docker cp 容器ID:容器内路径 宿主机路径
docker cp 7d13af0831da:/tmp/test.txt /root/test/

宿主机文件拷贝到容器

# docker cp 宿主机路径 容器ID:容器内路径
docker cp /root/test/test2.txt 7d13af0831da:/tmp/

9.4.9 导入和导出容器

export:导出容器的内容流作为一个tar归档文件(对应 import 命令)

import:从tar归档文件中创建一个新的文件系统再导入为镜像(对应 export 命令)

# 导出
# docker export 容器ID > 文件名.tar
docker export 7d13af0831da > test3.tar

# 导入
# cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
cat test3.tar | docker import - zhoulx/test3:1.0.1

9.5 Docker 磁盘空间相关命令

9.5.1 查看镜像、容器、数据卷所占空间
# 查看镜像(Images)、容器(Containers)、本地数据卷(Local Volumes)的空间占用情况
docker system df
# 通过-v参数进一步查看空间占用细节
docker system df -v

  • 列说明
列说明
TYPE Images - 镜像
Containers - 容器
Local Volumes - 本地数据卷
TOTAL 总数
ACTIVE Images - 存在对应容器实例的镜像数量
Containers - 活跃的容器数量
Local Volumes - 被容器关联引用的卷的数量
SIZE 占用空间大小
RECLAIMABLE 可清理的空间

  • Image space usage 列说明
列说明
SHARED SIZE 指的是当前镜像与另一个镜像的共享空间大小(例如图中的 myubuntu 是在 ubuntu 镜像基础上制作的,他们的共享数据就是 ubuntu 镜像的大小)
UNIQUE SIZE 仅由当前镜像使用的空间大小
CONTAINERS 当前镜像对应容器实例的数量
  • Local Volumes space usage 列说明
列说明
LINKS 关联引用该卷的容器数量
9.5.2 清理磁盘空间

自动清理

# 清理磁盘,删除关闭的容器、无用的网络,以及虚悬镜像
docker system prune
# 更彻底地清理磁盘,会将没有容器使用的Docker镜像也一起删掉
docker system prune -a
# 忽略告警询问,直接删除
docker system prune -f

手动清理

  • 镜像清理
# 删除所有虚悬镜像,不会删除未使用的镜像
docker rmi $(docker images -q -f dangling=true)
# 删除所有未使用镜像
# 该命令轮询到在使用的镜像时,会有"container xxxx is using its referenced image xxxx"的报错信息,所以不会被删除
docker rmi $(docker images -q)
  • 容器清理
# 对于已停止或其它异常状态的容器,可以结合 -f 或 --filter 筛选器来处理
# rm -v 删除与该容器关联的匿名卷
# 删除所有已退出的容器
docker rm -v $(docker ps -aq -f status=exited)
# 删除所有状态为 dead 的容器
docker rm -v $(docker ps -aq -f status=dead)
  • 卷清理
# 删除所有未使用的本地卷
docker volume prune
# 删除所有未被任何容器关联引用的卷
docker volume rm $(docker volume ls -qf 元器件数据手册IC替代型号,打造电子元器件IC百科大全!
          

相关文章