Tim

一枚野生程序员~

  • 主页
  • 分类
  • 标签
  • 归档
  • 关于
所有文章 工具

Tim

一枚野生程序员~

  • 主页
  • 分类
  • 标签
  • 归档
  • 关于

Docker底层原理与命令详解

阅读数:次 2019-08-02
字数统计: 1.6k字   |   阅读时长≈ 6分

Docker 是如何工作的

Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器,是一个运行时环境,就是我们前面说到的集装箱。

mark

docker有着比虚拟机更少的抽象层。由于docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。

docker利用的是宿主机的内核,而不需要Guest OS。因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返个过程,因此新建一个docker容器只需要几秒钟。

mark

所以,把两者对比来看

mark

所以结合之前的理解,镜像与容器的关系更清楚了
mark

Docker常用命令

Usage: docker [OPTIONS] COMMAND

1、帮助命令

docker version 查看版本

docker info 查看详细信息

docker –help 帮助命令

2、镜像命令

① docker images 列出本地主机上的镜像

选项参数

-a :列出本地所有的镜像(含中间映像层)

-q:只显示镜像ID

–digests :显示镜像的摘要信息

–no-trunc :显示完整的镜像信息

mark

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。 如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像(也就是最新的)

② docker search 某个XXX镜像名字

从https://hub.docker.com 这个网站去查找,从阿里云下载,和Maven是一样的

mark

选项参数

–no-trunc : 显示完整的镜像描述

-s : 列出收藏数不小于指定值的镜像

–automated : 只列出 automated build类型的镜像

③ docker pull 某个XXX镜像名字

下载镜像 docker pull 镜像名字[:TAG]

mark

接下来看看Tomcat的镜像大小,居然是506M,为什么?

mark

④ docker rmi 某个XXX镜像名字ID

删除单个 docker rmi -f 镜像ID

删除多个 docker rmi -f 镜像名1:TAG 镜像名2:TAG

删除全部 docker rmi -f $(docker images -qa)

3、容器命令

新建并且启动容器

有镜像才能创建容器,这是根本前提(下载一个CentOS镜像演示)

新建并启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG…]

OPTIONS参数说明:有些是一个减号,有些是两个减号

–name=”容器新名字”: 为容器指定一个名称; -d 后台运行容器,并返回容器ID,也即启动守护式容器; -i 以交互模式运行容器,通常与 -t 同时使用; -t 为容器重新分配一个伪输入终端,通常与 -i 同时使用; -P 随机端口映射; -p 指定端口映射,有以下四种格式 ip:hostPort:containerPort ip::containerPort hostPort:containerPort containerPort

所以下面的 -it 就是交互模式并且登录伪终端

mark

查看运行中和最近运行容器

查看正在运行的容器 docker ps [OPTIONS]

mark

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

退出容器

两种退出容器的方式:

  • exit 容器停止并退出

  • Ctrl + P + Q 容器不停止退出

启动容器

docker start 容器ID或者容器名

重启容器

docker restart 容器ID或者容器名

停止容器

docker stop 容器ID或者容器名

强制停止容器

docker kill 容器ID或者容器名

删除已停止的容器

docker rm 容器ID

一次性删除多个容器

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

  • docker ps -a -q | xargs docker rm

4、重要的容器命令

启动守护式容器

docker run -d 容器名称

mark

很显然启动了一个守护式容器centos,但是启动完成后容器却立马退出了,为什么?

很重要的要说明的一点: Docker容器后台运行,就必须有一个前台进程. 容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。

这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动响应的service即可。例如service nginx start。但是这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,这样的容器后台启动后,会立即自杀,因为他觉得他没事可做了。所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行

查看容器日志

docker logs -f -t –tail 容器ID
​
-t 是加入时间戳
​
-f 跟随最新的日志打印
​
–tail 数字 显示最后多少条

比如在我们启动守护式容器的时候,可以这样启动:

docker run -d centos /bin/sh -c “while true; do each hello tim; sleep 2; done”

这样保持运行而且一直打印日志

mark

查看容器内运行的进程

docker top 容器ID

查看容器内部细节

docker inspect 容器ID

mark

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

docker exec -it 容器ID bashShell
​
重新进入docker attach 容器ID

两种方式的区别:

attach 直接进入容器启动命令的终端,不会启动新的进程

exec 是在容器中打开新的终端,并且可以启动新的进程

所以如果是要在容器中执行很多命令的时候可以进入容器执行,那么就用attach,退出时用Ctrl + Q + P,如果只是一条命令,那么直接使用exec即可!

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

docker cp 容器ID:容器内路径 目的主机路径

mark

5、常用命令的总结

mark

赏

谢谢你请我喝咖啡

支付宝
微信
  • 本文作者: Tim
  • 本文链接: https://zouchanglin.cn/2645412459.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明出处!
  • Docker
  • 虚拟化技术

扫一扫,分享到微信

Docker镜像与数据容器卷
Docker简介与安装
  1. 1. Docker 是如何工作的
  2. 2. Docker常用命令
    1. 2.1. 1、帮助命令
    2. 2.2. 2、镜像命令
    3. 2.3. 3、容器命令
      1. 2.3.1. 新建并且启动容器
      2. 2.3.2. 查看运行中和最近运行容器
      3. 2.3.3. 退出容器
      4. 2.3.4. 启动容器
      5. 2.3.5. 重启容器
      6. 2.3.6. 停止容器
      7. 2.3.7. 强制停止容器
      8. 2.3.8. 删除已停止的容器
    4. 2.4. 4、重要的容器命令
      1. 2.4.1. 启动守护式容器
      2. 2.4.2. 查看容器日志
      3. 2.4.3. 查看容器内运行的进程
      4. 2.4.4. 查看容器内部细节
      5. 2.4.5. 进入正在运行的容器并以命令行交互
      6. 2.4.6. 从容器内拷贝文件到主机上
    5. 2.5. 5、常用命令的总结
© 2017-2021 Tim
本站总访问量次 | 本站访客数人
  • 所有文章
  • 工具

tag:

  • 生活
  • Android
  • 索引
  • MySQL
  • 组件通信
  • Nginx
  • JavaSE
  • JUC
  • JavaWeb
  • 模板引擎
  • 前端
  • Linux
  • 计算机网络
  • Docker
  • C/C++
  • JVM
  • 上传下载
  • JavaEE
  • SpringCloud
  • Golang
  • Gradle
  • 网络安全
  • 非对称加密
  • IDEA
  • SpringBoot
  • Jenkins
  • 字符串
  • vim
  • 存储
  • 文件下载
  • Mac
  • Windows
  • NIO
  • RPC
  • 集群
  • 微服务
  • SSH
  • 配置中心
  • XML
  • Chrome
  • 压力测试
  • Git
  • 博客
  • 概率论
  • 排序算法
  • 分布式
  • 异常处理
  • 文件系统
  • 哈希
  • openCV
  • 栈
  • 回溯
  • SpringCore
  • 流媒体
  • rtmp
  • 面向对象
  • Vue
  • ElementUI
  • 软件工程
  • 异步
  • 自定义UI
  • ORM框架
  • 模块化
  • 交互式
  • Jsoup
  • Http Client
  • LRUCache
  • RabbitMQ
  • 消息通信
  • 服务解耦
  • 负载均衡
  • 权限
  • 多线程
  • 单例模式
  • Protobuf
  • 序列化
  • Python
  • m3u8
  • 堆
  • 二叉树
  • 自定义View
  • 观察者模式
  • 设计模式
  • 线程池
  • 动态扩容
  • 高可用
  • GC
  • ffmpeg
  • SpringMVC
  • REST
  • Redis
  • 缓存中间件
  • UML
  • Maven
  • Netty
  • 高性能网络
  • IPC通信
  • IO
  • Stream
  • 发布订阅
  • SQLite
  • Hash
  • 集合框架
  • 链表
  • Lambda
  • 汇编语言
  • 组件化
  • Router
  • 开发工具

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia-plus根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 思维导图
  • PDF工具
  • 无损放大
  • 代码转图
  • HTTPS证书