Docker

本文详细介绍了Docker的核心概念,包括镜像、容器、Dockerfile以及数据卷的使用。通过Docker镜像命令和容器命令的学习,理解如何管理Docker资源。重点探讨了UnionFS在Docker镜像中的作用,以及数据卷在容器数据持久化中的关键角色。此外,还介绍了如何编写Dockerfile来构建自定义镜像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Docker

前提简介

镜像:就是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建多个容器。

容器:是用镜像创建的运行实例。Docker利用容器独立运行的一个或一组应用。

它可以被启动、开始、停止、删除。每个容器是相互隔离的、保证安全的平台,可以把容器看作一个简易版的Linux环境和运行在其中的应用程序。

仓库:是集中存放镜像文件的场所。

镜像命令

docker images:查看本地的镜像

docker search:搜索镜像名称

docker pull:下载镜像,如果没有跟上版本号,就是默认下载最新版本

docker rmi:删除镜像

docker commit:提交一个容器副本使之成为一个新的镜像

容器命令

docker run [options] images [command] [arg]:创建并启动容器

[options]细节:

–name= 容器的名字:为容器指定一个别名

-d:后台运行容器,并返回容器ID,也即启动守护式容器

-i:以交互式模式运行容器,通常与 -t 一起使用

-t:为容器重新分配一个伪输入终端,通常与 -i 一起使用

-P:随机端口映射

-p:指定端口映射

docker ps [options]:查看运行的容器

[options]细节:

-a:列出当前所有正在运行的容器+历史上运行过的

-l:显示最近创建的容器

-n:显示最近创建的n个容器

-q:静默模式,只显示容器编号

–no-trunc:不截断输出

docker exit:容器停止并退出

另:ctrl+P+Q:容器不停止退出

docker start 容器名称/ID:启动容器

docker restart 容器名称/ID:重启容器

docker stop 容器名称/ID:停止容器

docker kill 容器名称/ID:强制停止容器

docker rm 容器名称/ID:删除已停止的容器

docker attach 容器名称/ID:进入已经退出但正在运行的容器

docker exec -it 容器名称/ID bashShell:在外边执行容器内的操作

docker cp 容器名称/ID:文件位置 宿主机位置 :拷贝容器内的文件到宿主机

Docker镜像

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、库、环境变量和配置文件

UnionFS

UnionFS是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同的目录挂载到同一个虚拟文件系统下,UnionFS是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。

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

Docker 容器数据卷

数据卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union FS 提供一些用于持续存储或共享数据的特性

卷的目的就是数据的持久化,完全独立于容器的生命周期,因此Docker不会在删除容器的时候删除其挂载的数据卷

特点:

  1. 数据卷可以在容器间共享或重用数据
  2. 卷中的修改可以直接生效
  3. 数据卷的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没有容器使用它为止

容器内添加

  1. 直接命令添加

docker run -it -v /宿主机绝对路径目录 : /容器内目录 镜像名

  1. DockerFile添加

数据卷容器

命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,被称为数据卷容器

容器之间配置信息的传递,数据卷的生命周期一致持续到没有容器使用它为止

DockerFile

Dockerfile 是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本

步骤:

  1. 手动编写一个dockerfile文件,必须符合file规范
  2. 有这个文件之后,直接docker build 命令执行,获得一个自定义的镜像
  3. docker run

centos的dockerfile

FROM scratch
ADD centos-7-x86_64-docker.tar.xz /

LABEL org.label-schema.schema-version="1.0" \
    org.label-schema.name="CentOS Base Image" \
    org.label-schema.vendor="CentOS" \
    org.label-schema.license="GPLv2" \
    org.label-schema.build-date="20190305"

CMD ["/bin/bash"]

scratch:是所有镜像的祖先镜像(类似于Java中Object类的关系)

Dockerfile内容基础知识

  1. 每条保留字指令必须大写字母且后面要跟有至少一个参数
  2. 指令从上到下顺序执行
  3. #表示注释
  4. 每条指令都会创建一个新的镜像层,并对镜像进行提交

Docker执行dockerfile的大致流程

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器进行修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker再基于刚才的镜像运行一个新的容器
  5. 执行dockerfile中的下一条指令,直到所有指令执行完成

保留字指令

FROM :基础镜像,当前编写的镜像基于哪个镜像的

MAINTAINER:镜像维护者的姓名和邮箱地址

RUN:容器构建时需要运行的命令

EXPOSE:当前容器对外暴露的端口号

WORKDIR:指定在创建容器后,终端默认登陆的进来工作的目录

ENV:用来在构建镜像的过程中设置环境变量

ADD:将宿主机目录下的文件拷贝到镜像且自动处理URL和解压tar压缩包

COPY:将从构建上下文目录中<源路径>的文件/目录复制到新的一层镜像内的<目标路径>位置

VOLUME:容器数据卷,用于数据持久化工作

CMD:指定一个容器启动时要运行的命令

(dockerfile中可以有多个CMD命令,但只有最后一个生效,CMD会被docker run之后的参数替换)

ENTRYPOINT:指定一个容器启动时要运行的命令

(但是docker run 之后的参数不会替换,而是追加到后面)

ONBUILD:当构建一个被继承的dockerfile时运行命令,父镜像在被子镜像继承后父镜像的onbuild被触发

利用Dockerfile自定义一个centos镜像

  1. 在宿主机上面用vim编译Dockerfile文件
vim Dockerfile
  1. 简单的内容如下
#继承于哪个镜像
FROM centos
#镜像创建者姓名和邮箱
MAINTAINER xb<22333@qq.com>

#环境变量
ENV MYPATH usr/local
#终端进入时的工作目录
WORKDIR $MYPATH

#build时运行的命令
RUN mkdir p

#对外暴露的端口
EXPOSE 80

#容器启动时运行的命令
CMD echo $MYPATH
CMD echo "success ----- ok"
CMD /bin/bash

  1. build构建Dockerfile文件(最后面有个点)
docker build -f Dockerfile -t mycentos:1.2 .

在这里插入图片描述

  1. 查看自定义的镜像
docker images

在这里插入图片描述

  1. 运行容器
docker run -it mycentos:1.2

在这里插入图片描述

可以看到终端进入容器后默认的目录被改为了 local,并且在建立了 p 文件夹

  1. 查看镜像变更历史
docker history eeb1dfcf4e9b
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值