Docker实战-基础篇

1,805 字 · 约 6 分钟Docker#Docker#容器#云原生#镜像

Docker实战-基础篇

一、概述

Docker为什么出现

在没有Docker的时候,开发和运维、测试的本地运行环境可能各不相同,这样就导致开发人员可以正常运行的应用到运维、测试人员的环境就不可用

解决这个问题的思路就是将应用与本地环境隔离起来,将应用需要的环境与应用本身打包在一起,即容器虚拟化技术

将应用与相关配置、环境打包在一起就形成了一个镜像文件

Docker理念

一次镜像,处处运行

与传统虚拟技术的区别

传统虚拟机会虚拟出硬件

  • 资源占用多
  • 冗余步骤多
  • 启动慢

由于这些缺点,Linux发展出了另一种虚拟化技术

Linux容器,简称LXC

Linux容器适于系统其他部分隔离开的一系列进程,由该镜像提供进程所需的全部文件,容器提供的镜像包含了应用的全部依赖项,因而从开发到测试再到部署都具有可移植性和一致性

Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离,有了容器就可以将软件运行所需的所有资源打包到一个隔离的容器中

容器与虚拟机不同,它不需要捆绑一整套操作系统

比虚拟机快主要有两大原因:

  • 比虚拟机拥有更少的抽象层
  • Docker利用的是宿主机的内核,不需要加载OS

带来的变化

  • 从coder->programmer->software engineer->devops
  • 更快速的应用交付和部署
  • 更方便的应用升级和扩缩容
  • 更简单的系统运维
  • 更高效的计算资源利用

二、安装

三、常用命令

帮助启动类

  • 启动Docker:systemctl start docker
  • 停止Docker:systemctl stop docker
  • 重启Docker:systemctl restart docker
  • 查看Docker状态:systemctl status docker
  • 开启启动:systemctl enable docker
  • Docker概要信息:docker info
  • 查看Docker总体帮助文档:docker --help
  • 查看Docker命令帮助文档:docker xx --help

镜像命令

  • docker images
  • docker search
  • docker pull
  • docker system df:查看镜像、容器、数据卷所占的空间
  • docker rmi:删除镜像

[root@localhost logs]# docker system df TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 6 4 2.08GB 308.2MB (14%) Containers 11 0 1.984GB 1.984GB (100%) Local Volumes 9 5 998.2MB 209.1MB (20%) Build Cache 0 0 0B 0B

虚悬镜像:仓库名和TAG都是NONE的镜像

容器命令

  • docker run [option] image [command] [args...]
  • docker exec [OPTIONS] CONTAINER COMMAND [ARG...]:该命令用于在运行中的容器内执行一个新的命令。这对于调试、运行附加的进程或在容器内部进行管理操作非常有用。
    • -i:保持标准输入打开
    • -t:分配一个伪终端
    • -d:后台运行
    • -u:以指定用户运行
    • -w:指定工作目录
  • docker ps
  • docker top
  • docker attach
  • docker logs [OPTIONS] CONTAINER:用于获取和查看容器的日志输出。
    • -f:跟随日志输出,类似于tail -f
    • --since:从指定时间显式日志
    • -t:显示日志时间戳
    • --tail n:仅显示日志的最后n行,n可以省略
    • --details:显示提供给日志的额外详细信息
    • --until:显示直到指定时间
  • docker inspect [OPTIONS] NAME|ID [NAME|ID...]:用于获取 Docker 对象(容器、镜像、卷、网络等)的详细信息。返回 JSON 格式的详细信息,可以帮助用户了解对象的配置和状态。
    • -f:使用Go模板语法格式化输出
    • --type:返回指定类型的对象信息

四、Docker镜像

Docker镜像是一种轻量级、可运行的独立软件包

只有通过这个镜像才能生成容器实例

镜像分层

以pull为例,在下载的过程中可以看到Docker的镜像是分层下载的

使用镜像分层的根本目的在于复用

比如有多个镜像都从相同的base镜像构建而来,那么Docker Host只需要在磁盘上保存一份即可,同时内存中也只加载一份base镜像,就可以为所有容器服务了,而且镜像的每一层都可以被共享

联合文件系统UnionFS

是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下

Union文件系统是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体应用的镜像

特性:一次同时加载多个文件系统,但从外面看来只能看到一个文件系统,联合加载会把各层文件叠加起来,这样最终的文件系统会包含所有底层的文件和目录

Docker镜像加载原理

BootFS(boot file System)主要包含bootloader和kernel,bootloader主要引导加载kernel,Linux刚启动的时候会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs,这一层与典型的Linux系统是一样的,包含boot加载器和内核

当boot加载完成之后,整个内核就在内存中了,此时内存的使用权由bootfs交给内核,同时也会卸载bootfs

rootfs(root file system),在bootfs之上,包含的就是典型Linux系统中的诸如/dev、/proc等标准目录和文件,rootfs就是各种不同的操作系统发行版,比如Ubuntu、CentOS等

对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库即可,因为底层直接使用Host的Kernel,自己只需要提供rootfs即可,因此,对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别

Docker镜像层都是只读的,容器层是可写的

当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称为容器层,容器层之下的都叫镜像层

所有对容器的改动都只会发生在容器层

Docker镜像commit

docker commit命令用于提交容器副本使之成为一个新的镜像

docker commit -m “提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[tag]

例如:

docker commit -m="vim" -a="wang" 06a31e0193ca wang/ubuntu:1.0

本地镜像发布到阿里云

步骤:

  • 创建镜像仓库

  • 选择个人实例

  • 命令空间创建

在本地虚拟机中执行:

  • docker login
  • docker tag
  • docker push

阿里云镜像下载到本地

docker pull ****/ubuntu:[镜像版本号]

本地镜像发布到私有库

官方DockerHub访问太慢,阿里云又不保险

所以需要创建一个本地私有仓库给团队使用

Docker Registry是官方提供的工具,用于构建私有仓库地址

步骤:

下载镜像Docker Registry:

docker pull registry

运行私有库Registry,相当于本地有个私有Docker Hub:

docker run -d -p 5000:500 -v /docker/myrepo/:/tmp/registry --privileged=true registry

使用commit命令,创建镜像

docker commit -m="test" -a="wang" ccccfec8e588 myredis:1.9

验证私服库上有什么镜像

curl -XGET http://192.168.231.130:5000/v2/_catalog_