• Docker学习_镜像和容器篇


    简介

    Docker是一种容器化的技术,可以实现在一台宿主机电脑上运行多个不同的容器,每个容器之间都相互独立,具有完整的一套文件,网络和端口。

    可以将其理解为一种虚拟机技术,只不过和VMware等虚拟化技术不同,docker共享宿主机的操作系统,只创建应用和应用运行的依赖。这样就大大减少了每个容器的体积。这样容器部署和启动速度更快,开销更小,也更容易迁移。

    工作流程

    Docker是一个CS架构的软件,客户端通过docker api与服务端进行交流,并由服务端完成docker的相关操作。

    Docker操作中主要涉及如下几个概念:

    • 仓库(registry): 存储docker镜像的远程仓库,通常为docker hub
    • 镜像(image): 创建容器的模板,类似于VM中的虚机模板
    • 容器(container): 应用实际运行的地方,类似于VM中的一个虚拟机

    创建docker容器的步骤如下:

    1. 从远程仓库拉取镜像
    2. 利用镜像生成容器

    安装Docker Desktop

    Docker Desktop中包含了Docker引擎,Docker命令行客户端,Docker扩展工具,Docker Compose等,并支持图形显式,针对入门学习是一个不错的工具。

    首先根据各自的操作系统,在Docker官网下载应用安装包。此处以Windows系统为例进行安装。

    系统要求

    1. WSL版本1.1.3.0+
    2. Win10 +
    3. BIOS支持虚拟化
    4. 内存4GB+
    5. 64位操作系统

    安装过程

    1.双击安装包开始安装

    2.勾选添加桌面快捷方式

    3. 等待程序安装完成

    4. 双击图标打开应用,统一许可证书

    5. 在道客官网注册账户,并获取docker加速器

    6. 配置Docker desktop的镜像加速器(由于默认为docker hub,是一个国外网站,国内打开较慢)

    7. 查看docker版本

    在cmd中输入docker version显示docker的相关版本信息。

    docker version

    8. 运行hello-world容器

    在cmd中输入docker run hello-world,看到“Hello from Docker!”等信息就说明docker已经安装完成。

    9. 查看docker desktop的变化

    镜像中多了一个hello-world镜像

    容器中多了一个使用hello-world镜像的仓库。

    镜像

    镜像是创建容器的基础,有了容器才能启动容器。

    获取镜像

    更具镜像的获取方式不同,有如下几种获取镜像的方式。

    1. 拉取镜像

    从镜像仓库中拉取镜像是最常见的获取镜像的方式。主要通过docker pull指令完成。

    docker pull [选项] <镜像名>[:标签]

    这里标签不存在时,默认为latest标签。标签通常为镜像的版本号。

    镜像名称并不是我们随便书写的,它应该在仓库中存在。一般情况下为应用的名称,例如django,python等

    为了确保镜像名称正确,可以通过docker search指令查看仓库中相关的仓库有哪些,通常选择官方的镜像。

    这样就确定了镜像的名称。

    镜像名称确认后可以在docker hub中查看该镜像的标签。

    一个简便的方法就是通过如下网址进行查看https://hub.docker.com/v2/repositories/library/镜像名称/tags/

    2. 还原镜像

     有时候内部通过tar文件来存储镜像,此时通过docker image import <镜像tar文件> <镜像名>指令完成镜像文件的制作。

    此处通过镜像tar文件制作镜像还有另一个指令docker image load -i <镜像文件名>指令完成镜像文件的制作。

    对比这两种指令产生的镜像发现如下不同:

    对比项docker importdocker load
    大小变大不变
    构建历史丢失保持

    查看镜像

    1. 查看本地所有镜像

    利用docker image ls指令可以查看本地所有的镜像。

    2. 查看镜像详细信息

    利用docker image inspect <镜像id>指令查看某个镜像的详细信息。

    3. 查看镜像历史过程

    利用docker image history <镜像名>可以查看镜像的制作历史,即Dockerfile的部分过程。

    制作镜像

    镜像本质上由Dockerfile制作而来,通过查看镜像,发现镜像是一个多层结构。通过docker pull获取镜像时,经常会发现拉取多个镜像层。

    镜像的存储结构如下:由多个只读层的镜像层组成,并在顶层创建一个读写层来运行容器。上层可以读取和覆盖下层相同的文件。

    镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统。如果不同层中有一个相同路径的文件,比如/a,上层的/a会覆盖下层的/a。也就是说用户只能访问到上层中的文件/a。在容器层中,用户看到的是一个叠加之后的文件系统。

    1. 根据Dockerfile制作

    Dockerfile可以理解为时创建镜像文件每个步骤的脚本文件。

    以hello-world镜像为例,它的Dockerfile内容为

    1. FROM scratch
    2. COPY hello /
    3. CMD ["/hello"]

    并将文件名命名为Dockerfile。

    这样利用docker image build 指令创建一个镜像。

    docker image build -t 镜像名称:标签  路径

    2. 根据容器制作镜像

    不推荐!

    这种方式容易出错,效率低且可重复性差。

    使用者不知道镜像的制作过程,无法对镜像进行审计

    通过更改容器中一些内容,并以这个容器作为运行对象创建一个新的镜像。

    利用docker container commit 容器名  镜像名:标签来实现以一个容器为基础创建新的镜像。

    分享镜像

    1. 通过仓库分享

    docker hub是一个公共的docker仓库网站,它存储镜像的要求是镜像名称以 用户名/镜像名:标签的方式命名。

    当通过镜像仓库来分享镜像时需要在docker hub中创建自己的账户,并通过docker login命令登录自己的账号。

    然后通过docker image tag指令将目标镜像改为满足推送要求的镜像名称。

    最后通过docker image push指令将镜像推送到仓库完成共享。

    2. 通过文件分享

    当没有仓库可以使用的时候,可以将镜像文件存储为tar文件进行存储,然后分享给其他人使用。

    利用docker image save -o <文件名> <镜像名>指令将镜像以tar文件存储。

    docker image save -o hello-world.tar hello-world

    删除镜像

    删除镜像的前提是没有任何运用该镜像的容器,所以要删除镜像首先需要删除依赖该镜像的所有容器。

    通过docker image rm <镜像id>指令删除镜像。

    通过docker image prune -a指令可以删除所有没有被使用的镜像。

    容器

    容器就是基于镜像创建的运行应用的地方。通常一个容器对应一个应用和其运行的最少依赖。

    创建容器

    容器由镜像而来,一个镜像可以创建多个容器,容器之间的资源是相互独立的。每个容器都有自己的名称空间,实现文件,网络和端口的隔离。

    1. 单纯创建一个容器

    通过docker container create <镜像名>指令会创建一个匿名容器(容器名称由docker随机命名).

    当需要指定容器的一些配置时可以通过添加选项来实现,常用的一些选项说明如下:

    • --name 指定容器的名称,必须在宿主机中是唯一的
    • -e 为容器设置环境变量
    • -p 为宿主机和容器进行端口映射
    • -v 为容器映射宿主机文件目录
    • --mount 为容器绑定文件目录
    • -h 设定容器主机名
    • --network 为容器绑定网络
    • --ip 为容器指定ip地址

    2. 创建并运行一个容器

    通过docker container run <镜像名>指令会创建并运行一个匿名容器。

    docker container run的很多选项和docker container create的是一致的,此外再补充几个.

    • -d 容器在后台运行
    • -t 使用命令行终端
    • -i 与容器交互

    删除容器

    当存在不再使用的容器时可以将容器删除。

    通过在docker container rm <容器id>指令可以完成容器删除操作。

    当删除正在运行的容器时会产生报错。

    正确的操作步骤应该是先暂停容器,然后再删除容器。或者通过-f选项,将运行中的容器强制删除。

    通过docker container prune -a指令可以删除所有暂停的容器。

    查看容器

    1. 容器列表

    通过docker container ls 指令可以查看系统中正在运行的容器列表。通过docker container ls -a指令可以查看系统中所有的容器列表。

    2. 查看容器配置信息

    通过docker container inspect <容器id>指令可以查看对应容器在系统中的设置。

    操作容器

    容器的状态和操作示意图

    1. 启动容器

    当容器创建后,可以通过docker container start <容器id>指令启动容器。

    2. 暂停容器

    通过docker container stop <容器id>指令暂停容器。

    3. 进入容器

    进入容器表示进入容器内部,目前有两种操作方式。

    attach方式

    通过docker container attach <容器id>指令可以直接进入容器启动命令的终端,不会启动新的进程。

    exec方式

    通过docker container exec <容器id>指令可以在容器中打开新的终端,并且可以启动新的进程。

    最佳实践

    服务类容器如mysql,nginx等,通过-d后台方式启动,并以exec -it进入容器。

    工具类容器通常给我们提供一个临时的工作环境,以run -it方式运行,exit退出容器后容器暂停。

    4. 退出容器

    在容器中输入exit即可退出容器进入宿主机环境。

    5. 重启容器

    通过docker container restart <容器id>指令可以重启容器。

  • 相关阅读:
    C/C++多进程高并发框架分享【内附可执行源码注释完整】
    C#通过线索二叉树进行中序遍历输出
    【Python】第二课 python入门学习
    Activity 与 Fragment通信方式-Android
    常用数据库validationQuery语句
    linux同步机制-completion
    java---jar详解
    ES相关面试问题整理
    嘉立创专业版新建元件
    第6章 docker资源限制
  • 原文地址:https://blog.csdn.net/baidu_38766791/article/details/133350329