Docker学习

141 阅读3分钟

1、docker介绍

  • docker不用硬件虚拟化,直接复用宿主机的硬件资源
  • docker利用宿主机的内核,不需要加载操作系统内核
  • docker并非通用的容器工具,它依赖一运行的linux环境。因此,docker必须部署在linux内核的系统上。docker实质上是在已经运行的linux下制造了一个隔离的文件系统。
  • 虚悬镜像:仓库名、标签都是NONE的镜像。dangling image。可能是镜像构建或删除过程中出了问题。

2、docker常用命令

帮助启动类

命令解释示例
systemctl start docker启动docker
systemctl stop docker停止docker
systemctl status docker查看docker状态
systemctl restart docker重启docker
systemctl enable docker开机启动docker
docker info查看docker概要信息
docker --help
docker 具体命令 --helpdocker具体命令的帮助文档docker run --help

镜像命令

命令解释示例
docker images列出本地主机上的镜像docker images - a :列出本地所有镜像层
- q :只显示镜像id
(下面有截图补充介绍)
docker search 镜像名去远程镜像仓查找某个镜像。(仓库地址:在daemon.json中配置镜像加速器)docker search --limit 5 redis
查找点赞数最多的前5个redis镜像
docker pull 镜像名[:TAG]从docker镜像仓库获取镜像。如果不写TAG代表拉取latest版本docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
docker pull redis
docker tag为一个镜像打标签
docker rmi 镜像名或镜像ID删除镜像删除单个:docker rmi redis
删除多个:docker rmi redis ubutu
删除全部:docker rmi $( docker images -qa) 或者 docker images -qa | xargs docker rmi docker命令支持拼接
- f:强制删除
docker build从一个 Dockerfile 创建一个镜像
docker save保存一个镜像为 tar 包文件[对应 load]
docker load从一个 tar 包中加载一个镜像[对应 save]
docker system df查看镜像/容器/数据卷所占用的空间

image.png

容器命令

命令解释示例
docker run [OPTIONS] 镜像名 [COMMAND] [ARG...]新建并启动容器docker run -it 镜像名: 启动前台交互式容器 docker run -d 镜像名:启动后台守护式容器。

docker run -it -v /data:/home/data nginx:latest /bin/bash
-t:让Docker分配一个伪终端并绑定到容器的标准输入上 。
-i:让容器的标准输入保持打开。
-v:绑定一个卷。将主机的目录/data映射到容器的目录/home/data。
/bin/bash:在容器中执行/bin/bash命令。
(下面有截图补充介绍)
docker ps列出当前正在运行的所有容器实例- a:显示正在运行和历史上运行过的容器
- l :显示最近运行的容器
- q :只显示容器ID
- n:显示最近n个创建的容器
退出容器通过docker run 进去的容器,使用exit退出后,容器停止;使用ctrl + p + q 退出,容器不停止
docker start 容器ID或容器名启动已经停止的容器
docker restart 容器ID或容器名重启容器
docker stop 容器ID或容器名停止容器
docker kill 容器ID或容器名强制停止容器
docker rm 容器ID或容器名删除已经停止的容器- f:强制删除,可以删除正在运行的容器。
支持批量删除,跟删镜像方式一样。
docker logs 容器ID或容器名查看容器日志
docker top 容器ID或容器名查看容器内运行的进程
docker inspect 容器ID或容器名查看容器内部细节
进入正在运行容器docker exec -it 容器ID /bin/bash (推荐使用)
docker attach 容器ID
使用exec进入容器,会在容器中打开新的终端,启动一个新的进程run,使用exit退出,不会导致容器停止。
attach直接进入容器启动命令的终端,不会启动新的进程,使用exit退出后,容器会停止。
docker cp 容器ID:容器内路径 宿主机路径从容器中拷贝文件到宿主机在宿主机上执行
docker export 容器ID > 文件名.tar导出容器的内容,作为一个tar归档文件在宿主机上执行
docker import从tar包中的内容创建一个新的文件系统再导入为镜像cat 文件名.tar | docker import -镜像用户/镜像名:镜像版本号

docker run的 OPTION参数补充: image.png

image.png

3、docker镜像

镜像介绍

概念

镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,包括代码、依赖的库、环境变量、配置文件等。

镜像分层

镜像可以通过分层来进行继承。

UnionFS(联合文件系统):分层、轻量级、高性能的文件系统,它支持对文件系统的修改作为一次提交来一层一层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。UnionFS是Docker镜像的基础。Docker基于基础镜像,来制作各种业务镜像。

镜像分层的好处:
镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。
比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像; 同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享

image.png

Docker镜像层都是只读的,容器层是可写的。 当容器启动时,一个新的可写层被加载到镜像的顶部。 这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。所有对容器的改动都只会发生在容器层中。

镜像制作

两种方法:docker commit 和 dockerfile

docker commit

命令解释示例
docker commit提交容器副本,使之成为一个新的镜像docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]

dockerfile

Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。

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

Docker执行Dockerfile的大致流程:

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

Dockerfile保留字指令:

指令描述示例命令执行阶段
FROM基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是fromdocker build
MAINTAINER镜像维护者的姓名和邮箱地址docker build
RUN容器构建时需要运行的命令RUN <命令行命令>
RUN yum -y install vim
build
EXPOSE当前容器对外暴露出的端口run
WORKDIR指定在创建容器后,终端默认登陆的进来工作目录build + run
USER指定该镜像以什么用户去执行,如果都不指定,默认是rootbuild + run
ENV用来在构建镜像过程中设置环境变量。ENV MY_PATH /usr/mytest
这个环境变量可以在后续的任何RUN指令中使用;也可以在其它指令中直接使用这些环境变量,比如:WORKDIR $MY_PATH
run
ADD将宿主机目录下的文件拷贝进镜像,且会自动处理URL和解压tar压缩包。相当于复制和解压build
COPY拷贝目录和文件到镜像中。将从构建上下文目录中源路径的文件/目录复制到新的一层镜像的目标路径内。COPY src destbuild
VOLUMN容器数据卷run
CMD指定容器启动后要干的事情CMD catalina.sh run
Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换。
比如,如果docker run后写了参数/bin/bash,则catalina,sh run会被/bin/bash替换
run
ENTRYPOINT也是用来指定一个容器启动时要运行的命令类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序
dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。如果ENTRYPIONT后面有CMD,则CMD会当做ENTRYPOINT的参数
run

image.png

image.png

image.png

4、容器数据卷

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

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

  • 作用:将docker容器内的数据保存进宿主机的磁盘中。
  • 命令:docker run -it --privileged=true -v /宿主机绝对路径目录:容器内目录:读写规则 镜像名。
  • 特点:(1)数据卷可在容器之间共享或重用数据(2)卷中数据更改实时生效(3)数据卷中的更改不会包含在镜像的更新中(4)数据卷的生命周期持续到没有容器使用它为止。
  • 查看数据卷是否安装成功,可以使用docker inspect命令,查看Mounts字段
  • 数据卷读写规则:默认是rw。ro:容器只读
  • 数据卷的继承:docker run -it --privileged=true --volumes-from 父类的容器名 镜像名