Docker 全栈体系(二)

Docker 体系(基础篇)

三、Docker 常用命令

1. 帮助启动类命令

  • 启动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 具体命令 --help

2. 镜像命令

  • docker images
    • 列出本地主机上的镜像
      在这里插入图片描述
    • 各个选项说明:
      • REPOSITORY:表示镜像的仓库源
      • TAG:镜像的标签版本号
      • IMAGE ID:镜像ID
      • CREATED:镜像创建时间
      • SIZE:镜像大小
        同一仓库源可以有多个 TAG版本,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
        如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像
    • OPTIONS说明:
      • -a :列出本地所有的镜像(含历史映像层)
      • -q :只显示镜像ID
  • docker search 某个XXX镜像名字
    • docker search [OPTIONS] 镜像名字
      Docker 全栈体系(二)_第1张图片
      Docker 全栈体系(二)_第2张图片
    • OPTIONS说明:
      • --limit : 只列出N个镜像,默认25个
      • docker search --limit 5 redis
  • docker pull 某个XXX镜像名字
    • 下载镜像
    • docker pull 镜像名字[:TAG]
    • docker pull 镜像名字
    • 没有TAG就是最新版
      • 等价于
      • docker pull 镜像名字:latest
      • docker pull ubuntu
        Docker 全栈体系(二)_第3张图片
  • docker system df 查看镜像/容器/数据卷所占的空间
    Docker 全栈体系(二)_第4张图片
  • docker rmi 某个XXX镜像名字ID
    • 删除镜像
    • 删除单个
      • docker rmi -f 镜像ID
    • 删除多个
      • docker rmi -f 镜像名1:TAG 镜像名2:TAG
    • 删除全部
      • docker rmi -f $(docker images -qa)
  • 面试题:谈谈docker虚悬镜像是什么?
    • 是什么
      • 仓库名、标签都是的镜像,俗称虚悬镜像dangling image
    • 长什么样
      在这里插入图片描述

3. 容器命令

  • 有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)
    Docker 全栈体系(二)_第5张图片

3.1 新建+启动容器

  • docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
  • OPTIONS说明
    • OPTIONS说明(常用):有些是一个减号,有些是两个减号
    • --name=“容器新名字” 为容器指定一个名称;
    • -d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
    • -i:以交互模式运行容器,通常与 -t 同时使用;
    • -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;也即启动交互式容器(前台有伪终端,等待交互);
    • -P: 随机端口映射,大写P
    • -p: 指定端口映射,小写p
      Docker 全栈体系(二)_第6张图片
  • 启动交互式容器(前台命令行)
    Docker 全栈体系(二)_第7张图片
    • 使用镜像centos:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。docker run -it centos /bin/bash
参数说明:
-i: 交互式操作。
-t: 终端。
centos : centos 镜像。
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
要退出终端,直接输入 exit:

3.2 列出当前所有正在运行的容器

  • docker ps [OPTIONS]
  • OPTIONS说明
    • -a :列出当前所有正在运行的容器+历史上运行过
    • -l :显示最近创建的容器。
    • -n :显示最近n个创建的容器。
    • -q :静默模式,只显示容器编号。

3.3 退出容器

  • 两种退出方式
    • exit
      • run进去容器,exit退出,容器停止
    • ctrl+p+q
      • run进去容器,ctrl+p+q退出,容器不停止

3.4 启动已停止运行的容器

  • docker start 容器ID或者容器名

3.5 重启容器

  • docker restart 容器ID或者容器名

3.6 停止容器

  • docker stop 容器ID或者容器名

3.7 强制停止容器

  • docker kill 容器ID或容器名

3.8 删除已停止的容器

  • docker rm 容器ID

3.9 一次性删除多个容器实例

  • docker rm -f $(docker ps -a -q)
  • docker ps -a -q | xargs docker rm

3.10 重要

  • 有镜像才能创建容器,这是根本前提(下载一个Redis6.0.8镜像演示)
  • 启动守护式容器(后台服务器)
    • 在大部分的场景下,我们希望 docker 的服务是在后台运行的, 我们可以过 -d 指定容器的后台运行模式。
    • docker run -d 容器名
      • #使用镜像centos:latest以后台模式启动一个容器
      • docker run -d centos
      • 问题:然后docker ps -a 进行查看, 会发现容器已经退出
      • 很重要的要说明的一点: Docker容器后台运行,就必须有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。
      • 这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动响应的service即可。例如service nginx start,但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,这样的容器后台启动后,会立即自杀因为他觉得他没事可做了。
      • 所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行,常见就是命令行模式,表示我还有交互操作,别中断。
    • redis 前后台启动演示case
      • 前台交互式启动
        • docker run -it redis:6.0.8
      • 后台守护式启动
        • docker run -d redis:6.0.8
  • 查看容器日志
    • docker logs 容器ID
  • 查看容器内运行的进程
    • docker top 容器ID
  • 查看容器内部细节
    • docker inspect 容器ID
  • 进入正在运行的容器并以命令行交互
    • docker exec -it 容器ID bashShell
      在这里插入图片描述
      Docker 全栈体系(二)_第8张图片
    • 重新进入docker attach 容器ID
    • 案例演示,用centos或者unbuntu都可以
    • 上述两个区别
      • attach 直接进入容器启动命令的终端,不会启动新的进程 用exit退出,会导致容器的停止。
        Docker 全栈体系(二)_第9张图片
      • exec 是在容器中打开新的终端,并且可以启动新的进程 用exit退出,不会导致容器的停止。
        Docker 全栈体系(二)_第10张图片
    • 推荐使用 docker exec 命令,因为退出容器终端,不会导致容器的停止。
    • 用之前的redis容器实例进入试试
      • 进入redis服务
      • docker exec -it 容器ID /bin/bash
      • docker exec -it 容器ID redis-cli
      • 一般用-d后台启动的程序,再用exec进入对应容器实例
  • 从容器内拷贝文件到主机上
    • 容器→主机
    • docker cp 容器ID:容器内路径 目的主机路径
      Docker 全栈体系(二)_第11张图片
  • 导入和导出容器
    • export 导出容器的内容留作为一个tar归档文件[对应import命令]
    • import 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]
    • 案例
      • docker export 容器ID > 文件名.tar
      • cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号

4. 小总结

  • 常用命令
    Docker 全栈体系(二)_第12张图片
attach    Attach to a running container                 # 当前 shell 下 attach 连接指定运行镜像
build     Build an image from a Dockerfile              # 通过 Dockerfile 定制镜像
commit    Create a new image from a container changes   # 提交当前容器为新的镜像
cp        Copy files/folders from the containers filesystem to the host path   #从容器中拷贝指定文件或者目录到宿主机中
create    Create a new container                        # 创建一个新的容器,同 run,但不启动容器
diff      Inspect changes on a container's filesystem   # 查看 docker 容器变化
events    Get real time events from the server          # 从 docker 服务获取容器实时事件
exec      Run a command in an existing container        # 在已存在的容器上运行命令
export    Stream the contents of a container as a tar archive   # 导出容器的内容流作为一个 tar 归档文件[对应 import ]
history   Show the history of an image                  # 展示一个镜像形成历史
images    List images                                   # 列出系统当前镜像
import    Create a new filesystem image from the contents of a tarball # 从tar包中的内容创建一个新的文件系统映像[对应export]
info      Display system-wide information               # 显示系统相关信息
inspect   Return low-level information on a container   # 查看容器详细信息
kill      Kill a running container                      # kill 指定 docker 容器
load      Load an image from a tar archive              # 从一个 tar 包中加载一个镜像[对应 save]
login     Register or Login to the docker registry server    # 注册或者登陆一个 docker 源服务器
logout    Log out from a Docker registry server          # 从当前 Docker registry 退出
logs      Fetch the logs of a container                 # 输出当前容器日志信息
port      Lookup the public-facing port which is NAT-ed to PRIVATE_PORT    # 查看映射端口对应的容器内部源端口
pause     Pause all processes within a container        # 暂停容器
ps        List containers                               # 列出容器列表
pull      Pull an image or a repository from the docker registry server   # 从docker镜像源服务器拉取指定镜像或者库镜像
push      Push an image or a repository to the docker registry server    # 推送指定镜像或者库镜像至docker源服务器
restart   Restart a running container                   # 重启运行的容器
rm        Remove one or more containers                 # 移除一个或者多个容器
rmi       Remove one or more images       # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
run       Run a command in a new container              # 创建一个新的容器并运行一个命令
save      Save an image to a tar archive                # 保存一个镜像为一个 tar 包[对应 load]
search    Search for an image on the Docker Hub         # 在 docker hub 中搜索镜像
start     Start a stopped containers                    # 启动容器
stop      Stop a running containers                     # 停止容器
tag       Tag an image into a repository                # 给源中镜像打标签
top       Lookup the running processes of a container   # 查看容器中运行的进程信息
unpause   Unpause a paused container                    # 取消暂停容器
version   Show the docker version information           # 查看 docker 版本号
wait      Block until a container stops, then print its exit code   # 截取容器停止时的退出状态值

四、Docker 镜像

1. 是什么?

1.1 镜像

  • 是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。
  • 只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。

1.2 分层的镜像

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

1.3 UnionFS(联合文件系统)

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

1.4 Docker 镜像加载原理

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

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

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

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

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

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

2. 重点理解

  • Docker镜像层都是只读的,容器层是可写的
  • 当容器启动时,一个新的可写层被加载到镜像的顶部。
  • 这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
  • 所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。

3. Docker镜像commit操作案例

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

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

  • 案例演示ubuntu安装vim

    • 从Hub上下载ubuntu镜像到本地并成功运行

    • 原始的默认Ubuntu镜像是不带着vim命令的
      Docker 全栈体系(二)_第13张图片

    • 外网连通的情况下,安装vim
      Docker 全栈体系(二)_第14张图片

    • docker容器内执行上述两条命令:

      • apt-get update
      • apt-get -y install vim

        Docker 全栈体系(二)_第15张图片
  • 安装完成后,commit我们自己的新镜像
    Docker 全栈体系(二)_第16张图片

  • 启动我们的新镜像并和原来的对比
    Docker 全栈体系(二)_第17张图片

    • 官网是默认下载的Ubuntu没有vim命令
    • 我们自己commit构建的镜像,新增加了vim功能,可以成功使用。

4. 小总结

  • Docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像。类似Java继承于一个Base基础类,自己再按需扩展。
  • 新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。
    Docker 全栈体系(二)_第18张图片

五、本地镜像发布到阿里云

1. 本地镜像发布到阿里云流程

Docker 全栈体系(二)_第19张图片

2. 镜像的生成方法

  • 2.1 基于当前容器创建一个新的镜像,新功能增强
    • docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]

    • OPTIONS说明:

      • -a :提交的镜像作者;
      • -m :提交时的说明文字;
        Docker 全栈体系(二)_第20张图片

3. 将本地镜像推送到阿里云

  • 本地镜像素材原型
    在这里插入图片描述

  • 阿里云开发者平台

    • 创建仓库镜像
      Docker 全栈体系(二)_第21张图片
    • 选择控制台,进入容器镜像服务
      Docker 全栈体系(二)_第22张图片
    • 选择个人实例
      Docker 全栈体系(二)_第23张图片
    • 命名空间
      Docker 全栈体系(二)_第24张图片
    • 继续
      Docker 全栈体系(二)_第25张图片
    • 仓库名称
      Docker 全栈体系(二)_第26张图片
      Docker 全栈体系(二)_第27张图片
      Docker 全栈体系(二)_第28张图片
    • 进入管理界面获得脚本
      Docker 全栈体系(二)_第29张图片
  • 将镜像推送到阿里云

    • 将镜像推送到阿里云registry
    • 管理界面脚本
      Docker 全栈体系(二)_第30张图片
    • 脚本实例
docker login --username=zzyybuy registry.cn-hangzhou.aliyuncs.com
docker tag cea1bb40441c registry.cn-hangzhou.aliyuncs.com/atguiguwh/myubuntu:1.1
docker push registry.cn-hangzhou.aliyuncs.com/atguiguwh/myubuntu:1.1

4. 将阿里云上的镜像下载到本地

Docker 全栈体系(二)_第31张图片

docker pull registry.cn-hangzhou.aliyuncs.com/atguiguwh/myubuntu:1.1

六、本地镜像发布到私有库

1. 本地镜像发布到私有库流程

Docker 全栈体系(二)_第32张图片

2. 是什么

  • 官方Docker Hub地址:https://hub.docker.com/,中国大陆访问太慢了且准备被阿里云取代的趋势,不太主流。
  • Dockerhub、阿里云这样的公共镜像仓库可能不太方便,涉及机密的公司不可能提供镜像给公网,所以需要创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。
  • Docker Registry是官方提供的工具,可以用于构建私有镜像仓库。

3. 将本地镜像推送到私有库

3.1 下载镜像Docker Registry

  • docker pull registry
    Docker 全栈体系(二)_第33张图片
    Docker 全栈体系(二)_第34张图片

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

  • docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry
  • 默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便于宿主机联调
    Docker 全栈体系(二)_第35张图片

3.3 案例演示创建一个新镜像,ubuntu安装ifconfig命令

  • 从Hub上下载ubuntu镜像到本地并成功运行
  • 原始的Ubuntu镜像是不带着ifconfig命令的
    Docker 全栈体系(二)_第36张图片
  • 外网连通的情况下,安装ifconfig命令并测试通过
    • docker容器内执行上述两条命令:
      • apt-get update
      • apt-get install net-tools

  • 安装完成后,commit我们自己的新镜像
    • 公式:
      • docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
      • 命令:在容器外执行,记得
        docker commit -m=“ifconfig cmd add” -a=“zzyy” a69d7c825c4f zzyyubuntu:1.2
        Docker 全栈体系(二)_第37张图片
  • curl验证私服库上有什么镜像
    • curl -XGET http://192.168.111.162:5000/v2/_catalog
    • 可以看到,目前私服库没有任何镜像上传过
      在这里插入图片描述
  • 将新镜像zzyyubuntu:1.2修改符合私服规范的Tag
    • 按照公式: docker tag 镜像:Tag Host:Port/Repository:Tag
    • 自己的host主机IP地址,不要粘贴错误,O(∩_∩)O
    • 使用命令 docker tag 将zzyyubuntu:1.2 这个镜像修改为192.168.111.162:5000/zzyyubuntu:1.2
    • docker tag zzyyubuntu:1.2 192.168.111.162:5000/zzyyubuntu:1.2
      Docker 全栈体系(二)_第38张图片
  • 修改配置文件使之支持http
    Docker 全栈体系(二)_第39张图片
  • vim命令新增如下红色内容:vim /etc/docker/daemon.json
    • 理由:docker默认不允许http方式推送镜像,通过配置选项来取消这个限制。====> 修改完后如果不生效,建议重启docker
{
  "registry-mirrors": ["https://aa25jngu.mirror.aliyuncs.com"],
  "insecure-registries": ["192.168.111.162:5000"]
}
  • push推送到私服库

    • docker push 192.168.111.162:5000/zzyyubuntu:1.2
      Docker 全栈体系(二)_第40张图片
  • curl验证私服库上有什么镜像2

    • curl -XGET http://192.168.111.162:5000/v2/_catalog
      Docker 全栈体系(二)_第41张图片
  • pull到本地并运行

    • docker pull 192.168.111.162:5000/zzyyubuntu:1.2
    • docker run -it 镜像ID /bin/bash
      Docker 全栈体系(二)_第42张图片

你可能感兴趣的:(Docker全栈体系,docker,容器,linux)