Dokcer 容器基础篇(一)

0. 前提知识储备

  • 熟悉 Linux 命令和相关背景知识
  • 熟悉 Git 相关知识

Docker介绍

什么是Docker

基于 Go 语言的云开源项目
简单来说, 就是将”代码+环境”打包在一起, 使应用达到跨平台无缝接轨使用
“一次封装, 随处运行”

Docker 解决了运行环境和配置问题的软件容器, 方便做持续集成并有助于整体发布的容器虚拟化技术

Docker 可以做什么

虚拟机技术

虚拟机 (Virtual Machine) 就是带环境安装的一种解决方案

它可以在一种操作系统里面运行另一种操作系统. 应用程序对此毫无感知, 因为虚拟机看上去跟真实系统一模一样, 但是对于底层系统来说, 虚拟机就是一个普通文件, 不需要就可以删除. 这就能够使得应用程序, 操作系统和硬件三者之间的逻辑不变.

虚拟机的缺点:

  • 资源占用多
  • 冗余步骤多
  • 启动缓慢

Linux 容器技术

Linux 容器不是模拟一个完整的操作系统, 而是对进程进行隔离. 只需要软件工作所需的库资源和设置

Docker 与传统虚拟化方式的不同之处:

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

二者对比

图片来源: https://jasonhzy.github.io/2018/03/06/docker-command/

Docker 安装

Docker 架构图

Docker 的基本组成

镜像 Image

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

一个镜像可以创建很多容器

容器和镜像的关系可以类比 OOP 中的类和对象

*容器 <-> 对象
*镜像 <-> 类

容器 Container

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

它可以被启动, 开始, 停止, 删除. 每个容器都是相互隔离, 保证安全的平台.

可以把容器看做是一个简易版的 Linux 环境 (包括 root 用户权限, 进程空间, 用户空间和网络空间) 和运行在其中的应用程序

容器的定义和镜像几乎一模一样, 唯一区别是容器最上面一层是可读写的.

仓库 Repository

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

仓库 (Repository) 和仓库注册服务器 (Registry) 是有区别的, 仓库注册服务器往往存放多个仓库, 每个仓库又包含多个镜像, 每个镜像又有不同的标签

总结

Docker 本身是一个容器运行载体或者称之为管理引擎, 我们把应用程序和配置以来打包好形成一个可以交付使用的运行环境.
打包好的运行环境就是一个 Image 镜像文件. 只有通过镜像文件, 生成 Docker 容器. Image 文件就是这个容器的模板.
Docker 根据 Image 文件生> 成容器的实例. 同一个 Image 文件, 可以生成多个同时运行的容器实例.

  • Image 文件生成的容器实例, 本身也是一个文件, 镜像文件
  • 一个容器运行一种服务, 当我们需要的时候, 就可以通过 Docker 客户端创建一个对应的运行实例, 也就是我们的容器
  • 仓库, 类比 GitHub

安装docker

ubuntu安装docker

wget -qO- https://get.docker.com/ | sh 或者 curl -sSL https://get.docker.com/ | sh

centos安装docker

yum install docker -y

mac下安装docker: 可以下载安装包安装

启用/停止/重启docker

service docker start/stop/reload
或者
systemctl start/stop/reload  docker.service 

运行 Hello-World

$ docker run <image_name>

先在本地查找镜像, 找不到就去 Docker Hub 下载, 生成容器. Docker Hub 如果找不到, 返回错误信息

Docker 的底层工作原理

Client-Server 结构的系统, Docker 守护进程 (Daemon) 在主机上, 然后通过 Socket 链接从客户端访问, 守护进程从客户端接受命令并管理运行在主机上的容器.

容器, 是一个运行时环境

为什么 Docker 比 VM 快很多?

1. Docker 有着比虚拟机更少的抽象层. 由于 Docker 不需要 Hypervisor 实现硬件资源虚拟化, 运行在 Docker 容器上的程序直接使用都是实际物理机的硬件资源. 因此在 CPU, 内存利用率上 Docker 将会在效率上有明显优势
2. Docker 利用的是宿主机的内核, 而不需要 Guest OS. 重新创建容器时, 不需要重新加载 OS 内核.

Docker 常用命令

帮助命令

# 查看 Docker 版本号
$ docker version

# 查看当前 Docker 有关信息
$ docker info

# 帮助
$ docker --help

镜像命令

docker images

列出本地的 Images

$ docker images

运行镜像

$ docker run <image_name>
  • REPOSITORY: 镜像仓库源
  • TAG: 镜像的标签
  • IMAGE ID: 镜像 id
  • CREATED: 镜像创建时间
  • SIZE: 镜像大小

同一个仓库源可以有多个 tag, 代表这个仓库源的不同版本. REPOSITORY:TAG 来定义不同的镜像.

若不指定版本标签, 默认使用 latest

常用 OPTIONS:

  • -a: 列出本地所有的镜像 (含中间映像层)
  • -q: 只显示镜像 id (IMAGE ID)
  • --digests: 显示镜像的摘要信息
  • --no-trunc: 显示完整的镜像信息
$ docker search tomcat

OPTIONS:

  • -s: 列出 stars 数不小于指定值
  • --no-trunc: 显示完整镜像信息
  • --automated: 只列出 automated build 类型的镜像

docker pull

下载镜像
docker pull 镜像[:标签]

$ docker search -s 30 tomcat
$ docker pull tomcat

docker rmi

删除镜像

删除单个镜像

$ docker rmi -f hello-world[:latest]

如果不写标签, 默认删除的是 latest

删除多个镜像

$ docker rmi -f hello-world nginx

删除全部镜像

$ docker rmi -f $(docker images -qa)

容器命令

有镜像才能创建容器 (重要前提!!!)

新建并启动容器

$ docker run [OPTIONS] IMAGE [COMMAND] [ARGS]
  • 本地有: 新建运行
  • 本地没有: 去 dockerhub 下载

常用 OPTIONS:

  • --name: 为容器指定一个
  • -d: 后台运行容器, 并返回容器 id, 即启动守护式容器
  • -i: 以交互模式运行容器. 通常与 -t 同时使用
  • -t: 为容器重新分配一个伪输入终端, 通常与 -i 同时使用
  • -P: 随机端口映射
  • -p: 指定端口映射, 一下四种格式
    * ip:hostPort:containerPort
    * ip::containerPort
    * hostPort:containerPort
    * containerPort
# 新建, 进入容器, 创建一个命令行
$ docker run -it <image_id>

启动交互式容器

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

# 列出当前所有正在运行的容器
docker ps

查看 docker 中哪些 container 正在运行

常用 OPTIONS

-a: 列出当前所有正在运行的容器 + 历史上运行过的容器
-l: 显示最近创建的容器
-n: 显示最近 n 个创建的容器
-q: 静默模式, 只显示容器编号
--no-trunc: 不截断输出

退出容器

$ exit
# 离开同时关闭 container, 想要再次进入需要 docker run ...

$ CTRL + P + Q
# 离开, 但是别关闭, 还想再回来使用
# docker ps 查看 container 是否还在运行

一个很形象的比喻:

exit : 出门关灯
CTRL + P + Q : 出门不关灯

启动容器

$ docker start <container_id or container_name>

CTRL + P + Q 离开容器环境以后, 如果想再次进入, 就可以使用上面的命令, 重新进入 container

重启容器

docker restart <container_id or container_name>

将停止掉的 container 重新启动

停止容器

$ docker stop <container_id or container_name>

让该容器”慢慢”停止, 有一段 grace period

强制停止容器

$ docker kill <container_id or container_name>

立刻停止 (拔电源)

删除已经停止的容器

$ docker rm <container_id>

没有 -f 强制删除

一次性删除多个容器

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

重要说明

启动守护式容器

$ docker run -d <container_name>

但是如果我们运行 docker ps -a 进行查看, 会发现容器已经退出

Docker 容器后台运行, 就必须有一个前台进程

查看容器日志

$ docker logs -f -t --tail <container_id>
-t: 时间戳
-f: 跟随最新的日志打印 (追加新的日志)
--tail: 显示最后多少条

查看容器内运行的进程

$ docker top <container_id>

查看容器内部细节

$ docker inspect <container_id>

Docker 镜像就像是”套娃 - 一层套着一层”

进入正在运行的容器并以命令行交互

$ docker exec -it <container_id> ls -l
# 直接返回结果

$ docker attach <container_id>

exec 和 attach 的区别:

exec: 在容器中打开新的终端, 并且可以启动新的进程
attach: 直接进入容器启动命令的终端, 不会启动新的进程

从容器内拷贝文件到主机上

$ docker cp <container_id>:<path> <target_path>
posted @ 2020-10-06 22:31  刘翊扬  阅读(237)  评论(0编辑  收藏  举报