目录
[docker login](#docker login)
[docker pull](#docker pull)
[docker push](#docker push)
[docker search](#docker search)
[docker logout](#docker logout)
[docker images](#docker images)
[docker image inspect](#docker image inspect)
[docker tag](#docker tag)
[docker rmi](#docker rmi)
[docker build](#docker build)
[docker save](#docker save)
[docker load](#docker load)
[docker history](#docker history)
[docker import](#docker import)
[docker image prune](#docker image prune)
[去 DockerHub 搜索并拉取一个 Nginx 镜像,打包后删除镜像,重新加载 .tar 文件](#去 DockerHub 搜索并拉取一个 Nginx 镜像,打包后删除镜像,重新加载 .tar 文件)
[DockerHub搜索 Nginx 镜像](#DockerHub搜索 Nginx 镜像)
[利用docker pull命令拉取镜像](#利用docker pull命令拉取镜像)
[利用docker save命令将 Nginx:latest打包为一个 Nginx.tar 包](#利用docker save命令将 Nginx:latest打包为一个 Nginx.tar 包)
[利用docker rmi 删除本地的 Nginx:latest](#利用docker rmi 删除本地的 Nginx:latest)
[利用docker load 重新加载 Nginx.tar文件](#利用docker load 重新加载 Nginx.tar文件)
[docker run](#docker run)
[docker ps](#docker ps)
[docker logs](#docker logs)
[docker exec](#docker exec)
[docker rm](#docker rm)
创建一个数据卷,查看数据卷在宿主机的目录位置,实现挂载数据卷,最后修改容器内容
[使用docker run在运行容器的时候,可以通过 -v 参数来挂载一个数据卷到某个容器目录](#使用docker run在运行容器的时候,可以通过 -v 参数来挂载一个数据卷到某个容器目录)
Docker理解
1、Docker本质
Docker本质其实是LXC之类的增强版,它本身不是容器,而是容器的易用工具。容器是Linux内核中的技术,Docker只是把这种技术在使用上普及了。
docker是一个用Go语言实现的开源项目,可以让我们方便的创建和使用容器,docker将程序以及程序所有的依赖都打包到docker container,这样你的程序可以在任何环境都会有一致的表现,这里程序运行的依赖也就是容器就好比集装箱,容器所处的操作系统环境就好比货船或港口,程序的表现只和集装箱有关系(容器),和集装箱放在哪个货船或者哪个港口(操作系统)没有关系。
我们可以看到docker可以屏蔽环境差异,也就是说,只要你的程序打包到了docker中,那么无论运行在什么环境下程序的行为都是一致的,真正实现了"build once, run everywhere"。
2、Docker与虚拟机的区别
|-------|--------------------|-------------------|
| | Docker | 传统虚拟机 |
| 底层 | 系统进程 | 操作系统中的操作系统 |
| 性能 | 体积小、启动速度快、性能好,接近原生 | 虚拟机体积大、启动速度慢、性能一般 |
| 磁盘占用 | 一般为MB | 一般为GB |
| 启动速度 | 秒级 | 分钟级 |
| 隔离策略 | CGroups | Hypervisor |
| 高可用策略 | 弹性、负载、动态 | 备份、容灾、迁移 |
3、Docker和JVM虚拟化的区别
|-------|------------------------------------------------|------------------------------------|
| | JVM | Docker容器 |
| 性能 | JVM需要占用一定的CPU和内存 | 基本没有损失 |
| 虚拟层面 | 基于JVM虚拟化,更加上层 | 基于操作系统,更加通用 |
| 代码无关 | 一个特定代码的执行平台,它是运行时才存在的,只能支撑特定代码的执行,并且必须是在jvm进程内 | 模拟了一整个操作系统,它是静态存在的,可以支撑任何相同平台的应用程序 |
| 主机隔离性 | jvm不隔离主机 | 通过命令空间实现隔离 |
4、容器、镜像的理解
容器就像一个打包工具,打包的不仅是你的程序,也包括运行环境。就好比你把你的开发主机和开发程序完全复制了一份,别人拿到后就不需要搭建环境,也不需要根据环境进行调试,直接就可以运行了。
镜像像是一个包含了OS文件系统和应用的对象,类似虚拟机的模板(比如Window10镜像)。如果你是一个开发 者,可以把镜像看成面向对象编程中的只读类(read-only Class)。
容器和镜像几乎一模一样,唯一的区别是镜像是只读的,而容器上面有一个可读写层。所以容器=镜像+读写层。
5、Docker架构

Docker客户端
是用户和docker交互的一种方式。它用来接收用户指令并且和docker的守护进程进行通信。
Docker服务器
Docker daemon运行在Docker host上,负责创建、运行、监控容器,构建、存储镜像。默认配置下,Docker daemon默认只能响应来自本地Host的客户端请求
Docker镜像
Docker 镜像是用于创建Docker容器的模板。可将Docker镜像看成只读模板,类似于安装系统用到的那个iso文件,我们通过镜像来完成各种应用的部署。通过它可以创建Docker容器。
Docker容器
Docker容器就是Docker镜像的运行实例,容器是独立运行的一个或一组应用。容器可以被启动、开始、停止、删除等操作,每个容器都是相互隔离的。可以把容器看做是一个简易版的linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
镜像仓库
Registry是存放Docker镜像的仓库,Registry分私有和公有两种。
Docker基本操作

1、Docker镜像仓库
镜像仓库(Docker Registry)具备存储、管理和分发镜像的功能,镜像是Docker运行容器的前提,仓库是存放镜像的场所,可见镜像更是Docker的核心。
镜像仓库管理多个Registry,Registry通过命名来区分。每个Registry包含一个或多个镜像,镜像通过镜像名称和标签来区分。
镜像仓库分类
公有仓库:像阿里云、dockerhub等放到公有网络上,不用登录就可以下载镜像,供大家使用
私有仓库:不对外开放,往往位于私有网络,只有内部人员可以使用
镜像仓库命令
查看所有命令
docker --help
docker login
登录到一个Docker镜像仓库


docker pull
从镜像仓库中拉取或者更新指定镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST]

docker push
将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
docker push [OPTIONS] NAME[:TAG]

docker search
从Docker Hub查找镜像
docker search [OPTIONS] TERM

docker logout
登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库Docker Hub
docker logout [SERVER]

2、Docker镜像操作
docker images
查看镜像
docker images [OPTIONS] [REPOSITORY[:TAG]]

docker image inspect
查看镜像详细信息
docker image inspect [OPTIONS] IMAGE [IMAGE...]

docker tag
标记本地镜像,用于推送镜像仓库
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker rmi
删除本地镜像
docker rmi [OPTIONS] IMAGE [IMAGE...]
关键参数:
-f:强制删除
--no-prune:不移除该镜像的过程镜像,默认移除
docker build
通过dockerfile制作镜像
docker save
将指定镜像保存成tar归档文件
docker save [OPTIONS] IMAGE [IMAGE...]
关键参数:
-o:输出到的文件
docker load
导入使用docker save命令导出的镜像
docker load [OPTIONS]
关键参数:
--input,-i:指定导入的文件,代替STDIN
--quiet,-q:精简输出信息
docker history
查看镜像历史
docker history [OPTIONS] IMAGE
关键参数:
-H,--human:大小和日期采用人容易读的格式展现
--no-trunc:显示全部信息,不要隔断
-q,--quiet:只显示镜像id信息
docker import
从归档文件docker export中创建镜像
docker image prune
删除不使用的镜像
docker image prune [OPTIONS]
关键参数:
-a,--all:删除全部不使用的镜像
--filter filter:指定过滤条件
-f,--force:不提示是否删除
去 DockerHub 搜索并拉取一个 Nginx 镜像,打包后删除镜像,重新加载 .tar 文件
DockerHub搜索 Nginx 镜像

查看 Nginx 镜像的帮助文档信息

利用docker pull命令拉取镜像
docker pull nginx

没有指定版本时就为最新版本
查看镜像

利用docker save命令将 Nginx:latest打包为一个 Nginx.tar 包

利用docker rmi 删除本地的 Nginx:latest

利用docker load 重新加载 Nginx.tar文件

3、Docker容器操作
可以通过docker ps查看容器状态
docker run
创建一个新的容器并运行一个命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
关键参数:
-d:后台运行容器,并返回容器ID
-i:以交互模式运行容器,通常与-t同时使用
-P:随机端口映射,容器内部端口随即映射到主机的端口
-p:指定端口映射,格式为:主机(宿主)端口:容器端口
-t:为容器重新分配一个伪输入终端,通常与-i同时使用
--name="nginx-lb":为容器制定一个名称
-h "mars":指定容器的hostname;
-e username="ritchie":设置环境变量
-m:设置容器使用内存最大值
--network="bridge":指定容器的网络连接类型
--link=[]:添加链接到另一个容器
--volume,-v:绑定一个卷
--rm:shell退出的时候自动删除容器
例如:
docker run -d -p 8081:80 nginx:1.23.4

docker ps
查看容器运行状态
关键参数:
-a:查看所有状态的容器
-f:根据条件过滤显示的内容
--format:指定返回值的模版文件,如json或者table
-l:显示latest的容器
-n:列出最近创建的n个容器
--no-trunc:不阶段输出
-q:静默模式,只显示容器编号
-s:显示总的文件大小
docker logs
查看容器日志信息
-f:持续查看容器信息
docker exec
进入容器
docker exec -it mynginx bash
进入mynginx的容器里,
docker rm
删除容器(不能删除运行中的容器)
-f:强制删除
4、数据卷
数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁
数据卷解决了什么问题
容器与数据(容器内文件)耦合所引发的问题:容器内数据修改困难:修改时需进入容器内操作,操作复杂不方便;数据不可复用:容器内的修改对外不可见,也就是说每新建一个容器均需执行一次相关操作;升级维护困难:升级容器时会删除旧容器,而数据存储在容器内,也就是说容器升级时数据会跟随旧容器一同被删除。
数据卷操作
数据卷操作的基本语法:
docker volume [COMMAND]
相关参数:
create:创建数据卷
ls:查看所有数据卷
rm:删除指定数据卷
inspect:查看某个数据卷的详情
prune:清楚数据卷
- 在执行docker run命令时,使用-v 数据卷:容器内目录 可以完成数据卷挂载
- 当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
创建一个数据卷,查看数据卷在宿主机的目录位置,实现挂载数据卷,最后修改容器内容
使用docker run在运行容器的时候,可以通过 -v 参数来挂载一个数据卷到某个容器目录

其中 -v 后面的 html 是我们刚刚创建的数据卷(如果没创建会自动创建),而后面的 /user/share/nginx/html 是对应容器中的目录地址
查看数据卷

查看数据卷的详细信息


vim 打开后可以看到 index.html 并修改标题数据

网页访问
