Docker详解和指令大全

2023-05-16

Docker

1 Docker原理

1.1 Docker架构图

image-20211030145847957


1.2 Docker三要素

  • 仓库 Registry

    ​ 保存了多个镜像

  • 镜像 image

  • 容器 Container

    ​ image创建的运行实例。容器只包含业务运行所需的runtime环境。

镜像和容器可以类比成java中的类和实例


1.3 Docker原理

1.3.1 Docker底层原理

  • Docker是个Client-Server结构的系统
  • 守护进程运行在主机上,通过Socket从客户端访问。守护进程从Client接收命令并管理运行在主机上的容器
  • 容器,是一个运行时环境

在这里插入图片描述


1.3.2 Docker与传统虚拟化方式的不同

  • 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
  • 而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便;
  • 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。

image-20211030153002120


2 Image

2.1 image概述

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

  • Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统叫UnionFS。

UnionFS(联合文件系统):

  • Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
  • 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

2.2 Image原理

2.2.1 镜像加载原理

  • Docker镜像的最底层是bootfs。

    **bootfs **(boot file system):主要包含bootloader和kernel。

    • bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

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

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

    在这里插入图片描述


  • 平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M?

    对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用宿主机的kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。


2.2.2 分层的镜像

以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载

在这里插入图片描述


image-20211030193533650

为什么 Docker 镜像要采用这种分层结构呢?

  • 可以共享资源
    • 有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像
    • 同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。
    • 镜像的每一层都可以被共享

2.3 镜像特点

  • Docker镜像都是只读的
  • 当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

2.4 常用命令

2.4.1 docker images

List images

  • docker images -a:列出所有镜像,包含中间印象层
  • docker images -q:显示当前镜像的id
  • docker images -qa:列出所有镜像的id
  • docker images -digests: 显示镜像摘要信息
  • docker images -digests --no-trunc: 显示镜像完整的摘要信息
  • docker images prune:可以清理无用的images

2.4.2 docker search

Search the Docker Hub for images

  • docker search -filter stars=300 tomcat :列出STARS不小于300的镜像

2.4.3 docker pull

Pull an image or a repository from a registry

  • docker pull xxxx 等价于 docker pull xxxx:latest

2.4.4 docker rmi

remove an or more images

  • docker rmi xxxx
  • docker rmi -f xxxx :Force removal of an image
  • docker rmi -f xxxx oooo :Force removal of more images
  • docker rmi -f $(docker images -qa) :docker images -qa列出的id全传递给rmi参数并删掉

2.5 commit操作

docker commit:提交容器副本使之成为一个新的镜像。可以创建自己的镜像

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

2.6 push操作

dockerpush:把image提交到docker hub的repository中。

  1. docker login:登录账号密码
  2. docker tag [imageName] finn5842/[repoName]:[tagName]: 指定一个tag。比如docker tag nginx finn5842/nginx:http1.1
  3. docker push [tagName]: 提交。比如:docker push finn5842/nginx:http1.1

image-20211104135402360


3 Container

3.1 常用命令

3.1.1 docker run

新建并启动容器

docker run [OPTIONS] IMAGE [COMMAND]

–name=“name”:容器名称

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

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

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

​ docker run -it --name=“myMySQL” mysql

-P:随机分配端口号

-p:指定端口号

  -p 10060:8080  前面是docker暴露给外界的端口,后面是tomcat服务的接口

  • docker run -d xxxx:以后台模式启动一个容器⭐

    docker机制:

    • docker容器后台运行时,必须有个前台进程
    • 容器运行的命令除非要求一直挂起,如运行top, tail,否则就会自动退出

    问题:通过docker ps -a 进行查看时, 发现容器自动退出。

    原因:所以,容器以后台模式运行时,如果没有发现前台进程,就是立即自动退出

    解决办法:运行的容器以前台运行的方式进行。


3.1.2 docker ps

列出container

  • docker ps:列出正在运行的容器

  • docker ps -a:列出所有正在运行历史上运行过的容器

  • docker ps -l:列出最近创建的容器

  • docker ps -q:列出正在运行的容器编号

    docker ps -aq 就是列出所有容器的编号

  • docker ps -n xx:列出最近创建的xx个容器


3.1.3 退出容器

  • exit
  • ctrl+shift+z

3.1.4 暂时离开容器

离开容器,但不关闭容器

  • ctrl+p+q

3.1.5 启动容器

  • docker start xxxx:启动容器
  • docker restart xxxx:重启容器

3.1.6 停止容器

  • docker stop xxxx
  • docker kill:强制停止容器

3.1.7 删除容器

  • docker rm xxxx:删除已停止的容器

  • docker rm -f xxxx:强制删除容器

  • docker rm -f $(docker ps -aq):强制删除所有容器

  • docker ps -aq|xargs docker rm:强制删除所有容器(把docker ps -aq传给xargs,并作为下一个命令的参数)


3.1.8 重新进入容器

  • docker attach xxxx:直接进入容器启动命令终端,不会启动新的进程
  • docker exec -it xxxx:在容器中打开终端,并启动新的进程。默认是以docker exec -it xxxx /bin/bash的方式交互
    • docker exec -it xxxx ls -l /tmp:直接对xxxx容器进行ls -l /tmp操作并返回,并不进入容器

3.1.9 容器日志

image-20211030173507422


3.1.10 容器内部细节

docker inspect xxxx


3.1.11 容器内容保存到主机

docker cp xxxx:容器目录 主机目录:复制容器内容到主机


3.1.12 docker cp

从容器->宿主机

容器的opt目录下的aa.txt文件拷贝到宿主机的/usr/目录下

docker cp mycontainer:/opt/aa.txt /usr/

主机->容器

docker cp /usr/aa.txt mycontainer:/opt

3.2 常用指令总结

在这里插入图片描述


4 Volume

容器数据卷

4.1 容器数据卷

  • 用来数据持久化
  • 容器之间可以共享持久化的数据

Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。

总结:

容器的持久化 + 容器间或容器和宿主机间继承和数据共享


4.2 添加数据卷

4.2.1 直接命令添加

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

  • 举例:

    • docker run -it -v /宿主机目录:/容器内目录 centos /bin/bash

      在这里插入图片描述

    • 查看数据卷是否挂载成功docker inspect xxxx

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WbuPxWEr-1658545902845)(https://raw.githubusercontent.com/FinnSHI/PictureBed/main/imgs/202110302038205.png)]

    • 容器和宿主机之间实现了数据共享

      在这里插入图片描述

    • 容器停止退出后,主机修改后数据仍然同步

      在这里插入图片描述


  • docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名命令(带权限)。此时容器内数据卷只能读,不能写

4.2.2 DockerFile添加

  • VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]:可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷

    示例:

    # volume test
    FROM centos
    VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
    CMD echo "finished--------create successfully"
    CMD /bin/bash
    
    • build后生成image

      在这里插入图片描述

    • run

      在这里插入图片描述

    • 查看

      在这里插入图片描述

      image-20220723111039654

    • 主机对应默认地址

      image-20220723111050921

    注意:

    • 如果Docker挂载主机目录时,访问出现错误:Docker cannot open directory .: Permission denied
      解决办法:在挂载目录后多加一个–privileged=true参数即可

4.3 数据卷容器

4.3.1 概述

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

image-20220723111100006

4.3.2 容器间数据共享

  • 先启动一个父容器dc01

  • docker run -it --name dc02 --volumes-from dc01 zzyy/centos:dc02继承自dc01 (image:zzyy/centos)


5 DockerFile

5.1 DockerFile概述

​ Dockerfile是用来构建Docker image的文件,是由一系列命令和参数构成的脚本

构建三步骤

  1. 编写Dockerfile文件
  2. docker build
  3. docker run

5.2 DockerFile构建

5.2.1 Dockerfile内容基础知识

  • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数

  • 指令按照从上到下,顺序执行

  • 每条指令都会创建一个新的镜像层,并对镜像进行提交

    # 表示注释

5.2.2 Docker执行DockerFile流程

  1. Docker从基础image运行一个container
  2. 执行一条指令并对container作出修改
  3. Docker提交容器到一个新的image层
  4. Docker再基于刚提交的image运行一个新container
  5. 执行DockerFile中的下一条指令

5.2.3 总结

从应用软件的角度来看,DockerFile、Image与Container分别代表软件的三个不同阶段:

  • Dockerfile是软件的原材料
  • Image是软件的交付品
  • Container则可以认为是软件的运行态。

Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

image-20220723111128882

描述:

  • Dockerfile:Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
  • Docker镜像:在用Dockerfile定义后,用docker build指令产生一个Docker镜像。运行Docker镜像,创建容器;
  • Docker容器:容器是提供服务的。

5.3 DockerFile保留字指令

  • FROM :基础镜像,当前新镜像是基于哪个镜像的
  • MAINTAINER :镜像维护者的姓名和邮箱地址
  • RUN : 容器构建时需要运行的命令
  • EXPOSE : 当前容器对外暴露出的端口
  • WORKDIR : 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
  • ENV : 用来在构建镜像过程中设置环境变量
  • ADD : 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
  • COPY : 类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
  • VOLUME : 容器数据卷,用于数据保存和持久化工作
  • CMD :指定一个容器启动时要运行的命令。Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
  • ENTRYPOINT : 指定一个容器启动时要运行的命令,ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。
  • ONBUILD : 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

6 案例

6.1 Base镜像

​ Docker Hub 中 99% 的镜像都是通过在 base 镜像 scratch 中安装和配置需要的软件构建出来的.

image-20220723111118647


6.2 自定义image

6.2.1 自定义镜像myTomcat

  1. 创建myTomcat文件夹:

    mkdir -p /finn/mydockerfile/myTomcat
    

    mkdir -p是递归创建目录,如果上级文件夹不存在,会一起创建出来

  2. 在上述目录下touch c.txt

  3. 将jdk和tomcat安装的压缩包拷贝进上一步目录


7 Docker Compose

7.1 概述

​ 使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

  • Compose 中有两个重要的概念:

    • 服务 (service):一个应用容器,实际上可以包括运行多个相同镜像的容器实例。
    • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
  • Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

  • Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。

手册资料:

https://docs.docker.com/compose/


7.2 yaml

​ yaml是docker-compose的核心。它一共有三层

#3层

version: '' #版本
services: #服务
    服务1:
    #服务配置
    
    
#其他配置 网络/卷、全局规则
volumes:
networks:
configs:

7.3 部署上线

docker-compose up

7.4 重新部署上线

docker-compose up --build

7.5 下线

docker-compose down
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker详解和指令大全 的相关文章

  • 如何扁平化 Docker 镜像?

    我做了一个相当大的 Docker 容器 当我提交容器来创建映像时 映像大约有 7 8 GB 大 但当我export容器 不是save图像 到 tarball 并重新导入 图像只有 3 GB 大 当然 历史记录丢失了 但这对我来说没问题 因为
  • Docker、maven 和 settings.xml

    给出以下简单的 Dockerfile FROM maven 3 6 3 ibmjava 8 alpine Copy maven settings COPY settings xml usr share maven ref COPY pom
  • Spring Cloud Gateway 无法在 Docker 上运行

    我已经配置了一个 Spring Cloud 网关来重定向到使用以下路由创建的服务器 Bean public RouteLocator myRoutes RouteLocatorBuilder builder return builder r
  • 在docker中将秘密作为环境变量注入安全吗?为什么ECS和EKS支持它?

    我很难协调一些在线建议 即将机密 通常是密码 作为环境变量注入 docker 容器与 AWS ECS 甚至 EKS 的本机功能 不安全 其中存储在 AWS Secrets Manager 中的机密作为环境提供变量 我想使用这些平台的原生功能
  • docker登录 - 存储凭据时出错 - 写入权限错误

    我正在运行一个docker login命令作为 Bamboo 构建作业的一部分 命令文本通过以下方式获得aws ecr get login调用并在子 shell 中执行 该命令失败并显示Error saving credentials er
  • 更改Docker容器中的mysql密码

    我如何更改 docker 容器中的 root 密码 因为一旦我停止 mysql 服务 容器就会自动停止 我应该停止 mysql 容器并部署一个新容器吗 您可以使用正在运行的容器更改它docker exec session https doc
  • pq:无法调整共享内存段的大小。设备上没有剩余空间

    我在仪表板上有许多面板 数量约为 6 个 用于显示数据点图表 对 PostgreSQL 数据库的 Dockerized 实例进行查询 直到最近 面板都工作正常 有些面板停止工作并报告如下错误 pq 无法将共享内存段 PostgreSQL 2
  • 如何让 Docker 容器在系统启动时自动启动?

    假设我有一个要运行的 Docker 容器 那么我可以调用 docker run 一切都很好 是否有一种内置方法可以在系统崩溃并重新启动时自动重新启动容器来运行容器 如果是这样 这在 Docker Compose 中也可用吗 是的 docke
  • 我如何在 docker 构建过程中传递参数或绕过它? [复制]

    这个问题在这里已经有答案了 我为我的 PHP 应用程序编写了一个 Dockerfile 我不是从 dockerhub 开始创建它 而是从头开始创建它 eg FROM ubuntu 18 04 RUN apt get update apt g
  • Google云构建中的两个容器之间进行通信

    我正在 Google 云构建中运行 CI CD 管道 我的应用程序有web and wget容器 我正在努力达到web from wget 内部使用云构建cloudbuild桥接网络 同时启动容器作为步骤 所以我期待这些步骤能够使用名称进行
  • docker 中带有参数的 jar 文件

    Helo 我有一个 java jar 文件 当我从终端运行它时 它会接受一堆参数作为输入 我想制作一个 docker 映像并运行它 其中包含 jar 文件 我仍然可以在其中传递 jar 文件的参数 将 jar 文件设置为您的入口点 http
  • 使用 mariaDB 将 sql 转储文件安装到 docker 容器

    我刚刚学习 docker 的基础知识 但一直停留在从本地系统导入 SQl 文件上 我使用的是 Windows 10 并允许我的 docker 容器访问我的共享驱动器 我有一个位于 D 上的 SQL 文件 我想导入到从 docker hub
  • 使用主机上的 consul DNS 解析容器

    目标 让 docker 容器使用主机提供的 DNS 主机是在另一个容器中运行的 consul 代理 来访问通过 traefik 反向代理提供的服务 设置 主机 Ubuntu 16 04 2 LTS Registrator 将新容器注册到 c
  • 如何在docker compose中为每个容器创建单独的卷

    我创建了一个docker我想为其运行多个容器的图像 这个 docker 镜像依赖于一些东西 这些东西对于所有容器来说都是相同的 但唯一的区别是容器的配置 version 2 4 services s1 image testdockerimg
  • Docker 进程被神秘的“Killed”消息杀死

    在 docker 容器中运行 python 脚本 一切似乎都运行顺利 看到一些 STDOUT 消息 大约 5 分钟后我得到了Killed消息 没有进一步的解释 并且该过程停止 查询数据库可能是磁盘空间问题 也可能是 OOM 问题 我不确定
  • 如何通过 Docker 使用 wkhtmltopdf

    当我在 Docker 容器中使用 wkhtmltopdf 版本 0 12 2 4 通过 apt get 安装 时 它失败并显示 QXcbConnection Could not connect to display 当我设置环境变量DISP
  • 如何确定性地构建 Docker 镜像?

    我正在尝试构建 Docker 映像 并且希望我的 Docker 映像具有确定性 令我惊讶的是 我发现即使是一个简单的 Dockerfile 例如 FROM scratch ENV a b 重复使用时生成不同的 IDdocker build
  • AWS Lambda Sam找不到docker

    我正在尝试使用以下命令测试我的 hello world lambda 函数aws sam cli在我的项目根文件夹中使用以下命令 sam local start api debug 这在控制台中给出了以下输出 2018 07 11 16 1
  • 为什么 docker build 中的 COPY 未检测到更新

    我在节点应用程序上运行构建 然后使用工件构建 Docker 映像 将源代码移动到位的 COPY 命令没有检测到构建后源文件的更改 它只是使用缓存 Step 9 12 COPY server home nodejs app server gt
  • 使用 docker-compose 时如何读取外部机密

    我想知道如何将外部秘密传递到 docker compose 生成的服务中 我执行以下操作 我创造新的秘密 printf some secret value goes here docker secret create wallet pass

随机推荐