热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Docker基础和常用命令详解_docker

这篇文章主要介绍了Docker基础和常用命令方法的相关资料,

一,Docker 简介

1.1,什么是 Docker

Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。Docker容器与虚拟机类似,但二者在原理上不同。容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、能更高效地利用服务器。

专业名词 Docker 有两个意思:

代指整个 Docker 项目。 代指 Docker 引擎。

Docker 引擎(Docker Engine)是指一个服务端-客户端结构的应用,主要有这些部分:Docker 守护进程、Docker Engine API(页面存档备份,存于互联网档案馆)、Docker 客户端。

1.2,Docker 与虚拟机的区别

传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程。 Docker 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。 特性 Docker 虚拟机 启动 秒级 分钟级 硬盘使用 一般为 MB 一般为 GB 性能 接近原生 弱于 系统支持量 单机支持上千个容器 一般几十个

1.3,Docker 架构

runc 是一个 Linux 命令行工具,用于根据 OCI容器运行时规范 创建和运行容器。
containerd 是一个守护程序,它管理容器生命周期,提供了在一个节点上执行容器和管理镜像的最小功能集。

1.4,为什么用 Docker

Docker 作为一种新的虚拟化技术,跟传统的虚拟化技术相比具有众多的优势:


  1. 更高效的利用系统资源:不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。

  2. 更快速的启动时间:Docker 容器应用直接运行于宿主内核,不需要启动完整的操作系统,所以启动时间可做到秒级的启动时间。

  3. 一致的运行环境:Docker 镜像提供了除内核外完整的运行时环境,确保开发环境、测试环境、生产环境的一致性。

  4. 持续交付和部署:开发人员可以通过 Dockerfile 来进行镜像构建,并结合持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署(Continuous Delivery/Deployment) 系统进行自动部署。

  5. 更轻松的迁移:Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。 更轻松的维护和扩展。

二,Docker 基本概念

Docker 三个基本概念:

镜像(Image) 容器(Container) 仓库(Repository)

2.1,镜像

操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:18.04 就包含了完整的一套 Ubuntu 18.04 最小系统的 root 文件系统。

Docker 镜像 是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像 不包含 任何动态数据,其内容在构建之后也不会被改变。

Docker 镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。其被设计为分层存储的架构,镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。

2.2,容器

镜像(Image)和容器(Container)的关系,类似面向对象程序设计中的类和实例的关系。可以把 Docker容器(Container) 看做是一个简易版的 Linux 环境(包括 root 用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。它可以被启动、开始、停止、 删除。

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。

容器和镜像一样都是使用分层存储,每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层。

2.3,仓库

镜像构建完成后,可以很容器的在当前宿主主机上运行,但是如果需要在其他服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。

一个 Docker Registry 中可以包含多个 仓库(Repository);每个仓库可以包含多个 标签(Tag);每个标签对应一个镜像。

通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如下所示:

registry.sensetime.com/kestrel_tatraffic/kestrel_tatraffic:kestrel_cuda11_1.2.21_opencv3.4.13_with_ffmpeg

Docker仓库(Registry) 分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub, 存放了数量庞大的镜像供用户下载。国内的公开仓库包括 Docker Pool 等,可以提供大陆用户更稳定快速的访问。私有仓库是指用户在本地搭建的私有 Docker Registry。

三,Docker 使用

3.1,Docker 服务

安装 Docker 这里不做介绍。以下是 Linux 系统下,一些 docker 使用命令:

1,查看 Docker 服务状态:使用 systemctl status docker 命令查看 Docker 服务的状态。其中 Active: active (running) 即表示 Docker 服务为正在运行状态。

2,停止 Docker 服务:使用 systemctl stop docker 命令。

3,启动 Docker 服务:使用 systemctl start docker 命令。

4,重启 Docker 服务:使用 systemctl restart docker 命令。

5,测试 Docker 是否安装正确。

$ docker run --rm hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
7050e35b49f5: Pull complete
Digest: sha256:13e367d31ae85359f42d637adf6da428f76d75dc9afeb3c21faea0d976f5c651
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(arm64v8)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/

3.2,下载与使用Docker公共镜像(Images)

1,使用 docker search 命令从 Docker Repo 搜索 Dokcer 可用的镜像。示例命令:docker search ubuntu18.04

2,使用 docker image pull 命令从 Docker Repo 获取指定的 Dokcer镜像(Images)。示例命令: docker image pull docker.io/hello-world。拉取名为 docker.io/hello-world 的镜像。

3,使用 docker image ls 命令查看本地的 Dokcer 镜像(Images)。

4,使用 docker run 命令运行 Dokcer 镜像(Images)。示例命令:docker run hello-world

5,使用 docker info 命令,查看当前 docker容器 的所有的信息。

6,使用 docker version 查看容器的版本信息。

$ dockerd --versio # 这个命令查看 docker 版本更简单
Docker version 19.03.13, build 4484c46d9d

四,Docker 镜像命令

Docker镜像(Images) 也可以理解为是一个用于创建 Docker容器(Container) 的静态模板。一个 Docker镜像(Images) 可以创建很多 Docker容器(Container)。

Docker 镜像常用命令如下:

命令 描述 docker commit 创建镜像。 docker images 查看镜像信息。 docker load 导入镜像。 docker pull 拉取 Docker 镜像。 docker push 上传镜像。 docker rmi 删除镜像。 docker save 导出镜像。 docker search 在 Docker Hub 搜索镜像。 docker tag 为镜像打标签。

五,Docker 容器命令

5.1,docker run 命令

通过 docker run 命令可以基于镜像新建一个容器并启动,语法如下:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

其他常用容器管理命令如下:

# 新建容器并启动
$ docker run [镜像名/镜像ID]
# 启动已终止容器
$ docker start [容器ID]
# 列出本机运行的容器
$ docker ps
# 停止运行的容器
$ docker stop [容器ID]
# 杀死容器进程
$ docker kill [容器ID]
# 重启容器
$ docker restart [容器ID]

5.2 docker run命令语法

1, docker run 命令常用选项:可通过 docker run --help 命令查看全部内容。






































































































































选项说明
-d, --detach=false指定容器运行于前台还是后台,默认为 false。
-i, --interactive=false打开 STDIN,用于控制台交互。
-t, --tty=false分配 tty 设备,该可以支持终端登录,默认为 false。
-u, --user=""指定容器的用户。
-a, --attach=[]登录容器(必须是以 docker run -d 启动的容器)。
-w, --workdir=""指定容器的工作目录。
-c, --cpu-shares=0设置容器 CPU 权重,在 CPU 共享场景使用。
-e, --env=[]指定环境变量,容器中可以使用该环境变量。
-m, --memory=""指定容器的内存上限。
-P, --publish-all=false指定容器暴露的端口。
-p, --publish=[]指定容器暴露的端口。
-h, --hostname=""指定容器的主机名。
-v, --volume=[]给容器挂载存储卷,挂载到容器的某个目录。
–volumes-from=[]给容器挂载其他容器上的卷,挂载到容器的某个目录。
–cap-add=[]添加权限。
–cap-drop=[]删除权限。
–cidfile=""运行容器后,在指定文件中写入容器 PID 值,一种典型的监控系统用法。
–cpuset=""设置容器可以使用哪些 CPU,此参数可以用来容器独占 CPU。
–device=[]添加主机设备给容器,相当于设备直通。
–dns=[]指定容器的 dns 服务器。
–dns-search=[]指定容器的 dns 搜索域名,写入到容器的 /etc/resolv.conf 文件。
–entrypoint=""覆盖 image 的入口点。
–env-file=[]指定环境变量文件,文件格式为每行一个环境变量。
–expose=[]指定容器暴露的端口,即修改镜像的暴露端口。
–link=[]指定容器间的关联,使用其他容器的 IP、env 等信息。
–lxc-cOnf=[]指定容器的配置文件,只有在指定 --exec-driver=lxc 时使用。
–name=""指定容器名字,后续可以通过名字进行容器管理,links 特性需要使用名字。
–net=“bridge”器网络设置:
1. bridge 使用 docker daemon 指定的网桥。
2. host //容器使用主机的网络。
3. container:NAME_or_ID >//使用其他容器的网路,共享 IP 和 PORT 等网络资源。
4. none 容器使用自己的网络(类似–net=bridge),但是不进行配置。
–privileged=false指定容器是否为特权容器,特权容器拥有所有的 capabilities。
–restart=“no”指定容器停止后的重启策略:
1. no:容器退出时不重启。
2. on-failure:容器故障退出(返回值非零)时重启。
3. always:容器退出时总是重启。
–rm=false指定容器停止后自动删除容器(不支持以 docker run -d 启动的容器)。
–sig-proxy=true设置由代理接受并处理信号,但是 SIGCHLD、SIGSTOP 和 SIGKILL 不能被代理。

示例:kestrel 人群等 sdk 使用运行容器的脚本如下:

export BUILDER=registry.sensetime.com/kestrel_tatraffic/kestrel_tatraffic:kestrel_cuda11_1.2.21_opencv3.4.13_with_ffmpeg
# -t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开。
# --rm 指定容器停止后自动删除容器
# --net=host 容器使用主机的网络
# --ipc 要使用的 IPC 模式
# --ipc=host
# -e 指定环境变量,容器中可以使用
# --privileged 指定容器是否为特权容器,特权容器拥有所有的 capabilities
# -u 指定容器的用户为 root
# -entrypoint=bash 覆盖 image 的入口点
# -v 给容器挂载存储卷,挂载到容器的 /kestrel_baggage
# 指定容器的工作目录为 /kestrel_baggage
# ${BUILDER} 为运行的镜像
docker run --gpus '"device=0"' -it --rm --net=host --ipc=host \
-e DISPLAY=$DISPLAY \
--privileged \
-e XAUTHORITY=$XAUTH \
-u root \
--entrypoint=bash \
--ulimit core=-1 \
--security-opt seccomp=unconfined \
-v ${PWD}:/kestrel_baggage \
-w /kestrel_baggage \
${BUILDER}

2,Docker交互式运行的语法为:docker run -i -t IMAGE [COMMAND] [ARG] 。Docker交互式运行,即 Docker 启动直接进入 Docker 镜像内部。

3,使用 docker ps 命令,查看正在运行的 docker。

六,参考资料

Docker-从入门到实践

Docker教程


推荐阅读
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 本文介绍了SELinux的两种主要工作模式——强制模式和宽容模式,并提供了如何在CentOS 7中正确启用和配置SELinux的方法,以及在遇到登录问题时的解决策略。 ... [详细]
  • CentOS下ProFTPD的安装与配置指南
    本文详细介绍在CentOS操作系统上安装和配置ProFTPD服务的方法,包括基本配置、安全设置及高级功能的启用。 ... [详细]
  • 本文详细介绍了如何在智能手机上将电话铃声恢复到原始状态,适用于各种品牌的智能手机。 ... [详细]
  • 本文详细介绍了如何搭建一个高可用的MongoDB集群,包括环境准备、用户配置、目录创建、MongoDB安装、配置文件设置、集群组件部署等步骤。特别关注分片、读写分离及负载均衡的实现。 ... [详细]
  • 本文探讨了在一个物理隔离的环境中构建数据交换平台所面临的挑战,包括但不限于数据加密、传输监控及确保文件交换的安全性和可靠性。同时,作者结合自身项目经验,分享了项目规划、实施过程中的关键决策及其背后的思考。 ... [详细]
  • 本文详细介绍了如何在ARM架构的目标设备上部署SSH服务端,包括必要的软件包下载、交叉编译过程以及最终的服务配置与测试。适合嵌入式开发人员和系统集成工程师参考。 ... [详细]
  • 本文探讨了在Windows系统中运行Apache服务器时频繁出现崩溃的问题,并提供了多种可能的解决方案和建议。错误日志显示多个子进程因达到最大请求限制而退出。 ... [详细]
  • 【小白学习C++ 教程】二十三、如何安装和使用 C++ 标准库
    【小白学习C++ 教程】二十三、如何安装和使用 C++ 标准库 ... [详细]
  • 实现系统调用
    实现系统调用一、实验环境​本次操作还是基于上次编译Linux0.11内核的实验环境进行操作。环境如下:二、实验目标​通过对上述实验原理的认识,相信 ... [详细]
  • 本文详细介绍如何在华为鲲鹏平台上构建和使用适配ARM架构的Redis Docker镜像,解决常见错误并提供优化建议。 ... [详细]
  • Uniswap 与 MoonPay 合作,引入法币交易功能。本文探讨这一合作对用户进入加密货币领域的安全性及便利性的影响。 ... [详细]
  • 本文详细介绍了在Linux操作系统上安装和部署MySQL数据库的过程,包括必要的环境准备、安装步骤、配置优化及安全设置等内容。 ... [详细]
author-avatar
雪影飘枫2502928577
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有