热门标签 | 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教程


推荐阅读
  • 小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限
    小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • Ansible:自动化运维工具详解
    Ansible 是一款新兴的自动化运维工具,基于 Python 开发,集成了多种运维工具(如 Puppet、CFEngine、Chef、Func 和 Fabric)的优点,实现了批量系统配置、程序部署和命令执行等功能。本文将详细介绍 Ansible 的架构、特性和优势。 ... [详细]
  • Hyperledger Fabric 1.4 节点 SDK 快速入门指南
    本文将详细介绍如何利用 Hyperledger Fabric 1.4 的 Node.js SDK 开发应用程序。通过最新版本的 Fabric Node.js SDK,开发者可以更高效地构建和部署基于区块链的应用,实现数据的安全共享和交易处理。文章将涵盖环境配置、SDK 安装、示例代码以及常见问题的解决方法,帮助读者快速上手并掌握核心功能。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 本文探讨了使用Python进行微服务架构设计的合理性和适用性。首先,介绍了微服务的基本概念及其在现代软件开发中的重要性。接着,通过具体的业务场景,详细分析了Python在微服务架构设计中的优势和挑战。文章还讨论了在实际应用中可能遇到的问题,并提出了相应的解决方案。希望本文能够为从事Python微服务开发的技术人员提供有价值的参考和指导。 ... [详细]
  • 技术日志:Ansible的安装及模块管理详解 ... [详细]
  • 从无到有,构建个人专属的操作系统解决方案
    操作系统(OS)被誉为程序员的三大浪漫之一,常被比喻为计算机的灵魂、大脑、内核和基石,其重要性不言而喻。本文将详细介绍如何从零开始构建个人专属的操作系统解决方案,涵盖从需求分析到系统设计、开发与测试的全过程,帮助读者深入理解操作系统的本质与实现方法。 ... [详细]
  • RancherOS 是由 Rancher Labs 开发的一款专为 Docker 设计的轻量级 Linux 发行版,提供了一个全面的 Docker 运行环境。其引导镜像仅 20MB,非常适合在资源受限的环境中部署。本文将详细介绍如何在 ESXi 虚拟化平台上安装和配置 RancherOS,帮助用户快速搭建高效、稳定的容器化应用环境。 ... [详细]
  • 在 Ubuntu 中遇到 Samba 服务器故障时,尝试卸载并重新安装 Samba 发现配置文件未重新生成。本文介绍了解决该问题的方法。 ... [详细]
  • 近期在研究逆向工程,因此尝试了一些CTF题目。通过合天网络安全实验室的CTF实战演练平台(http://www.hetianlab.com/CTFrace.html),我对Linux逆向工程的掌握还不够深入,因此暂时跳过了RE300题目。首先从逆向100开始,将文件后缀名修改为.apk进行初步分析。这一过程不仅帮助我熟悉了基本的逆向技巧,还加深了对Android应用结构的理解。 ... [详细]
  • Python错误重试让多少开发者头疼?高效解决方案出炉
    ### 优化后的摘要在处理 Python 开发中的错误重试问题时,许多开发者常常感到困扰。为了应对这一挑战,`tenacity` 库提供了一种高效的解决方案。首先,通过 `pip install tenacity` 安装该库。使用时,可以通过简单的规则配置重试策略。例如,可以设置多个重试条件,使用 `|`(或)和 `&`(与)操作符组合不同的参数,从而实现灵活的错误重试机制。此外,`tenacity` 还支持自定义等待时间、重试次数和异常处理,为开发者提供了强大的工具来提高代码的健壮性和可靠性。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 探讨 `org.openide.windows.TopComponent.componentOpened()` 方法的应用及其代码实例分析 ... [详细]
  • 本文将介绍一种扩展的ASP.NET MVC三层架构框架,并通过使用StructureMap实现依赖注入,以降低代码间的耦合度。该方法不仅能够提高代码的可维护性和可测试性,还能增强系统的灵活性和扩展性。通过具体实践案例,详细阐述了如何在实际开发中有效应用这一技术。 ... [详细]
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社区 版权所有