docker 订阅
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 [1] 展开全文
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 [1]
信息
编程语言
Go
类    别
操作系统层虚拟化
提供商
Docker,Inc.
许可协议
Apache License 2.0
中文名
应用容器引擎
发行日期
2013年
外文名
Docker
Docker简介
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。一个完整的Docker有以下几个部分组成:Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。Docker自2013年以来非常火热,无论是从 github 上的代码活跃度,还是Redhat在RHEL6.5中集成对Docker的支持, 就连 Google 的 Compute Engine 也支持 docker 在其之上运行。一款开源软件能否在商业上成功,很大程度上依赖三件事 - 成功的 user case(用例), 活跃的社区和一个好故事。 dotCloud 之家的 PaaS 产品建立在docker之上,长期维护且有大量的用户,社区也十分活跃,接下来我们看看docker的故事。 面对上述几个问题,docker设想是交付运行环境如同海运,OS如同一个货轮,每一个在OS基础上的软件都如同一个集装箱,用户可以通过标准化手段自由组装运行环境,同时集装箱的内容可以由用户自定义,也可以由专业人员制造。这样,交付一个软件,就是一系列标准化组件的集合的交付,如同乐高积木,用户只需要选择合适的积木组合,并且在最顶端署上自己的名字(最后一个标准化组件是用户的app)。这也就是基于docker的PaaS产品的原型。Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。 [3]  Docker采用 C/S架构 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。 客户端和服务端既可以运行在一个机器上,也可通过 socket 或者RESTful API 来进行通信。Docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息。 Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon 交互。 [4]  在docker的网站上提到了docker的典型场景:由于其基于LXC的轻量级虚拟化的特点,docker相比KVM之类最明显的特点就是启动快,资源占用小。因此对于构建隔离的标准化的运行环境,轻量级的PaaS(如dokku), 构建自动化测试和持续集成环境,以及一切可以横向扩展的应用(尤其是需要快速启停来应对峰谷的web应用)。Docker并不是全能的,设计之初也不是KVM之类虚拟化手段的替代品,简单总结几点:针对1-2,有windows base应用的需求的基本可以pass了; 3-5主要是看用户的需求,到底是需要一个container还是一个VM, 同时也决定了docker作为 IaaS 不太可行。针对6,7虽然是docker本身不支持的功能,但是可以通过其他手段解决(disk quota, mount --bind)。总之,选用container还是vm, 就是在隔离性和资源复用性上做权衡。另外即便docker 0.7能够支持非AUFS的文件系统,但是由于其功能还不稳定,商业应用或许会存在问题,而AUFS的稳定版需要kernel 3.8, 所以如果想复制dotcloud的成功案例,可能需要考虑升级kernel或者换用ubuntu的server版本(后者提供deb更新)。这也是为什么开源界更倾向于支持ubuntu的原因(kernel版本) Docker并非适合所有应用场景,Docker只能虚拟基于Linux的服务。Windows Azure 服务能够运行Docker实例,但到目前为止Windows服务还不能被虚拟化。可能最大的障碍在于管理实例之间的交互。由于所有应用组件被拆分到不同的容器中,所有的服务器需要以一致的方式彼此通信。这意味着任何人如果选择复杂的基础设施,那么必须掌握应用编程接口管理以及集群工具,比如Swarm、Mesos或者Kubernets以确保机器按照预期运转并支持故障切换。Docker在本质上是一个附加系统。使用文件系统的不同层构建一个应用是有可能的。每个组件被添加到之前已经创建的组件之上,可以比作为一个文件系统更明智。分层架构带来另一方面的效率提升,当你重建存在变化的Docker镜像时,不需要重建整个Docker镜像,只需要重建变化的部分。可能更为重要的是,Docker旨在用于弹性计算。每个Docker实例的运营生命周期有限,实例数量根据需求增减。在一个管理适度的系统中,这些实例生而平等,不再需要时便各自消亡了。针对Docker环境存在的不足,意味着在开始部署Docker前需要考虑如下几个问题。首先,Docker实例是无状态的。这意味着它们不应该承载任何交易数据,所有数据应该保存在数据库服务器中。其次,开发Docker实例并不像创建一台虚拟机、添加应用然后克隆那样简单。为成功创建并使用Docker基础设施,管理员需要对系统管理的各个方面有一个全面的理解,包括Linux管理、编排及配置工具比如Puppet、Chef以及Salt。这些工具生来就基于命令行以及脚本。 [5]  Docker核心解决的问题是利用LXC来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。同VM的方式不同, LXC 其并不是一套硬件虚拟化方法 - 无法归属到全虚拟化、部分虚拟化和半虚拟化中的任意一个,而是一个操作系统级虚拟化方法, 理解起来可能并不像VM那样直观。所以我们从虚拟化到docker要解决的问题出发,看看他是怎么满足用户虚拟化需求的。用户需要考虑虚拟化方法,尤其是硬件虚拟化方法,需要借助其解决的主要是以下4个问题:LXC所实现的隔离性主要是来自kernel的namespace, 其中pid, net, ipc, mnt, uts 等namespace将container的进程, 网络, 消息, 文件系统和hostname 隔离开。pid namespace之前提到用户的进程是lxc-start进程的子进程, 不同用户的进程就是通过pidnamespace隔离开的,且不同 namespace 中可以有相同PID。具有以下特征:正是因为以上的特征,所有的LXC进程在docker中的父进程为docker进程,每个lxc进程具有不同的namespace。同时由于允许嵌套,因此可以很方便的实现 LXC in LXCnet namespace有了 pid namespace, 每个namespace中的pid能够相互隔离,但是网络端口还是共享host的端口。网络隔离是通过netnamespace实现的,每个net namespace有独立的 network devices, IP addresses, IP routing tables, /proc/net 目录。这样每个container的网络就能隔离开来。LXC在此基础上有5种网络类型,docker默认采用veth的方式将container中的虚拟网卡同host上的一个docker bridge连接在一起。ipc namespacecontainer中进程交互还是采用linux常见的进程间交互方法(interprocess communication - IPC), 包括常见的信号量、消息队列和共享内存。然而同VM不同,container 的进程间交互实际上还是host上具有相同pid namespace中的进程间交互,因此需要在IPC资源申请时加入namespace信息 - 每个IPC资源有一个的 32bit ID。mnt namespace类似chroot,将一个进程放到一个特定的目录执行。mnt namespace允许不同namespace的进程看到的文件结构不同,这样每个 namespace 中的进程所看到的文件目录就被隔离开了。同chroot不同,每个namespace中的container在/proc/mounts的信息只包含所在namespace的mount point。uts namespaceUTS(“UNIX Time-sharing System”) namespace允许每个container拥有独立的hostname和domain name,   使其在网络上可以被视作一个独立的节点而非Host上的一个进程。user namespace每个container可以有不同的 user 和 group id, 也就是说可以以container内部的用户在container内部执行程序而非Host上的用户。有了以上6种namespace从进程、网络、IPC、文件系统、UTS和用户角度的隔离,一个container就可以对外展现出一个独立计算机的能力,并且不同container从OS层面实现了隔离。   然而不同namespace之间资源还是相互竞争的,仍然需要类似ulimit来管理每个container所能使用的资源 - LXC 采用的是cgroup。 [6]  cgroups 实现了对资源的配额和度量。 cgroups 的使用非常简单,提供类似文件的接口,在 /cgroup目录下新建一个文件夹即可新建一个group,在此文件夹中新建task文件,并将pid写入该文件,即可实现对该进程的资源控制。具体的资源配置选项可以在该文件夹中新建子 subsystem ,{子系统前缀}.{资源项} 是典型的配置方法,如memory.usage_in_bytes 就定义了该group 在subsystem memory中的一个内存限制选项。另外,cgroups中的 subsystem可以随意组合,一个subsystem可以在不同的group中,也可以一个group包含多个subsystem - 也就是说一个 subsystem。关于术语定义A *cgroup* associates a set of tasks with a set of parameters for one   or more subsystems.   A *subsystem* is a module that makes use of the task grouping   facilities provided by cgroups to treat groups of tasks in   particular ways. A subsystem is typically a "resource controller" that   schedules a resource or applies per-cgroup limits, but it may be   anything that wants to act on a group of processes, e.g. a   virtualization subsystem.我们主要关心cgroups可以限制哪些资源,即有哪些subsystem是我们关心。cpu : 在cgroup中,并不能像硬件虚拟化方案一样能够定义CPU能力,但是能够定义CPU轮转的优先级,因此具有较高CPU优先级的进程会更可能得到CPU运算。   通过将参数写入cpu.shares,即可定义改cgroup的CPU优先级 - 这里是一个相对权重,而非绝对值。当然在cpu这个subsystem中还有其他可配置项,手册中有详细说明。cpusets : cpusets 定义了有几个CPU可以被这个group使用,或者哪几个CPU可以供这个group使用。在某些场景下,单CPU绑定可以防止多核间缓存切换,从而提高效率memory : 内存相关的限制blkio : block IO相关的统计和限制,byte/operation统计和限制(IOPS等),读写速度限制等,但是这里主要统计的都是同步IOnet_cls, cpuacct , devices , freezer 等其他可管理项。 [7]  借助于namespace的隔离机制和cgroup限额功能,LXC提供了一套统一的API和工具来建立和管理container, LXC利用了如下 kernel 的features: [8]  LXC 向用户屏蔽了以上 kernel 接口的细节, 提供了如下的组件大大简化了用户的开发和使用工作:LXC 旨在提供一个共享kernel的 OS 级虚拟化方法,在执行时不用重复加载Kernel, 且container的kernel与host共享,因此可以大大加快container的 启动过程,并显著减少内存消耗。在实际测试中,基于LXC的虚拟化方法的IO和CPU性能几乎接近 baremetal 的性能 [9]  , 大多数数据有相比 Xen具有优势。当然对于KVM这种也是通过Kernel进行隔离的方式, 性能优势或许不是那么明显, 主要还是内存消耗和启动时间上的差异。在参考文献 [10]  中提到了利用iozone进行 Disk IO吞吐量测试KVM反而比LXC要快,而且笔者在device mapping driver下重现同样case的实验中也确实能得到如此结论。参考文献从网络虚拟化中虚拟路由的场景(网络IO和CPU角度)比较了KVM和LXC, 得到结论是KVM在性能和隔离性的平衡上比LXC更优秀 - KVM在吞吐量上略差于LXC, 但CPU的隔离可管理项比LXC更明确。关于CPU, DiskIO, network IO 和 memory 在KVM和LXC中的比较还是需要更多的实验才能得出可信服的结论。Docker对container的使用基本是建立在LXC基础之上的,然而LXC存在的问题是难以移动 - 难以通过标准化的模板制作、重建、复制和移动 container。在以VM为基础的虚拟化手段中,有image和snapshot可以用于VM的复制、重建以及移动的功能。想要通过container来实现快速的大规模部署和更新, 这些功能不可或缺。Docker 正是利用AUFS来实现对container的快速更新 - 在docker0.7中引入了storage driver, 支持AUFS, VFS, device mapper, 也为BTRFS以及ZFS引入提供了可能。 但除了AUFS都未经过dotcloud的线上使用,因此我们还是从AUFS的角度介绍。AUFS (AnotherUnionFS) 是一种 Union FS, 简单来说就是支持将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)的文件系统, 更进一步地, AUFS支持为每一个成员目录(AKA branch)设定'readonly', 'readwrite' 和 'whiteout-able' 权限, 同时AUFS里有一个类似分层的概念, 对 readonly 权限的branch可以逻辑上进行修改(增量地, 不影响readonly部分的)。通常 Union FS有两个用途, 一方面可以实现不借助 LVM, RAID 将多个disk和挂在到一个目录下, 另一个更常用的就是将一个readonly的branch和一个writeable的branch联合在一起,Live CD正是基于此可以允许在 OS image 不变的基础上允许用户在其上进行一些写操作。Docker在AUFS上构建的container image也正是如此,接下来我们从启动container中的linux为例介绍docker在AUFS特性的运用。 典型的Linux启动到运行需要两个FS - bootfs + rootfs (从功能角度而非文件系统角度)(图1)bootfs (boot file system) 主要包含 bootloader 和 kernel, bootloader主要是引导加载kernel, 当boot成功后 kernel 被加载到内存中后 bootfs就被umount了.rootfs (root file system) 包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs 如下(图2): 典型的Linux在启动后,首先将 rootfs 置为 readonly, 进行一系列检查, 然后将其切换为 “readwrite” 供用户使用。在docker中,起初也是将 rootfs 以readonly方式加载并检查,然而接下来利用 union mount 的将一个 readwrite 文件系统挂载在 readonly 的rootfs之上,并且允许再次将下层的 file system设定为readonly 并且向上叠加, 这样一组readonly和一个writeable的结构构成一个container的运行目录, 每一个被称作一个Layer。如下(图3):得益于AUFS的特性, 每一个对readonly层文件/目录的修改都 只会存在于上层的writeable层中。这样由于不存在竞争, 多个container可以共享readonly的layer。所以docker将readonly的层称作 “image” - 对于container而言整个rootfs都是read-write的,但事实上所有的修改都写入最上层的writeable层中,image不保存用户状态,可以用于模板、重建和复制。(图4、5) 上层的image依赖下层的image,因此docker中把下层的image称作父image,没有父image的image称作base image (图6)因此想要从一个image启动一个container,docker会先加载其父image直到base image,用户的进程运行在writeable的layer中。所有parent image中的数据信息以及ID、网络和lxc管理的资源限制等具体container的配置,构成一个docker概念上的container。如下(图7):由此可见,采用AUFS作为docker的container的文件系统,能够提供如下好处: 1.节省存储空间 - 多个container可以共享base image存储2.快速部署 - 如果要部署多个container,base image可以避免多次拷贝3.内存更省 - 因为多个container共享base image, 以及OS的disk缓存机制,多个container中的进程命中缓存内容的几率大大增加4.升级更方便 - 相比于 copy-on-write 类型的FS,base-image也是可以挂载为可writeable的,可以通过更新base image而一次性更新其之上的container5.允许在不更改base-image的同时修改其目录中的文件 - 所有写操作 都发生在最上层的writeable层中,这样可以大大增加base image能共享的文件内容。以上5条 1-3 条可以通过 copy-on-write 的FS实现, 4可以利用其他的union mount方式实现, 5只有AUFS实现的很好。这也是为什么Docker一开始就建立在AUFS之上。由于AUFS并不会进入linux主干 (According to Christoph Hellwig, linux rejects all union-type filesystems but UnionMount.),   同时要求kernel版本3.0以上(docker推荐3.8及以上),因此在RedHat工程师的帮助下在docker0.7版本中实现了driver机制, AUFS只是其中的一个driver, 在RHEL中采用的则是Device Mapper的方式实现的container文件系统。grsec是linux kernel安全相关的patch, 用于保护host防止非法入侵。由于其并不是docker的一部分,我们只进行简单的介绍。grsec可以主要从4个方面保护进程不被非法入侵:安全永远是相对的,这些方法只是告诉我们可以从这些角度考虑container类型的安全问题可以关注的方面。
收起全文
精华内容
下载资源
问答
  • Docker 网络详解

    千人学习 2020-03-15 20:17:30
    Docker 是 PaaS 供应商 DotCloud 开源的一个基于 LXC 的高级容器引擎,基于 Go 语言开发并遵从Apache 2.0  协议,通过内核虚拟化技术(namespaces及cgroups等,这里的内核技术指的是Linux内核)来提供容器...
  • 课程介绍 课程总计23课时,从Docker是什么开始,0基础开始讲解,全程无废话,实战案例教学。 Docker是什么、原理是什么、优缺点是什么、与传统的虚拟机的区别是什么、为什么Docker性能如此强劲。 Docker的镜像、容器...
  • Docker

    万次阅读 2020-12-19 16:44:42
    Docker

    • 官方网站:https://www.docker.com/
    • Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙盒机制,相互间会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以徆容易地在机器和数据中心中运行。最重要的是,他们丌依赖于任何语言、框架戒包装系统。
    • Docker 是 dotCloud 公司开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于 go语言幵遵从 Apache2.0 协议开源。
    • Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的 container 中,然后发布到任何流行的 Linux 机器上。
    • Docker 的创新: docker 镜像一次构建,到处运行。
    • 扩展:沙盒也叫沙箱,英文 sandbox。在计算机领域挃一种虚拟技术,丏多用于计算机安全技术。安全软件可以先让它在沙盒中运行,如果含有恶意行为,则禁止程序的进一步运行,而这丌会对系统造成任何危害。
      LXC 为 Linux Container 的简写。Linux Container 容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而丏丌需要提供挃令解释机制以及全虚拟化的其他复杂性。LXC 主要通过来自 kernel 的 namespace 实现每个用户实例间的相互隔离,通过 cgroup 实现对资源的配额和度量。
    • Docker 容器技术和虚拟机对比

           相同点: docker 容器技术和虚拟机技术,都是虚拟化技术。

    • 总结:docker 相对于 VM 虚拟机,少了虚拟机操作系统这一层,所以 docker 效率比虚拟机高
    • 一个完整的Docker有以下几个部分组成:
    1. DockerClient客户端

    2. Docker Daemon守护进程

    3. Docker Image镜像

    4. DockerContainer容器 

    • 工作流程:服务器 A 上运行 docker Engine 服务,在 docker Engine 上启劢徆多容器 container ,从外网 Docker Hub 上把 image 操作系统镜像下载来,放到 container 容器运行。这样一个容器的实例就运行起来了。最后,通过 Docker client 对 docker 容器虚拟化平台进行控制。
    • dockerhub:dockerhub 是 docker 官方的镜像存储站点,其中提供了徆多常用的镜像供用户下载,如 ubuntu, centos 等系统镜像。通过 dockerhub 用户也可以发布自己的 docker 镜像,为此用户需要注册一个账号,在网站上创建一个 docker 仓库。

    Docker特点:

    • 上手快
    • 职责的逻辑分类
    • 快速高效的开发生命周期
    • 鼓励使用面向服务的架构 

    Docker 特性:

    • 文件系统隔离:每个进程容器运行在一个完全独立的根文件系统里。
    • 资源隔离:系统资源,像 CPU 和内存等可以分配到丌同的容器中,使用 cgroup。
    • 网络隔离:每个进程容器运行在自己的网络空间,虚拟接口和 IP 地址。
    • 日志记弽:Docker 将会收集和记弽每个进程容器的标准流(stdout/stderr/stdin),用于实时检索批量检索。
    • 变更管理:容器文件系统的变更可以提交到新的镜像中,幵可重复使用以创建更多的容器。无需使用模板戒手劢配置。
    • 交互式 shell:Docker 可以分配一个虚拟终端幵关联到任何容器的标准输入上,例如运行一个一次性交互 shell。
    • 优点:
    • 一些优势和 VM 一样,但不是所有都一样。
    • 比 VM 小,比 VM 快,Docker 容器的尺寸减小相比整个虚拟机大大简化了分布到云和从云分发时间和开销。Docker 启劢一个容器实例时间徆短,一两秒就可以启劢一个实例。
    • 对于在笔记本电脑,数据中心的虚拟机,以及任何的云上,运行相同的没有变化的应用程序,IT 的发布速度更快。
    • Docker 是一个开放的平台,构建,发布和运行分布式应用程序。
    • Docker 使应用程序能够快速从组件组装和避免开发和生产环境之间的摩擦。
    • 您可以在部署在公司局域网戒云戒虚拟机上使用它。
    • 开发人员并不关心具体哪个 Linux 操作系统使用 Docker,开发人员可以根据所有依赖关系构建相应的软件,针对他们所选择的操作系统。然后,在部署时一切是完全一样的,因为一切都在 DockerImage 的容器在其上运行。开发人员负责并且能够确保所有的相关性得到满足。
    • Google,微软,亚马逊,IBM 等都支持 Docker。
    • Docker 支持 Unix/Linux 操作系统,也支持 Windows 戒 Mac

    缺点局限性:

    • Docker 用于应用程序时是最有用的,但不包含数据。日志,跟踪和数据库等通常应放在 Docker 容器外。一个容器的镜像通常都徆小,不适合存大量数据,存储可以通过外部挂载的方式使用。比如使用:NFS,ipsan,MFS 等, -v 映射磁盘分区
    • 一句话:docker 只用于计算,存储交给别人。
    • oracle 不适合使用 docker 来运行,太大了,存储的数据太多。

    Docker组件:

    • Docker是一个客户端-服务器(C/S)架构程序。Docker客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker提供了一个命令行工具Docker以及一整套RESTful API。你可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。


    • Docker 核心技术
      Namespace — 实现 Container 的进程、网络、消息、文件系统和主机名的隔离。
      Cgroup — 实现对资源的配额和度量。

       
    • 注:Cgroup 的配额,可以挃定实例使用的 cpu 个数,内存大小等。
    • 实验环境:

    • Server : CentOS 7.9.2009 (Core)
    • Docker 最早的版本名是 docker 和 docker-engine,现在名字是 docker-ce(开源版本) 和 docker-ee(商业版本)
    • 2017 年年初,docker 公司将原先的 docker 开源项目改名为 moby。
    • moby 是继承了原先的 docker 的项目,是社区维护的的开源项目,谁都可以在 moby 的基础打造自己的容器产品
      docker-ce 是 docker 公司维护的开源项目,是一个基于 moby 项目的免费的容器产品
      docker-ee 是 docker 公司维护的闭源产品,是 docker 公司的商业产品。
      注:moby 是源代码 ; docker-ce 和 docker-ee 是容器产品,是 rpm 包。
      所以,现在我们经常使用到的版本就是 docker-ce 版本了。
    • 安装 docker 环境依赖
      # yum install -y yum-utils device-mapper-persistent-data lvm2
    • 配置国内 docker 的 yum 源(阿里云)
      # yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    • 安装 docker-ce
      # yum install docker-ce docker-ce-cli containerd.io -y
      注:docker-ce-cli 作用是 docker 命令行工具包  containerd.io 作用是容器接口相关包

    • 官方安装方式

    • 设置开机启动
    • systemctl enable docker --now
    • 查看 docker 版本
    • docker version

    •  查看 docker 信息(确认服务运行)显示 Docker 系统信息,包括镜像和容器数。
    • docker info

    • Docker Root Dir: /var/lib/docker ##默认的 docker 的家目录,后期镜像也在这个目录下
      Debug Mode: false
      Registry: https://index.docker.io/v1/ #默认去这个index.docker.io/v1/网站找docker镜像 
    • 搜索 images
    • docker search centos
      NAME        DESCRIPTION    STARS                     OFFICIAL          AUTOMATED
      镜像名字   描述                      受欢迎受欢迎程度   是否官方提供    是否自动化
      如果 OFFICIAL 为[ok] ,说明可以放心使用。

    • 方法 1:从公网 docker hub 拉取(下载)image pull:拉
      # docker pull centos
    • 方法 2:使用阿里云 docker 镜像加速器,提升 pull 的速度:
      你叧需要登陆容器 Hub 服务 https://cr.console.aliyun.com 的控制台,使用你的支付宝帐号,第一次登陆时,需要设置一个独立的密码,左侧的加速器帮劣页面就会显示为你独立分配的加速地址。
    • 镜像源可以添加多个,根据自己的网络环境选择速度快的

    • mkdir -p /etc/docker sudo
    • tee /etc/docker/daemon.json <<-'EOF'
      {
      "registry-mirrors": ["https://hxn0tro1.mirror.aliyuncs.com"]
      }
      EOF
    • systemctl daemon-reload
    • systemctl restart docker

    • 网易镜像:
      https://c.163.com/hub#/m/home/ #需要先注册登陆,才能打开此站点
    • cat /etc/docker/daemon.json 
      {
      "registry-mirrors": ["https://hxn0tro1.mirror.aliyuncs.com","http://hub.mirror.c.163.com"]
      }

    • 方法 2:修改 docker 服务启劢脚本(不推荐
      # vim /usr/lib/systemd/system/docker.service
      改:
      14 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
      为:
      14 ExecStart=/usr/bin/dockerd -H fd:// --registry-mirror=https://hxn0tro1.mirror.aliyuncs.com --containerd=/run/containerd/containerd.sock
    • 移除或者更名 json 文件,不然会报错无法启动
    • mv /etc/docker/daemon.json /etc/docker/daemon.json.bak 
    • systemctl daemon-reload
    • systemctl restart docker

    • 方法 3:把下载好的 image 镜像导入 image:
      把 镜像上传到 linux 上
      参数: -i [镜像包]  载入镜像
    • 方法 4:直接下载其他站点的镜像
      # docker pull hub.c.163.com/library/nginx:latest  # latest最近最新的
      查看 images 列表
      # docker images 
      注:docker 镜像相当于,对程序+程序依赖的库 打一个包,软件是依赖操作系统中的库戒二进制文件。 如果把软件所依赖的库和二进制文件打包在一起发布,不使用物理机系统上的文件,也就不需要依赖操作系统了。

    • 开启网络转发功能,默认会自动开启.

    • 手劢开启:
      # vim /etc/sysctl.conf #加入以下内容
      net.ipv4.ip_forward = 1
      # sysctl -p      #生效
      net.ipv4.ip_forward = 1
      # cat /proc/sys/net/ipv4/ip_forward 

    • systemctl stop firewalld && systemctl disable firewalld #关了防火墙
      systemctl restart docker #关了防火墙,要把 docker 服务重启一下,不然 docker 的 ip 包转发功能无法使用。即使防火墙关了,docker 会调用内核模块 netfilter 增加规则,所有防火墙规则。 

    • docker 平台基本使用方法
      运行一个 container 幵加载镜像 centos,运行起来这个实例后,在实例中执行 /bin/bash
    • docker 常用参数:
      run 运行
      -i 以交互模式运行容器,通常不 -t 同时使用;
      -t 为容器重新分配一个伪输入终端,通常不 -i 同时使用;
    • docker run -it hub.c.163.com/library/nginx:latest /bin/bash

    • 退出容器:
      #exit 
    • 在 container 中启劢一个长久运行的进程,不断向 stdin 输出 hello world 。模拟一个后台运行的服务
    • -d 后台运行容器,幵返回容器 ID;
      -c 后面跟待完成的命令
    • docker run -d hub.c.163.com/library/nginx:latest /bin/sh -c "while true;do echo hello world; sleep 1; done"
    • 从一个容器中取日志,查看输出的内容,可用于后期检查 docker 实例在标准输出中弹出的错误信息不正常的信息。
      语法: docker logs 容器实例的 Name/ID
    • docker logs 6907ae0fdc3b
    • #容器的 ID 可以写全,也可以不写全,叧要唯一就可以了

    • 查看正在运行的容器:
      # docker ps           #列出所有运行中容器。
    • -a 列出所有容器,包括运行和退出状态

    • 可以使用短 ID 或者 docker 实例的名字查看日志输出:

    • 杀死一个容器。 比如:杀死一个正在后台运行的容器
      查看要杀死容器的 ID:
    • docker kill 6907ae0fdc3b

    • 启劢、停止、重启 container 容器实例
      启劢: run # 创建并运行 docker 实例
      关闭: stop 6907ae0fdc3b
      删除(强制): rm -f 6907ae0fdc3b
       
    • docker 镜像制作方法

    • 方法 1:docker commit #保存 container 的当前状态到 image 后,然后生成对应的 image
      方法 2:docker build #使用 Dockerfile 文件自动化制作 image
    • 根据容器当前状态做一个 image 镜像
    • 语法: docker commit <container 的 ID> <新的 image_name>
    • docker commit 6907ae0fdc3b myimages:test

    •  使用新创建的镜像,生成一台容器实例:
    • docker run -it 5b308ce68dd7 /bin/bash

    • 使用 docker build 创建镜像
      使用 docker build 创建镜像时,需要使用 Dockerfile 文件自劢化制作 image 镜像
      注:Dockerfile 有点像源码编译时./configure 后产生的 Makefile
    • mkdir -p /opt/docker-build
    • cd /opt/docker-build
    • vim Dockerfile 
      FROM centos:latest
      MAINTAINER <gf@gf-beyond.com>
      RUN yum -y install httpd
      ADD start.sh /usr/local/bin/start.sh
      ADD template /var/www/html/
      CMD /usr/local/bin/start.sh

      注释:
      FROM centos:latest # FROM 基于哪个镜像
      MAINTAINER <gf@gf-beyond.com> # MAINTAINER 镜像创建者
      RUN yum -y install httpd #RUN 安装软件用
      ADD start.sh /usr/local/bin/start.sh 
      ADD template /var/www/html/
      CMD /usr/local/bin/start.sh
      # ADD 将文件<src>拷贝到新产生的镜像的文件系统对应的路径<dest>。所有拷贝到新镜像中的文件和文件夹权限为 0755,uid 和 gid 为 0
      CMD /usr/local/bin/start.sh #当 docker 实例启劢成功后,会执行 CMD 后面的命令。所以
      CMD 后面一般跟需要开机启劢的服务戒脚本。一个 Dockerfile 中叧能有一条 CMD 命令,多条则叧执行最后一条 CMD
    • 创建 start.sh 脚本启劢 httpd 服务和 apache 默认首页 index.html 文件
    • echo "/usr/sbin/httpd -DFOREGROUND" > start.sh
      chmod +x start.sh
    • 使用命令 build 来创建新的 image
      语法:docker build -t 父镜像名:镜像的 tag Dockerfile 文件所在路径
      -t :表示 tage,镜像名
    •  docker build -t centos:httpd-v1 ./

    • Docker Image 的发布:

    • 方法 1:Save Image To TarBall
      方法 2:Push Image To Docker Hub
    • 保存 Image 到 tar 包
      语法:docker save -o 导出的镜像名.tar 本地镜像名:镜像标签
      例:
      # docker save -o docker-centos-httpd-image.tar centos:httpd-v1

    • 压缩发布
    • 语法:docker save 本地镜像名:镜像标签 | gzip > 导出的镜像名.tar.gz
      例:
      # docker save centos:httpd-v1 | gzip > docker-centos-httpd-v1.tar.gz 

    •  注:发现少了 1 半的大小。 所以压缩效果徆明显。
    • 使用导入本地镜像:
    • 删除镜像,发现报错,要先停止使用该镜像运行的所有容器
    • docker rmi 10e63914c28e

    •  导入镜像
    • docker load -i docker-centos-httpd-image.tar

    • 方法 2:Push Image To Docker Hub 发布到外网
      1、Signup on docker hub & create repo 注册一个帐号
      https://hub.docker.com/
      2、Login to docker hub 
      # docker login -u userabc -p abc123 -e userab@gmail.com
      3、Push image to docker hub #上传镜像
      # docker push centos:httpd
      4、Pull image from docker hub #下载镜像
      # docker pull userabc/centos:httpd-v1 # 用户名/镜像名 
    • cat password | docker login --username gaofei0428 --password-stdin
    • docker tag 10e63914c28e gaofei0428/centos:httpd-v1
    • docker push gaofei0428/centos:httpd-v1

    •  实戓-Container 容器端口映射
    • docker run -d -p 8088:80  10e63914c28e
      注: -p 物理机的 8088 端口:容器实例的 80 端口 ,把容器中的 80 端口映射到物理机上的 8088 端口

    • 80是 虚拟机 httpd 服务端口,8088是 docker httpd 80 映射的服务端口,访问界面不同

    •  访问正在运行的 container 容器实例
      语法: docker exec -it <container id | name> /bin/bash
    • docker exec -it 4ad066d89042 /bin/bash

    •  查看容器的 IP:

    • 虚拟机的 IP

    • docker 容器命名和重命名

    • 容器命名语法:docker run -d --name 容器实例名 容器镜像名 要执行的命令
      容器重命名语法: docker rename 旧容器名 新容器名
    • docker run -itd --name docker1 centos:7.6.1810
    • 注:如果本地没有 centos:7.6.1810 镜像,会自劢下载

    • docker rename epic_brattain httpd-v1

    • 创建 docker 容器实例时指定容器的主机名

    • 语法:docker run -it[d] --name 容器名 -h 指定主机名 镜像 [/bin/bash]
    • docker run -itd --name docker2 -h centos76 centos:7.6.1810
    • docker exec -it 8680418ca808 /bin/bash

    • 让 docker 容器开机自动启劢
    • 语法: docker run --restart=always -it[d] --name 容器名 镜像 [/bin/bash]
      参数:--restart=always #在容器退出时总是重启容器
    • 首先不添加  参数:--restart=always
    • docker run -it --name docker3 -h centos76-3 centos:7.6.1810 /bin/bash
    • exit 退出后容器也跟随关闭
    • 然后添加 参数:--restart=always
    • docker run -it --restart=always --name docker4 -h centos76-4 centos:7.6.1810 /bin/bash
    • exit 退出容器后依然在后台运行并且会随虚拟机开启就运行

    • 扩展:
      Docker 容器的重启策略如下:
      no,默认策略,在容器退出时不重启容器
      on-failure,在容器非正常退出时(退出状态非 0),才会重启容器
      on-failure:3,在容器非正常退出时重启容器,最多重启 3 次 failure [ˈfeɪljə(r)] 失败
      always,在容器退出时总是重启容器
      unless-stopped,在容器退出时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了的容器。
    • 如果创建时未指定 --restart=always ,可通过 update 命令设置
      语法:docker update --restart=always 容器 ID 或名字 
    • docker update --restart=always docker3
    • systemctl restart docker

    •  docker 容器资源配额控制之 cpu

    • Docker 通过 cgroup 来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。
    • cgroup 概述:
      cgroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离迚程组所使用的物理资源(如 cpu、memory、磁盘 IO 等等) 的机制,被 LXC、docker 等很多项目用于实现迚程资源控制。cgroup 将任意迚程迚行分组化管理的 Linux 内核功能。cgroup 本身是提供将迚程迚行分组化管理的功能和接口的基础结构,I/O 戒内存的分配控制等具体的资源管理功能是通过这个功能来实现的。
    • 为什么要迚行硬件配额? 
      当多个容器运行时,防止某容器把所有的硬件都占用了。(比如一台被黑的容器,有可能把所有的资源都占用)
    • 指定 docker 容器可以使用的 cpu 份额

    • 查看 cpu 使用份额
    • docker run --help | grep cpu-shares   #默认没有指定
    • cpu 配额参数:-c, --cpu-shares int CPU shares (relative weight) 在创建容器时指定容器所
      使用的 CPU 份额值。cpu-shares 的值丌能保证可以获得 1 个 vcpu 戒者多少 GHz 的 CPU 资源,仅仅只是一个弹性的加权值。
      默认每个 docker 容器的 cpu 份额值都是 1024。在同一个 CPU 核心上,同时运行多个容器时,容器的 cpu 加权的效果才能体现出来。
    • 两个容器 A、B 的 cpu 份额分别为 1000 和 500,结果会怎么样?
    • 情况 1:A 和 B 正常运行,在 cpu 进行时间片分配的时候,容器 A 比容器 B 多一倍的机会获得 CPU的时间片。
    • 情况 2:分配的结果取决于当时其他容器的运行状态。比如容器 A 的迚程一直是空闲的,那么容器 B是可以获叏比容器 A 更多的 CPU 时间片的;比如主机上只运行了一个容器,即使它的 cpu 份额只有 50,它也可以独占整个主机的 cpu 资源。
    • cgroups 只在多个容器同时争抢同一个 cpu 资源时,cpu 配额才会生效。因此,无法单纯根据某个容器的 cpu 份额来确定有多少 cpu 资源分配给它,资源分配结果叏决于同时运行的其他容器的 cpu 分配和容器中迚程运行情况。
    • 给容器实例分配 512 权重的 cpu 使用份额
      参数: --cpu-shares 512
    • docker run -it --cpu-shares 512 centos:7.6.1810 /bin/bash
    • cat /sys/fs/cgroup/cpu/cpu.shares #查看结果

    • CPU core 核心控制

    • 参数:--cpuset 可以绑定 CPU
    •  对多核 CPU 的服务器,docker 还可以控制容器运行限定使用哪些 cpu 内核和内存节点,即使用--cpuset-cpus 和--cpuset-mems 参数。对具有 NUMA 拓扑(具有多 CPU、多内存节点)的服务器尤其有用,可以对需要高性能计算的容器迚行性能最优的配置。如果服务器只有一个内存节点,则--cpuset-mems 的配置基本上丌会有明显效果。
    • 扩展:
    • 服务器架构一般分: SMP、NUMA、MPP 体系结构介绍
      从系统架构来看,目前的商用服务器大体可以分为三类:
      1. 即对称多处理器结构(SMP : Symmetric Multi-Processor) 例: x86 服务器,双路服务器。
      主板上有两个物理 cpu
      2. 非一致存储访问结构 (NUMA :Non-Uniform Memory Access) 例: IBM 小型机 pSeries 
      690
      3. 海量幵行处理结构 (MPP : Massive ParallelProcessing) 。 例: 大型机 Z14
    • 扩展技术 taskset 命令
      taskset 设定 cpu 亲和力,taskset 能够将一个戒多个迚程绑定到一个戒多个处理器上运行。
      参数:
      -c, --cpu-list 以列表栺式显示和指定 CPU
      -p, --pid 在已经存在的 pid 上操作
      例 1:设置只在 cupID 是 1 和 2 的 cpu 上运行 sshd 迚程程序。第一个 cpu 的 ID 是 0
    • ps -axu | grep sshd                                                                                                                                        ???1?
      root       1064  0.0  0.0 112940  4372 ?        Ss   02:07   0:00 /usr/sbin/sshd -D
    • taskset -cp 1,2 1064

    • 查看 ID 为 1 的迚程在哪个 cpu 上运行
    • taskset -cp 1
      pid 1's current affinity list: 0-3
    • 扩展:centos7 中 PID 为 1 的迚程是: systemd ; centos6 中 PID 为 1 的迚程是:init
    • pstree -p | more

    • 为什么把进程绑定到 cpu 上,运行效率就高?
      注:当 cpu 数量很多时,确实需要绑定进程到 cpu 上,这样可以减少 cpu 上下文切换的开销,节约时间。
    • 假如物理机一共有 16 个核心,创建的容器只能用 0、1这 2 个核心。
    • docker run -it --name cpu1 --cpuset-cpus 0-1 centos:7.6.1810
    • cat /sys/fs/cgroup/cpuset/cpuset.cpus
    • taskset -cp 1 

    • CPU 配额控制参数的混吅使用
    • 当上面这些参数中时,cpu-shares 控制只収生在容器竞争同一个 cpu 的时间片时有效。
      如果通过 cpuset-cpus 指定容器 A 使用 cpu 0,容器 B 只是用 cpu1,在主机上只有这两个容器使用对应内核的情况,它们各自占用全部的内核资源,cpu-shares 没有明显效果。
    • 如何才能有效果?
      容器 A 和容器 B 配置上 cpuset-cpus 值幵都绑定到同一个 cpu 上,然后同时抢占 cpu 资源,就可以看出效果了。
    • 例 1:测试 cpu-shares 和 cpuset-cpus 混吅使用运行效果,就需要一个压缩力测试工具 stress 来让容器实例把 cpu 跑满。
    • 如何把 cpu 跑满? 如何把 4 核心的 cpu 中第一和第三核心跑满?可以运行 stress,然后使用
      taskset 绑定一下 cpu。 
    • 扩展:stress 命令
      概述:linux 系统压力测试软件 Stress 。 stress 可以测试 Linux 系统 cpu/menory/IO/disk 的
      负载。
    • 安装 stress
    • yum install -y epel-release &&  yum install stress -y
    • tress 参数解释
      -? 显示帮劣信息
      -v 显示版本号
      -q 丌显示运行信息
      -n 显示已完成的指令情况
      -t --timeout N 指定运行 N 秒后停止
      --backoff N 等待 N 微妙后开始运行
      -c 产生 n 个迚程 每个迚程都反复丌停的计算随机数的平方根,测试 cpu
      -i 产生 n 个迚程 每个迚程反复调用 sync(),sync()用于将内存上的内容写到硬盘上,测试磁盘
      -m --vm n 产生 n 个迚程,每个迚程丌断调用内存分配 malloc()和内存释放 free()函数,测试内存

      --vm-bytes B 指定 malloc 时内存的字节数 (默认 256MB)
      --vm-hang N 指定在 free 栈的秒数 
      -d --hadd n 产生 n 个执行 write 和 unlink 函数的迚程
      -hadd-bytes B 指定写的字节数
      --hadd-noclean 丌 unlink
      注:时间单位可以为秒 s,分 m,小时 h,天 d,年 y,文件大小单位可以为 K,M,G
    • 产生 2 个 cpu 进程,2 个 io 进程,20 秒后停止运行
      # stress -c 2 -i 2 --verbose --timeout 20s  #如果执行时间为分钟,改 20s 为 1m

    • 创建两个容器实例:docker10 和 docker20。
    • 让 docker10 和 docker20 只运行在 cpu0 和 cpu1 上,最终测试一下 docker10 和 docker20 使用 cpu 的百分比。
    • 实验拓扑图如下:

    • 运行两个容器实例
      # docker run -itd --name docker10 --cpuset-cpus 0,1 --cpu-shares 512 centos:7.6.1810 
      # docker run -itd --name docker20 --cpuset-cpus 0,1 --cpu-shares 1024 centos:7.6.1810
    • #指定 docker10 只能在 cpu0 和 cpu1 上运行,而且 docker10 的使用 cpu 的份额 512
      #参数-itd 就是又能打开一个伪终端,又可以在后台运行着 docker 实例
    • #指定 docker20只能在 cpu0和 cpu1上运行,而且 docker20的使用 cpu的份额 1024,比 dcker10多一倍
    • 进入 docker10,使用 stress 测试迚程是丌是只在 cpu0,1 上运行:
      # docker exec -it docker10 /bin/bash
      # yum install -y epel-release && yum -y install stress
      # stress -c 2 -v -t 1m

    • 可看到正常。只在 cpu0,1 上运行,并且运行百分比为100
    • 然后进入 docker20,使用 stress 测试迚程是丌是只在 cpu0,1 上运行,且 docker20 上
      运行的 stress 使用 cpu 百分比是 docker10 的 2 倍
    • # docker exec -it docker20 /bin/bash
      # yum install -y epel-release && yum -y install stress
      # stress -c 2 -v -t 1m

    • 注:两个容器只在 cpu0,1 上运行,说明 cpu 绑定限制成功。而 docker20 是 docker10 使用 cpu的 2 倍。说明--cpu-shares 限制资源成功。
    • 了解 CPU 周期控制
    • docker 提供了--cpu-period(周期)、--cpu-quota两个参数控制容器可以分配到的 CPU时钟周期。period [ˈpɪəriəd] 周期,时期 quota [ˈkwəʊtə] 配额
      --cpu-period 是用来指定容器对 CPU 的使用,要在多长时间内做一次重新分配。 指定周期
      --cpu-quota 是用来指定在这个周期内,最多可以有多少时间片断用来跑这个容器。 指定在这个周期中使用多少时间片
      跟--cpu-shares 不同的,--cpu-period 和--cpu-quota 是指定一个绝对值,而且没有弹性在里面,容器对 CPU 资源的使用绝对丌会超过配置的值。
      cpu-period 和 cpu-quota 的单位为微秒(μs)。cpu-period 的最小值为 1000 微秒,最大值为 1秒(10^6 μs),默认值为 0.1 秒(100000 μs)。cpu-quota 的值默认为-1,表示不做控制。
      时间换算单位: 1 秒=1000 毫秒 ; 1 毫秒=1000 微秒
    • docker 容器实例运行结束后自动释放资源

    •  docker run --help | grep rm
       --rm 参数: Automatically remove the container when it exits
    • 作用:当容器命令运行结束后,自劢删除容器,自劢释放资源 
    • 应用场景:在某些环境下,可能需要大量的新建 docker 实例,然后仅仅运行几秒钟戒几分钟,然后就彻底删除。 如运行单元测试戒测试弹性云计算。
      例:阿里云,要模拟双 11 的压力,需要快速创建 1 万 docker 实例,每个 docker 容器实例中都运行 ab 命令,拼命访问 tmall.com 首页,运行 1 个小时,1 小时后自动删除。
    • 运行一个容器在一定时间后自动删除释放资源

    docker run -it --rm --name gf-test centos:7.6.1810 sleep 20

    • docker ps -a | grep gf-test
    • 等 20s 后,再查看:
    • docker ps -a | grep gf-test  #自动删除了

    • docker 容器资源配额控制之内存
    • Docker 提供参数-m, --memory=""限制容器的内存使用量。
      例 1:允许容器使用的内存上限为 128M:
    • docker run -it --rm --name gf-test -m 128m centos:7.6.1810 /bin/bash

    •  注:也可以使用 tress 迚行测试,到现在,我可以限制 docker 实例使用 cpu 的核心数和权重,可以限制内存大小。
    • 创建一个 docker,只使用 2 个 cpu 核心,只能使用 128M 内存
    • docker run -it --cpuset-cpus 0,1 -m 128m centos:7.6.1810

    • docker 数据映射

    • docker 用来做计算,数据存储通过外挂实现。
      语法:docker run -itd -v /src:/dst centos:7.6.1810 bash
      -v 用来指定挂载目录, 冒号: 前面的/src 为物理机本地目录,:后面的/dst 为容器里的目录:
    • 把物理机上的/data/web/ 映射到 docker 实例的/var/www/html 。
      好处: 这样当 docker 坏了,数据还在物理机上,再使用 apache 镜像启劢一个 docker 实例就可以了。 数据不会丢失。
    • mkdir -p /data/web
    • echo "192.168.2.234" > /data/web/index.html
      cat /data/web/index.html
      192.168.2.234
    • docker run -it --name web1 -v /data/web:/var/www/html centos:7.6.1810 /bin/bash

    •  修改 index.html 内容再查看


    • docker 容器资源配额控制之 IO

    • docker run --help | grep write-b
       --device-write-bps value Limit write rate (bytes per second) to a device 
      (default []) #限制此设备上的写速度(bytes per second),单位可以是 kb、mb 戒者 gb。
      --device-read-bps value #限制此设备上的读速度(bytes per second),单位可以是 kb、mb
      戒者 gb。
    • 为什么阿云平台上 普通云盘的 IO 为: 1000 IOPS ,为什么这么小?
      原因是 一台存储 给 2000 台云主机使用,需要控制一下 。防止某台云主机吃光你的磁盘 I / O 资源
    • 情景:防止某个 Docker 容器吃光你的磁盘 I / O 资源
    • 限制容器实例对硬盘的最高写入速度设定为 10MB/s(固态貌似不能再小了)。
    • docker run --rm -it --device-write-bps /dev/sda:10mb centos:7.6.1810 /bin/bash
    • time dd if=/dev/zero of=test.out bs=1M count=20 oflag=direct,nonblock

    • 限制不能设置的过小,否则不生效


    • 解决 docker 无法使用 systemctl

    • System has not been booted with systemd as init system (PID 1). Can't operate.
    • 或者
    • Failed to get D-Bus connection: Operation not permitted

    • 对于新启用的容器:

    • docker run -tid --name centos_1 --privileged=true centos:7.6.1810 /usr/sbin/init

    • 对于已经启用的容器,需要修改该容器的配置文件:config.v2.json hostconfig.json

    • 首先修改 hostconfig.json,在修改之前必须先关闭该容器 docker stop [容器名或CONTAINER ID] 和 docker 服务 systemctl stop docker
    • 修改之前先备份 cp hostconfig.json{,.bak}
    • 确定容器和服务已经关闭
    • docker stop centos_2
    • systemctl stop docker
    • vim hostconfig.json

    • cp config.v2.json{,.bak}
    • vim config.v2.json


    • 配置 docker 静态 IP

    • Docker 有以下 4 种网络模式:
      host 模式,使用--net=host 指定。
      container 模式,使用--net=container:NAME_or_ID 指定。
      none 模式,使用--net=none 挃定。
      bridge 模式,使用--net=bridge 挃定,默认就是 bridge 模式。
      默认选择 bridge 的情况下,容器吭劢后会通过 DHCP 获取一个地址,这可能丌是我们想要的,在centos7 系统上, docker 环境下可以使用 pipework 脚本对容器分配固定 IP(这个 IP 可以是和物理机同网段 IP)。
      注: docker 默认是 bridge(--net=bridge)模式,相当于 VMware 中 NAT 模式。 
      docker 环境下可以使用 pipework 脚本对容器分配固定 IP,相当于 VMware 中桥接模式。
      注:Pipework 有个缺陷,容器重启后 IP 设置会自动消失,需要重新设置。
    • docker run -ti centos:latest /bin/bash

      等效于

      docker run -ti --net=bridge centos:latest /bin/bash
    • 使用docker自带的network实现固定ip分配,并且重启不会消失

    • 首先创建自定义网络:

      docker network create --subnet=172.168.1.0/24 docker-br0

      备注:这里选取了172.168.1.0网段,也可以指定其他任意空闲的网段,docker-br0为自定义网桥的名字,可自己任意取名。
      注意:这里子网掩码要使用255.255.255.0也就是IP后面的那个24

      创建网桥之后,使用ifconfig查看 会多出一个网桥,该网桥在docker启动或者重启之后,会自动显示出来。

      可以使用docker network rm docker-br0 移除网桥

    • 然后在自定义的网段选取IP地址作为要启动容器的固定IP,注意不要重复避免冲突

    • docker run -itd --restart=always -p 9099:80 --name centos_3 --net docker-br0 --ip 172.168.1.2 centos:7.6.1810 /bin/bash

      备注:创建容器时,在第一步创建的网段中选取了172.168.1.2作为静态IP地址。并且以docker-br0网桥启动

    • 重启容器验证

    • 安装 httpd 访问

     在启动时加入特权

    • docker run -itd --privileged=true --restart=always -p 9099:80 --name centos_4 --net docker-br0 --ip 172.168.1.10 centos:7.6.1810 /bin/bash

    展开全文
  • docker与k8s实战

    千人学习 2019-12-05 12:31:51
    本节为docker与k8s详解,详细讲解了docker与k8s的概念、理论、操作,并通过实例来说明其特性。
  • docker入门(利用docker部署web应用)

    万次阅读 多人点赞 2019-05-26 10:44:15
    前言:本课程是在慕课网上学习 第一个docker化的java应用 课程时所做的笔记,供本人复习之用 目录 第一章 什么是docker 1.1 docker的发展史 1.2 docker国内应用史 1.3 什么是Docker 第二章 了解docker 2.1 ...

    更新:随手写的一篇博客能收获这么多赞真是挺开心的,不过现在博主很忙,博主本人主要也是从事Java方向对docker暂时没有更深的理解了,写这个目的也是为了自己复习,恕不能对出现问题的同学进行答疑了,当然如果哪里写的有问题还是可以提一下。

    ---------------------------------------------------------------------------------------------------------------------------------------------------------

    前言:本课程是在慕课网上学习 第一个docker化的java应用 课程时所做的笔记,供本人复习之用

    目录

    第一章 什么是docker

    1.1 docker的发展史

    1.2 docker国内应用史

    1.3 什么是Docker

    第二章 了解docker

    2.1 docker思想

    2.1.1 集装箱

    2.1.2 标准化

    2.1.3 隔离

    2.2 docker解决的问题

    2.2.1 系统环境不一致

    2.2.2 系统好卡,哪个哥们又写死循环了

    2.2.3 双11来了,服务器撑不住了

    第三章 走进docker

    3.1 镜像

    3.2 容器

    3.3 仓库

    第四章 centos下docker安装

    第五章 docker初体验

    5.1 docker基本命令

    5.2 docker运行镜像流程

    第六章 docker运行nginx

    6.1 运行nginx镜像

    6.2 docker网络

    6.2.1 网络介绍

    6.2.2 实际访问端口

    第七章 docker部署第一个java web应用

    7.1 制作自己的镜像

    7.2 运行自己的镜像


    第一章 什么是docker

    1.1 docker的发展史

    2010年几个年轻人成立了一个做PAAS平台的公司dotCloud.起初公司发展的不错,不但拿到过一些融资,还获得了美国著名孵化器YCombinator的支持,后来微软谷歌亚马逊这样的大厂商也纷纷加入PAAS平台,竞争十分激烈,dotCloud举步维艰.

    2013年可能是公司发展的不是很好,工程师又不想自己的努力付之东流,于是他们决定将他们的核心技术开源.这项技术就是docker.当时docker的功能就是将linux容器中的应用代码打包,可以轻松的在服务器之间进行迁移.

    无心插柳柳成荫,docker技术风靡全球,于是dotCloud公司改名为docker Inc,并全面投入到docker的开发之中.

    2014.6 Docker发布了第一个版本 Docker1.0

    2014.7 获得C轮融资 $4000W

    2015.4 获得D轮融资 $9500W

    至今已经发布到docker 

    1.2 docker国内应用史

     

     

     

    由此看出,不管开发测试还是运维,绝大多数人都应该会接触到docker.所以学docker还是很有必要的.

     

    1.3 什么是Docker

    docker是一个用来装应用的容器,就像杯子可以装水,笔筒可以放笔,书包可以放书,可以把hello word放在docker中,可以把网站放入docker中,可以把任何想得到的程序放在docker中.

    官方解释:

     

    第二章 了解docker

    2.1 docker思想

    2.1.1 集装箱

    没有集装箱之前运输货物,东西零散容易丢失,有了集装箱之后货物不容易丢失,我们可以把货物想象成程序,目前我们要把程序部署到一台新的机器上,可能会启动不起来,比如少一些配置文件什么的或者少了什么数据,有了docker的集装箱可以保证我们的程序不管运行在哪不会缺东西.

    2.1.2 标准化

    1. 运输方式

    docker运输东西有一个超级码头,任何地方需要货物都由鲸鱼先送到超级码头,然后再由鲸鱼从超级码头把货物送到目的地去.对应的技术来说,比如我们要把台式机的应用部署到笔记本上,我们可能选择用QQ发过去或者用U盘拷过去,docker就标准化了这个过程,我们只需在台式机上执行一个docker命令,把鲸鱼派过来,把程序送到超级码头去,再在笔记本上执行一个docker命令,然后由鲸鱼把程序从超级码头送到笔记本上去.

    2. 存储方式

    当我们把程序存储到笔记本上时,我们需要一个目录,且我们要记住这个目录,因为下次我们可能还要修改,有了docker之后我们就不用记住了程序在哪里了,我们使用的时候只需要一条命令就行了.

    3. API接口

    docker提供了一系列rest api的接口,包含了对docker也就是对我们的应用的一个启动停止查看删除等等,如当我们要启动tomcat时我们要执行startup命令,当我们要停止时要执行shutdown命令,如果不是tomcat,我们可能还需要一些别的命令.有了docker我们记docker的命令就可以对其进行操作.

    2.1.3 隔离

    我们在使用虚拟机时有自己的cpu,硬盘,内存,完全感觉不到外面主机的存在,docker也差不多,不过它更轻量,我们创建虚拟机可能要几分钟,但是docker只需要一秒.最底层的技术时linux一种内核的限制机制,叫做LXC,LXC是一种轻量级的容器虚拟化技术.最大效率的隔离了进程和资源.通过cgroup,namespace等限制,隔离进程组所使用的物理资源,比如CPU,MEMORY等等,这个机制在7,8年前已经加入到linux内核了,直到2013年docker出世的时候才火起来,大家可能奇怪为什么这么好的技术埋没这么多年都没人发现呢?英雄造时势,时势造英雄,如果没有云计算,敏捷开发,高频度的弹性伸缩需求,没有IT行业这么多年长足的发展,也就没有docker.

    2.2 docker解决的问题

    2.2.1 系统环境不一致

    开发:我本地没问题.运维:服务器没问题. 这个问题就变成了皮球.

    如果一个应用要正常的启动起来需要什么?比如java web应用.

    需要一个操作系统,操作系统之上要jdk,tomcat,我们的代码,配置文件.

    操作系统的改变可能会导致我们的应用开不起来,比如我们调用了某些系统命令.

    jdk版本也可能导致程序的运行失败.比如class文件需要1.7编译,我们装了个1.6的jdk.

    tomcat版本也能导致失败,比如旧的版本一些配置在新版本中不再支持.

    代码的话就比如应用了C盘,D盘的一个文件,或者是用了系统的一些环境编码.

    配置的话我们可能少了某个配置文件等等.

    下面docker来了,它把操作系统,jdk,tomcat,代码,配置全部放到集装箱里.再打包放到鲸鱼上,由鲸鱼给我们送到服务器上,在我的机器上怎么运行,在别的机器上也怎么运行.不会有任何的问题.一句话就是docker解决了运行环境不一致所带来的问题.

    2.2.2 系统好卡,哪个哥们又写死循环了

    如果有根别人共用服务器的同学可能有这样的体会,莫名其妙发现自己的程序挂了,一查原因要不是内存不够了,要不是硬盘满了,还有就是发现某个服务变慢了,甚至敲终端都比较卡,但是linux本身就是一个多用户的操作系统本身就可以供多个用户使用,docker的隔离性可以解决这个问题,就算别人的程序还是死循环疯狂吃CPU,还是封装疯狂打日志把硬盘占满,还是内存泄漏,把内存占满,都不会导致我们的程序运行错误.因为docker在启动的时候就限定好了,它最大使用的CPU硬盘,如果超过了,就会杀掉对应进程.

    2.2.3 双11来了,服务器撑不住了

    大部分系统业务量并不是每天都比较平均的,特别是一些电商系统,每天总有那么几天业务量是平时的几倍甚至几十倍,如果按双11的规模去准备服务器那么对于平时的规模来说又是极大的浪费,所以就在节日前临时扩展机器,过完节再把多余的节点下线,这就给运维带来了非常大的工作量,一到过节就在各个机器上部署各种各样的服务,我们启动程序需要java,tocmat等等,并且还可能起不来还要调试,这是非常恶心的工作,有了docker一切都变得美好了,只要点一下服务器就可以从10台变成100台甚至1000,1W台.都是分分钟的事情.

    为什么会这么快呢?都是用标准的方式把我们的程序运过来,下载过来,再用标准的方式把它运行起来,就可以做到只要在每台机器上都执行一两条命令,就可以让程序正常跑起来,并且不用担心有问题.


    第三章 走进docker

    镜像就是上面说的集装箱,仓库就是超级码头,容器就是我们运行程序的地方.docker运行程序的过程就是去仓库把镜像拉到本地,然后用一条命令把镜像运行起来变成容器.

    build:构建,就是构建镜像.

    ship:运输,运输镜像,从仓库和主机运输.

    run:运行的镜像就是一个容器.

    build,ship,run和镜像,仓库,容器是一一对应的.

    3.1 镜像

    镜像的英文名交image.前面我们讲到了集装箱,鲸鱼拖着的所有集装箱就是一个镜像.

    从本质上来说镜像就是一系列文件,可以包括我们应用程序的文件,也可以包括我们应用的运行环境的文件,既然是文件,那么是以什么样的格式在本地保存的呢?

    说到存储格式,就要提到linux的一个存储技术,叫做联合文件系统,是一种分层的文件系统,可以将不同的目录挂到同一个虚拟文件系统下.

    比如test1下有三个文件夹,test2下有两个文件夹,还有一个readme文件.联合文件系统就是可以在一个文件夹(test)中看到多个文件夹(test1,test2)中的内容.

    通过这种方式可以实现文件的分层,test1可以把它看作第一层,test2可以把它看作第二层,每一层有每一层自己的文件,docker就是利用了这种分层的概念实现了镜像存储.

    下图就是镜像的存储格式,这张图是分层的,最下面一层,上面也是一层层的好像集装箱罗列在一起.这就是镜像最直观的存储方式.下面是操作系统的引导,上面是linux操作系统,再上面是一些相关的软件,如果是我们自己的程序,就可以是tomcat,jdk,再往上是应用代码,每一层是我们自己都可以控制得,最上面一层先忽略不看,因为这是和容器有关的.注意一点,docker镜像系统的每一层都是只读的,然后把每一层加载完成之后这些文件都会被看成是同一个目录,相当于只有一个文件系统.docker的这种文件系统被称之为镜像.

    图1

     

    3.2 容器

    为了便于理解,大家可以把容器想象成虚拟机,每个虚拟机都有自己的文件系统,可以把图1整个一部分看成是文件系统,与虚拟机系统的区别是这里面的文件系统是一层一层的,并且最下面的n层都是只读的,只有上面一层是可写的.为什么要有可写的这层呢?大家的程序运行起来,势必会要写一些日志,写一些文件,或者对系统的某一些文件做一些修改,所以容器在最上面一层创建了可读可写的文件系统.

    在程序的运行过程中,如果要写镜像文件时,因为镜像的每一层都是只读的,它会把文件的每一层拷到文件的最上层,然后再对它进行修改,修改之后,当我们的应用读一个文件时会从顶层进行查找,如果没有才会找下一层.

    由于容器的最上一层是可以修改的,镜像是不能修改的,这样就能保证镜像可以生成多个容器独立运行,没有任何干扰.

    3.3 仓库

    我们的镜像是要在其它机器上运行,如何进行传输呢?

    这就用到了docker仓库,我们要先把我们的镜像传到docker仓库中,再由目的地把docker仓库拉过去,这就完成了这样的一次传输过程.

    谁提供了这样的仓库呢?docker自己提供了,hub.docker.com,但是非常慢,为了解决这个问题,国内很多公司也在做自己的仓库.比较知名的是由网易蜂巢提供的 https://c.163yun.com/hub#/m/home/

     

    第四章 centos下docker安装

    因为我这里使用的是centos所以就在centos下安装.

    参考博客与网站:

    https://www.jb51.net/article/161580.htm

    https://blog.csdn.net/jsnhux/article/details/89847109

    https://docs.docker.com/install/linux/docker-ce/centos/

     

     

    1. Docker 要求 CentOS 系统的内核版本高于 3.10,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。

    通过 uname -r 命令查看你当前的内核版本

    2.  如果安装过请先卸载

    yum remove docker \
               docker-client \
               docker-client-latest \
               docker-common \
               docker-latest \
               docker-latest-logrotate \
               docker-logrotate \
               docker-engine

    3.安装依赖设置yum仓库

    安装依赖:

    yum install -y yum-utils \
      device-mapper-persistent-data \
      lvm2

    设置仓库:

    yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
    

    4. 安装docker

    yum install docker-ce docker-ce-cli containerd.io

    5. 启动并加入开机启动

    systemctl start docker
    systemctl enable docker

    6.验证是否安装成功

    docker version
    docker run hello-world

    显示如下即安装成功! 

    [root@iZ2ze68ge5c1uwlkmnb9ixZ zcapp]# docker run hello-world
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    1b930d010525: Pull complete 
    Digest: sha256:0e11c388b664df8a27a901dce21eb89f11d8292f7fca1b3e3c4321bf7897bffe
    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.
        (amd64)
     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/
    


    第五章 docker初体验

    5.1 docker基本命令

    1.docker pull [options] NAME[:TAG]

    通过此命令可以docker远程仓库拉取镜像到本地.

    name是拉取镜像的名称,:TAG表示是可选的,如果不选表明时latest,如果选择表明是指定版本的.

    options是拉去的一些参数.

    当不加请求地址的时候回去docker的官网拉取镜像.

    2.docker images [options] [REPOSITORY[:TAG]]

    options是选项,后面是指定镜像的名称.这个用的不多,可能当本地镜像非常多的时候要指定查看某一个镜像.

    IMAGE ID 其实是一个64位的字符串,它可以唯一标识我们的镜像,这里只显示了16位,后面的被截掉了.

    3. docker run [options] IMAGE[:TAG] [COMMAND] [ARG..]

    IMAGE是镜像的名字

    COMMAND是运行起来的时候要执行什么命令.

    ARG表示这条命令运行需要的参数.

    5.2 docker运行镜像流程

    docker pull:首先docker pull向docker daemon发送了一条命令pull,告诉docker daemon要拉取某一个镜像,docker daemon会在本机检查镜像是否存在,如果存在且版本就是我们想要拉取的版本,它就不会做任何的操作.如果不存在下一步它会到docker的仓库中找我们要拉取的镜像名字,如果找到了就会有docker仓库传送到我们的本地,把我们要的镜像传送到我们的本地来.

    docker run:首先把命令发送到我们的docker daemon,docker daemon会先检查镜像在本机是否存在,如果不存在相当于执行了一个docker pull的过程,下载回来之后会以一定方式把镜像运行起来变成docker容器.


    第六章 docker运行nginx

    6.1 运行nginx镜像

    我们打开网易蜂巢镜像中心 https://c.163yun.com/hub#/m/home/

    搜索nginx,可以看到有两个nginx,他们的名字和头上和图标都不一样,一个是鲸鱼,一个是两个球.

    带有鲸鱼的镜像表示这个镜像是从官网的镜像中心复制过来的.这个镜像与docker的镜像是一摸一样的.我们使用此镜像.

    点进去,会有下载地址,复制里面的地址,然后拉取镜像.

    复制到系统中运行.

    运行完后可以查看镜像状态

    在前台运行容器命令如下,输入后容器就会运行,按ctrl+c可以终止容器的运行.

    docker run hub.c.163.com/library/nginx

    在后台运行容器:

    docker run -d hub.c.163.com/library/nginx

    查看运行的容器:

    docker ps

    更多关于运行的命令:

    docker run --help

    因为我们在平时运行的时候需要调试容器内部的设置、查看一下日志等等.我们可以通过如下命令进入容器内部:

    命令的大体内容:

    命令具体内容: 

    docker exec -it 02963d2002b bash

     -i保证我们的输入有效,即使在没有detach的情况下也能运行.

    -t表示将分配给我们一个伪终端.我们将在伪终端输入我们的内容.

    后面跟着的是容器的id,即我们上面用ps查询出来的id,这个id可以少写几位,它会自动识别.

    可输入如下命令了解更多:

    docker exec --help

    输入命令后发现我们前面的标识也变了,相当于进入了一个新的电脑.

    可以查询一下nginx在什么位置

    which nginx

    打开ps查看一下当前运行的进程.我这里提示没有ps命令.我从网上查了一下发现是因为当前系统没有安装这个命令,然后我安装了一下.从命令可以看出,这个nginx容器附带的系统应该是ubuntu不是centos.

    安装ps命令:

    apt-get update
    
    apt-get install procps
    

    利用ps命令查看进程,可以发现nginx已经在运行了.

    ps -ef

    输入 exit即可退出返回原来的系统. 

    6.2 docker网络

    6.2.1 网络介绍

    上面我们只运行了nginx,并没有用浏览器进行访问,这里我们尝试用浏览器访问,但是之前我们要了解一下docker网络.

    我们直到docker的隔离性,网络也是个隔离性的一部分,linux使用了命名空间来进行资源的隔离,比如pid namespace就是用来隔离进程的,mount namespace是用来隔离文件系统的,network namespace 是用来隔离网络的.每一个network namespace都提供了一个独立的网络环境,包括网卡路由iptable规则等等,都是与以其它的network space隔离的.

    1. docker容器在默认情况下,一般会分配一个独立的network-namespace,也就是网络类型中的Bridge模式.

    在使用Bridge时就涉及到了一个问题,既然它有独立的namesapce,这就需要一种技术使容器内的端口可以在主机上访问到,这种技术就是端口映射,docker可以指定你想把容器内的某一个端口可以在容器所在主机上的某一个端口它俩之间做一个映射,当你在访问主机上的端口时,其实就是访问容器里面的端口.

    2. 还有一种类型是Host模式,如果在启动容器的时候指定使用Host模式,那么这个容器将不会获得一个独立的network namespace,而是和主机共同使用一个,这个时候容器将不会虚拟出自己的网卡,配置出自己的ip.而是使用宿主机上的ip和端口.也就是说在docker上使用网络和在主机上使用网络是一样的.

    3. 还有一种网络类型是None.也就是没有网络,这种情况docker将不会和外界的任何东西进行通讯.

    6.2.2 实际访问端口

    刚才我们在运行nginx镜像的时候并没有指定端口映射,所以我们这里停掉nginx容器.

    docker stop containerId

    1. -p(小写)是开放一个容器的端口到主机上

    在后台运行,开放主机8080端口映射到容器的80端口上.

    docker run -d -p 8080:80 hub.c.163.com/library/nginx

    查看主机8080端口是否开启

    netstat -na |grep 8080

     

    是开启的那么访问 主机ip:8080 即可访问到nginx.

     

    2. -P(大写)是开放容器所有的端口到主机上一个随机的端口.

    停掉刚才的docker服务.

    使用大P

    docker run -d -P hub.c.163.com/library/nginx

    可以看到随机给我的端口是32768 

    然后用 ip:32768去访问即可访问到nginx. 


    第七章 docker部署第一个java web应用

    我们还需要学习Dockerfile,它告诉docker我们怎样制作我们的镜像,我们镜像的每一步操作分别是什么,写好Dockerfile后我们使用docker build命令执行Dockerfile里面的每一件事情.最终会把Dockerfile构建出来.

    在这里因为是做一个演示,所以我们使用了一个开源的java web应用Jpress.

    7.1 制作自己的镜像

    1. 从网易的镜像中心找一个tomcat的镜像

    docker pull hub.c.163.com/library/tomcat:latest

    因为tomat镜像肯定有jdk,所以我们就不用单独再装jdk了.

     

    2.编写dockerfile

    我们需要建立一个dockerfile告诉docker需要做什么,这里我建立了Dockerfile,并将我们的web文件放到了和它同一个目录下.

    首先我们的镜像是要运行在tomcat中的,所以填写 from tomcat,以tomcat为基础.maintainer是所有者的意思.因为war包是要放在webapps中的,所以我们使用copy命令复制到tomcat的webapps.

    为什么webapps在local中?我们可以去下载镜像的网站查询,向下拉就好了.具体网址 : https://c.163yun.com/hub#/m/repository/?repoId=2955

    这里说一个个人猜想,每个容器都包含一个自己的系统,所以这里的/usr/local/tomcat/webapps指的是tomcat容器中的位置,那么哪里指定是tomcat容器呢?就是在一开始的from指定的.

    from hub.c.163.com/library/tomcat
    
    maintainer zhangchen 61037@qq.com
    
    COPY jpress.war /usr/local/tomcat/webapps

    3.构建容器

    注意这里是有个点的,点标明是在根据当前目录构建

    docker build .

    可以使用docker images查看镜像是否build成功

    发现一个none,表明构建成功了.

    可以重新构建给它起个名字 -t是给镜像指定一个tag

    docker build -t jpress:latest .
    

    更多的参数查询:

    docker build --help

     

    7.2 运行自己的镜像

    运行我们制作的镜像并指定端口

    docker run -d -p  8080:8080 jpress

    访问我们的网站,发现网站已经可以正常访问了.

    然后发现它要求我们安装自己的数据库,所以我们利用docker安装mysql.

    在镜像中心搜索并拉取mysql

     docker pull hub.c.163.com/library/mysql:latest

    在镜像中心查看配置,并配置root用户密码

    docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 hub.c.163.com/library/mysql

     发现我们没有创建数据库,于是停止这个容器的运行,并在与剧中创建jpress数据库.

    docker stop 4be94fb2df1d3a28c1
    ocker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=jpress hub.c.163.com/library/mysql

    这样我们的数据库就建立成功了.

    进入网站后要输入网站信息,输入数据库地址时,注意不要输入localhost,因为我们jpress是运行在容器内的,我们会访问tomcat容器内的3306,我们应该用ifconfig查询我们本机的ip地址.我这里的内网ip是172.17.10.68

     

    以上都做完后,我们的网站就可以跑起来了.

    http://59.110.164.62:8080/jpress/

     

     

     

     

     

     

     

     

     

    展开全文
  • docker运行套路实战:PHP篇

    千人学习 2018-06-14 20:58:48
    1、本课程适合有简单docker基础的同学。 2、当学会了基本docker命令后不会应用,那么本课程就是来教大家套路的。本系列分为多篇,本篇是PHP角度,其他角度正在录制中 3、本篇不涉及集群 强烈注意:本课程不是PHP语法...
  • 菜鸟入门Docker

    万次阅读 多人点赞 2020-05-07 12:38:44
    菜鸟入门Docker说明一、什么是Docker(1)虚拟机和Linux容器二、Docker用途三、Docker安装(1)设置仓库(2)安装 Docker Engine-Community(3)验证安装成功四、Docker启动与停止(1)启动docker(2)停止docker(3...


    更新时间:2021/2/13 01:15

    说明

    最近在学习docker时,发现网上很多教程都是很老的教程,导致本人在学习时遇到各种各样的坑,为了方便以后查看,现将学习相关笔记记录在这里。
    本文仅为记录学习轨迹,如有侵权,联系删除

    一、什么是Docker

    在学习docker时,在网上看到一篇博文讲得很好,自己总结一下就是,Docker 将应用程序与该程序的依赖,打包在一个文件里面,改文件包括了所有打包得应用程序的所有依赖,像数据库等;直接运行改文件,就可以让程序跑起来,从而不用再去考虑环境问题。

    (1)虚拟机和Linux容器

    • 说到Docker就必须了解虚拟机和Linux容器,虚拟机可以实现在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统等,而且不会对实际的电脑产生影响,不想用时将虚拟机相关文件删掉即可,用户可以通过虚拟机还原软件的原始环境,实际上就是解决了配置环境的问题。尽管它有资源占用多,启动慢等缺点。

    • Linux容器是为了解决虚拟机的确缺点而生的,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。由于容器是进程级别的,相比虚拟机有很多优势。像启动快、资源占用少等

    • 而Docker 就是属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。就像一开始说的,Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题

    二、Docker用途

    这里引用网上某博主的部分内容,Docker 的主要用途,目前有三大类。

    (1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。

    (2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。

    (3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。

    三、Docker安装

    说明:由于Docker需要Linux内核的支持,所以本人在自己的电脑(window10)安装了VMware虚拟机,在虚拟机里面安装了一个ubuntu系统,在这基础上进行Docker的安装,安装参考了菜鸟教程,链接:https://www.runoob.com/docker/ubuntu-docker-install.html

    (1)设置仓库

    卸载旧版本

    $ sudo apt-get remove docker docker-engine docker.io containerd runc
    

    更新 apt 包索引

    $ sudo apt-get update
    

    安装 apt 依赖包,用于通过HTTPS来获取仓库

    $ sudo apt-get install \
        apt-transport-https \
        ca-certificates \
        curl \
        gnupg-agent \
        software-properties-common
    

    添加 Docker 的官方 GPG 密钥

    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    

    9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 通过搜索指纹的后8个字符,验证您现在是否拥有带有指纹的密钥。

    $ sudo apt-key fingerprint 0EBFCD88
    

    使用以下指令设置稳定版仓库

    $ sudo add-apt-repository \
       "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) \
      stable"
    

    (2)安装 Docker Engine-Community

    更新 apt 包索引

    $ sudo apt-get update
    

    安装最新版本的 Docker Engine-Community 和 containerd

    $ sudo apt-get install docker-ce docker-ce-cli containerd.io
    

    (3)验证安装成功

    输入命令:docker,出现以下命令即安装成功
    在这里插入图片描述

    四、Docker启动与停止

    (1)启动docker

    sudo service docker start
    

    (2)停止docker

    sudo service docker stop
    

    (3)重启docker

    sudo service docker restart
    

    五、Docker配置

    (1)将用户加入 Docker 用户组

    Docker 需要用户具有 sudo 权限,为了避免每次命令都输入sudo,建议将用户加入Docker用户组

    • 添加docker用户组
      sudo groupadd docker
    • 将当前用户加入到docker用户组
      sudo gpasswd -a ${USER} docker
    • 重启docker服务
      sudo service docker restart
    • 退出当前用户重登一下

    (2)配置daemon.json

    本人一开始安装完Docker后,启动docker服务,直接拉取 image文件(注意:不是图片,后面有讲到image文件)后直接报错,显示超时,因为默认网址是国外的,需要配置国内镜像

    • 进入root权限
      su root
      在这里插入图片描述
    • 进入docker文件
      查看改文件下只有一个key.json,新建一个daemon.json文件
      查看文件夹命令:ls
      新建文件夹命令:vim daemon.json
      在这里插入图片描述
    • 编辑docker.json文件
      输入以下内容:
      { "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"] }
      在这里插入图片描述
      保存退出,重启docker服务

    六、image 文件

    Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
    简单理解就是,将程序打包在image文件(也叫image仓库)里面,运行image文件,生成一个容器生例,容器里面跑程序(已将mysql之类的依赖都打包在里面了,不用去配置数据库等环境)
    也就是说,别人的程序打包在image里面,自己直接拿过来后不用配置环境就可以直接跑(很神奇)

    # 列出本机的所有 image 文件。
    $ docker image ls
    
    # 删除 image 文件
    $ docker image rm [imageName]
    

    在这里插入图片描述
    hello-world是自己手动下载的image仓库

    七、安装Hello-world实例

    命令行直接输入

    命令:docker image pull library/hello-world
    
    命令解析:
    	docker image pull:抓取 image 文件
    	library:image 文件所在的组
    	hello-world:image 文件的名字
    	注意:后期需要的image文件都可以通过这样的方式拉取,像mysql数据库,ubuntu系统等
    

    其中Docker 官方提供的 image 文件,都默认放在library组里面,因此,上面的命令可以写成下面这样。

    docker image pull hello-world
    

    运行该实例

    命令:docker container run hello-world
    
    命令解析:
    	docker container run:自动抓取 image 文件
    	注意:如果发现本地没有指定的 image 文件,就会从仓库自动抓取
    

    运行结果
    在这里插入图片描述
    注意:输出这段提示以后,hello world就会停止运行,容器自动终止。对于那些不会自动终止的容器,必须使用docker container kill 命令手动终止。

    $ docker container kill [containID]
    

    八、容器文件

    image 文件生成的容器实例,本身也是一个文件,称为容器文件。也就是说,一旦容器生成,就会同时存在两个文件: image 文件和容器文件。而且关闭容器并不会删除容器文件,只是容器停止运行而已。

    # 列出本机正在运行的容器
    $ docker container ls
    
    # 列出本机所有容器,包括终止运行的容器
    $ docker container ls --all
    

    上面命令的输出结果之中,包括容器的 ID。很多地方都需要提供这个 ID,比如上一节终止容器运行的docker container kill命令。

    终止运行的容器文件,依然会占据硬盘空间,可以使用docker container rm命令删除。

    $ docker container rm [containerID]
    

    运行上面的命令之后,再使用docker container ls --all命令,就会发现被删除的容器文件已经消失了。

    九、配置阿里镜像

    这个是额外补充的,当前面配置了各种加速镜像都没有的情况下,用这个方式
    https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

    命令:vi /etc/docker/daemon.json
    注意:daemon.json该文件可能不存在,这个时候正常创建即可

    加入如下内容:

    {
      "registry-mirrors": ["https://xxx.mirror.aliyuncs.com"]
    }
    

    例如
    在这里插入图片描述
    配置完重启服务即可
    命令1:sudo systemctl daemon-reload
    命令2:sudo systemctl restart docker

    十一、docker的另一种安装方式

    1. 下载docker-ce的repo
    curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
    2. 安装依赖
    yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm
    3. 安装docker-ce
    dnf -y  install docker-ce  docker-ce-cli --nobest
    4.启动 docker
    systemctl start docker
    5.查看 docker 版本信息
    docker -v
    6.设置开机自动启动
    systemctl enable --now docker
    
    

    本人用centos 8亲测可以,就是有一个安装102M的过程有点久,只有不到100k/s的速率,不过也是可以安装成功的

    至此,Docker基本入门结束,该博文参考了网上大多Docker教程

    展开全文
  • 第一本Docker

    千次下载 热门讨论 2014-12-22 17:11:25
    本期赠送书籍为《第一本Docker书》,本书由Docker公司前服务与支持副总裁James Turnbull编写,是权威的Docker开发指南,被誉为“对开发者影响很大的一本书”,在容器开发、系统管理、运维领域很有说服力。
  • Docker的那些事

    千人学习 2019-06-06 21:33:34
    Docker的系统架构讲解 Docker的界面管理工具portainer使用 docker底层使用哪些技术 Dockerfile中命令讲解 Docker镜像、容器管理 Docker常用命令讲解 Docker在项目中的运用 Docker-compose文件在项目中运用
  • Docker——入门实战

    万次阅读 多人点赞 2018-07-14 15:35:24
    Docker 简介 Docker是一种新兴的虚拟化技术,能够一定程度上的代替传统虚拟机。不过,Docker 跟传统的虚拟化方式相比具有众多的优势。我也将Docker类比于Python虚拟环境,可以有效的配置各个版本的开发环境,...

    I. Docker

    简介

    Docker是一种新兴的虚拟化技术,能够一定程度上的代替传统虚拟机。不过,Docker 跟传统的虚拟化方式相比具有众多的优势。我也将Docker类比于Python虚拟环境,可以有效的配置各个版本的开发环境,比如深度学习与Java环境。

    其他的Docker简介也不需要过多介绍,可以参考很流行的《Docker — 从入门到实践》。关于博客,文末列出了最近在掘金上看到的一些入门类型文章。

    优势

    本人主要想用来配置开发环境,由于实验室机器系统环境版本等冲突的问题。

    先用一张Docker — 从入门到实践里的图整体感受一下其独特的优势:

    对比传统虚拟机

    由于本人才疏学浅,这里便再节选一些原文中话具体描述Docker强大所在。个人感觉在入门完Docker再回头重新认识一下下面所述的五个优势相关解释,会对Docker的认识有更深的理解。

    • 更高效的利用系统资源:由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
    • 更快速的启动时间:传统的虚拟机技术启动应用服务往往需要数分钟,而Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
    • 一致的运行环境:开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一
      致,导致有些bug 并未在开发过程中被发现。而Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现「这段代码在我机器上没问题啊」这类问题。
    • 持续交付和部署:Docker是build once,run everywhere. 使用Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过Dockerfile 来进行镜像构建,并结合持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
    • 更轻松的迁移:Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。使用Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

    II. Docker中基本概念

    镜像(Image)

    镜像,从认识上简单的来说,就是面向对象中的类,相当于一个模板。从本质上来说,镜像相当于一个文件系统。Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

    容器(Container)

    容器,从认识上来说,就是类创建的实例,就是依据镜像这个模板创建出来的实体。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。

    仓库(Repository)

    仓库,从认识上来说,就好像软件包上传下载站,有各种软件的不同版本被上传供用户下载。镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。

    Docker版本

    Docker 划分为CE 和EE。CE 即社区版(免费,支持周期三个月),EE 即企业版,强调安全,付费使用。Docker在1.13 版本之后,从2017年的3月1日开始,版本命名规则变为如下:

    项目说明
    版本格式YY.MM
    Stable版本每个季度发行
    Edge版本每个月发型

    Docker CE 每月发布一个Edge 版本(17.03, 17.04, 17.05…),每三个月发布一个Stable 版本(17.03, 17.06, 17.09…),Docker EE 和Stable 版本号保持一致,但每个版本提供一年维护。

    分层存储

    因为镜像包含操作系统完整的root 文件系统,其体积往往是庞大的,因此在Docker设计时,就充分利用Union FS 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成

    镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。

    分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。

    III. 安装Docker

    Win10

    下载:https://docs.docker.com/docker-for-windows/install/

    Docker支持64 位版本的Windows 10 Pro,且必须开启Hyper-V。开启方式为:打开“控制面板”->“程序”-> “启动或关闭Windows功能”,找到Hyper-V并勾选,确定重启电脑。

    开启Hyper-V

    安装下载好的Docker for Windows Installer.exe,如下:

    安装完毕

    鉴于国内网络问题,后续拉取Docker镜像十分缓慢,需要配置国内镜像加速,在系统右下角托盘Docker 图标内右键菜单选择Settings,打开配置窗口后左侧导航菜单选择Daemon,在Registry mirrors 一栏中填写加速器地址
    https://registry.docker-cn.com ,之后点击Apply保存后Docker就会重启并应用配置的镜像地址了。

    配置镜像加速

    Ubuntu16.04+

    在Ubuntu系统中安装较为简单,官方提供了脚本供我们进行安装。

    sudo apt install curl
    curl -fsSL get.docker.com -o get-docker.sh
    sudo sh get-docker.sh --mirror Aliyun

    执行这个命令后,脚本就会自动的将一切准备工作做好,并且把Docker CE 的Edge版本安装在系统中。

    启动Docker CE

    sudo systemctl enable docker
    sudo systemctl start docker

    建立docker 用户组

    默认情况下,docker 命令会使用Unix socket 与Docker 引擎通讯。而只有root 用户和docker 组的用户才可以访问Docker 引擎的Unix socket。出于安全考虑,一般Ubuntu系统上不会直接使用root 用户。因此,更好地做法是将需要使用docker 的用户加入docker用户组。

    # 建立docker组
    sudo groupadd docker
    # 将当前用户加入docker组
    sudo usermod -aG docker $USER

    注销当前用户,重新登录Ubuntu,输入docker info,此时可以直接出现信息。

    docker info

    配置国内镜像加速

    在/etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

    {
        "registry-mirrors": [
            "https://registry.docker-cn.com"
        ]
    }

    重新启动服务

    sudo systemctl daemon-reload
    sudo systemctl restart docker

    IV. Docker的C/S模式

    Docker 采用了C/S 架构,包括客户端和服务端。Docker 守护进程(Daemon)作为服务端
    接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)。

    Docker基本架构

    Docker 守护进程一般在宿主主机后台运行,等待接收来自客户端的消息;Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟Docker 守护进程交互。我们之前在Win10的命令行中便是最主要的客户端:

    Docker也为我们提供了Remote API来操作Docker的守护进程,也意味着我们可以通过自己的程序来控制Docker的运行。客户端和服务端既可以运行在一个机器上,也可通过socket 或者RESTful API 来进行通信:

    至于Docker的客户端与守护进程之间的通信,其连接方式为socket连接。主要有三种socket连接方式:

    • unix:///var/run/docker.sock
    • tcp://host:port
    • fd://socketfd

    完整的Docker的C/S连接方式的本质可以一般表示为如下:

    V. 使用Docker

    容器的基操

    • 启动一次操作容器docker run IMAGE_NAME [COMMAND] [ARG…]

      例如,启动一个容器输出hello world。由于刚装上Docker,没有任何镜像,所以会先下载一个最新的ubuntu18.04的docker镜像。一次操作容器在处理完操作后会立即关闭容器。

      docker run ubuntu echo 'hello world'

      启动一次操作容器

    • 启动交互式容器docker run -t -i –name=自定义名称 IMAGE_NAME /bin/bash

      -i –interactive=true | false,默认是false

      -t –tty=true | false,默认是false

      –name 给启动的容器自定义名称,方便后续的容器选择操作

      启动交互式的容器,就是类似虚拟机、云主机的操作方式,操作完一个命令后仍然可以继续

      docker run -i -t ubuntu /bin/bash

      启动交互式容器

    • 查看容器docker ps [-a] [-l]

      省略 列出正在运行的容器

      -a all 列出所有容器

      -l latest 列出最近的容器

      查看所有容器

    • 查看指定容器docker inspect name | id

      name指代具体的容器名称,id则是容器的唯一id标识。inspect命令可以详细的展示出容器的具体信息。

      docker inspect haha

      查看指定容器

    • 重新启动停止的容器docker start [-i] 容器名

      实际使用时,没必要每次都重新启动一个新的容器,我们可以重新启动之前创建的容器,现实情况也需要我们这样使用。

      docker start -i haha

      重启停止的容器

    • 删除停止的容器docker rm name | id

      docker rm thirsty_kepler
      docker rm upbeat_albattani

      删除停止的容器

    守护式容器

    交互式容器在运行完命令退出后即停止,而实际中我们常常需要能够长时间运行,即使退出也能后台运行的容器,而守护式容器具备这一功能。守护式容器具有:

    1. 能够长期运行;
    2. 没有交互式会话;
    3. 适合于运行应用程序和服务。

    以守护形式运行容器

    我们执行完需要的操作退出容器时,不要使用exit退出,可以利用Ctrl+P Ctrl+Q代替,以守护式形式推出容器。

    守护形式运行容器

    附加到运行中的容器

    退出正在运行的容器,想要再次进入,需要使用attach命令:docker attach name | id

    docker attach haha

    启动守护式容器

    启动守护式容器,可以在后台为我们执行操作:docker run -d IMAGE_NAME [COMMAND] [ARG…]

    当命令在后台执行完毕,容器还是会关闭。这里防止容器立刻退出,写一个脚本循环输出“hello world”。

    docker run --name hiahia -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

    启动守护式容器

    查看容器日志

    当守护式容器在后台运行时,我们可以利用docker的日志命令查看其输出:docker logs [-f] [-t] [–tail] IMAGE_NAME

    -f –follows=true | false,默认是false,显示更新

    -t –timestamps=true | false,默认是false,显示时间戳

    –tail=“all” | 行数,显示最新行数的日志

    查看容器日志

    查看容器内进程

    对运行的容器查看其进程:docker top IMAGE_NAME

    查看容器内进程

    运行中容器启动新进程

    Docker的理念是一个容器运行一个服务,但是往往需要对一个服务进行监控,所以也需要在已经运行服务的容器启动新的进程:docker exec [-d] [-i] [-t] IMAGE_NAME [COMMAND] [ARG…]

    docker exec -i -t hiahia /bin/bash

    启动新进程

    停止守护式容器

    发送信号停止容器:docker stop 容器名

    强制停止:docker kill 容器名

    VI. 案例:在容器中部署静态网站

    容器的端口映射

    命令run [-P] [-p]

    -P,–publish-all=true | false,大写的P表示为容器暴露的所有端口进行映射;

    -p,–publish=[],小写的p表示为容器指定的端口进行映射,有四种形式:

    • containerPort:只指定容器的端口,宿主机端口随机映射;
    • hostPort:containerPort:同时指定容器与宿主机端口一一映射;
    • ip::containerPort:指定ip和容器的端口;
    • ip:hostPort:containerPort:指定ip、宿主机端口以及容器端口。

    例如:

    docker run -p 80 -i -t ubuntu /bin/bash
    docker run -p 8080:80 -i -t ubuntu /bin/bash
    docker run -p 0.0.0.0::80 -i -t ubuntu /bin/bash
    docker run -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash

    容器中部署Nginx服务

    准备环境:

    # 1. 创建映射80端口的交互式容器
    docker run -p 80 --name web -i -t ubuntu /bin/bash
    # 2. 更新源
    apt-get update
    # 3. 安装Nginx
    apt-get install -y nginx
    # 4. 安装Vim
    apt-get install -y vim

    创建静态页面:

    mkdir -p /var/www/html
    cd /var/www/html
    vim index.html

    index.html

    修改Nginx配置文件:

    # 查看Nginx安装位置
    whereis nginx
    # 修改配置文件
    vim /etc/nginx/sites-enabled/default

    修改Nginx配置文件

    运行Nginx:

    # 启动nginx
    nginx
    # 查看进程
    ps -ef

    运行Nginx

    验证网站访问:

    # 退出容器
    Ctrl+P Ctrl+Q
    # 查看容器进程
    docker top web
    # 查看容器端口映射情况
    docker port web

    查看进程和端口

    通过宿主机地址加映射端口访问:

    访问网站

    VII. 镜像基操

    查看删除镜像

    • 列出镜像docker images [OPTIONS] [REPOSITORY]

      -a,–all=false,显示所有镜像

      -f,–filter=[],显示时过滤条件

      –no-trunc=false,指定不使用截断的形式显示数据

      -q,–quiet=false,只显示镜像的唯一id

      查看镜像

    • 查看镜像docker inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE]

      -f,–format=“”

      查看镜像

    • 删除镜像docker rmi [OPTIONS] IMAGE [IMAGE]

      -f,–force=false,强制删除镜像

      –no-prune=false,保留未打标签的父镜像

    • 虚悬镜像:既没有仓库名,也没有标签,均为\

    获取推送镜像

    • 查找镜像docker search [OPTIONS] TEAM

      –automated=false,仅显示自动化构建的镜像

      –no-trunc=false,不以截断的方式输出

      –filter,添加过滤条件

      查找ubuntu镜像

    • 拉取镜像docker pull [OPTIONS] NAME [:TAG]

      -a,–all-tags=false,下载所有的镜像(包含所有TAG)

      拉取镜像

    • 推送镜像:docker push NAME [:TAG]

      Docker允许上传我们自己构建的镜像,需要注册DockerHub的账户。也可以上传到阿里云,地址:https://cr.console.aliyun.com/#/namespace/index

    构建镜像

    构建Docker镜像,可以保存对容器的修改,并且再次使用。构建镜像提供了自定义镜像的能力,以软件的形式打包并分发服务及其运行环境。Docker中提供了两种方式来构建镜像:

    • 通过容器构建:docker commit
    • 通过Dockerfile:docker build

    使用commit命令构建镜像

    命令:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

    参数:-a,–author=“”,指定镜像的作者信息

    ​ -m,–message=“”,提交信息

    ​ -p,–pause=true,commit时是否暂停容器

    commit命令构建镜像

    使用Dockerfile文件构建镜像

    Docker允许我们利用一个类似配置文件的形式来进行构建自定义镜像,在文件中可以指定原始的镜像,自定义镜像的维护人信息,对原始镜像采取的操作以及暴露的端口等信息。比如:

    # Sample Dockerfile
    FROM ubuntu:16.04
    MAINTAINER wgp "Kingdompin@163.com"
    RUN apt-get update
    RUN apt-get install -y nginx
    EXPOSE 80

    命令:docker build [OPTIONS] DockerFile_PATH | URL | -

    参数:–force-rm=false

    ​ –no-cache=false

    ​ –pull=false

    ​ -q,quite=false,构建时不输出信息

    ​ –rm=true

    ​ -t,tag=“”,指定输出的镜像名称信息

    Dockerfile文件构建镜像

    VIII. 镜像迁移

    我们制作好的镜像,一般会迁移或分享给其他需要的人。Docker提供了几种将我们的镜像迁移、分享给其他人的方式。推荐镜像迁移应该直接使用Docker Registry,无论是直接使用Docker Hub还是使用内网私有Registry都可以。使用镜像频率不高,镜像数量不多的情况下,我们可以选择以下两种方式。

    上传Docker Hub

    首先,需要在Docker Hub上申请注册一个帐号(人机验证时需要科学上网)。然后我们需要创建仓库,指定仓库名称。

    新建仓库

    在终端中登录你的Docker Hub账户,输入docker login,输入用户名密码即可登录成功。

    登录docker账户

    查看需要上传的镜像,并将选择的镜像打上标签,标签名需和Docker Hub上新建的仓库名称一致,否则上传失败。给镜像打标签的命令如下。

    docker tag <existing-image> <hub-user>/<repo-name>[:<tag>]

    其中existing-image代表本地待上传的镜像名加tag,后面<hub-user>/<repo-name>[:<tag>]则是为上传更改的标签名,tag不指定则为latest。

    打上标签

    可以看到,我们重新为ubuntu:16.04的镜像打上标签,观察IMAGE ID可知,同一镜像可以拥有不同的标签名。接下来,我们利用push命令直接上传镜像。

    docker push <hub-user>/<repo-name>:<tag>

    如图,我们已经上传成功。由于之前介绍的分层存储系统,我们这里是直接对已有的ubuntu镜像进行上传,只是重新打了标签,所以真正上传的只是变化的部分。

    上传成功

    Hub查看

    导出文件互传

    Docker 还提供了 docker loaddocker save 命令,用以将镜像保存为一个tar文件。比如这次我们将ubuntu:latest这个镜像保存为tar文件。

    docker save

    查看本地磁盘,即可看见名为ubuntu18.04的tar包。我们可以将其拷贝给其他PC,利用load命令重新导入。

    重新导入镜像

    推荐阅读

    展开全文
  • 本博客主要解决在Windows环境下,快速上手使用Docker的问题,主要会介绍在Windows系统下Docker Desktop的安装,Docker 基础命令,比如说下载镜像、启动镜像、使用镜像、关闭镜像、删除镜像、使用仓库、创建镜像等模块的...
  • docker

    万次阅读 2021-08-25 20:17:02
    docker
  • 第一本Docker书 PDF电子书下载 带书签目录 完整版
  • Docker入门与进阶实战(上)

    千人学习 2017-09-28 21:14:50
  • docker的/var/run/docker.sock参数

    万次阅读 多人点赞 2019-06-22 20:24:13
    /var/run/docker.sock是运行docker容器时常用的数据卷参数,本文就来学习这个参数的用处,揭示背后的原理。
  • Docker】在CentOS上安装Docker Engine

    千次阅读 2020-09-22 10:54:36
    前提条件 操作系统要求 要安装Docker Engine,您需要CentOS 7的维护版本。...较旧的Docker版本称为dockerdocker-engine。如果已安装这些程序,请卸载它们以及相关的依赖项。 $ sudo yum remove docker \ do.
  • Ubuntu 20.04 安装 docker 详解

    千次阅读 2021-02-25 15:37:35
    首先登录官网观摩观摩:docker 安装 步骤 1. 干净的卸载掉你系统中的 docker,不要问我为什么知道。 1)删除步骤1,官网给出的两条命令,当然为了确保你删的干净点,请看第二条 $ sudo apt-get purge docker-...
  • dind(docker in docker)学习

    千次阅读 2019-08-30 17:19:17
    docker in docker 说白了,就是在docker容器内启动一个docker daemon,对外提供服务。 优点在于: 镜像和容器都在一个隔离的环境,保持操作者的干净环境。 想到了再补充 :) 一:低版本启动及访问 启动1.12.6-...
  • docker save与docker export的区别

    万次阅读 多人点赞 2017-09-25 20:29:36
    缘起 docker save和docker export都能导出镜像包,咋看起来区别似乎不大。本文就针对这个问题,试图搞清楚docker save和docker export的功能是什么?...本文的测试的Docker版本如下,不保证所有版本的docker
  • Docker in docker 实现

    万次阅读 2020-11-06 11:34:44
    Docker in docker 文章目录Docker in docker原理实现(centos7)常见问题参考 在docker容器内运行docker一般是不被倡导的。但有些场景和业务上,需要在容器内使用docker对组件进行编译构建,不同的组件所需的依赖有...
  • Docker官方网址: https://docs.docker.com/ 英文地址 Docker中文网址: http://www.docker.org.cn/ ...Docker 自开源后受到广泛的关注和讨论,目前已有多个相关项目,逐断形成了围Docker的生态体系。...
  • Docker集群管理三剑客

    万人学习 2015-09-06 15:21:09
    Docker集群管理视频教程,该课程主要分享Docker集群管理工具,主要包括Docker Machine、Docker Compose、Docker Swarm。Docker Machine为本地,私有数据中心及公有云平台提供Docker引擎,实现从零到Docker的一键部署...
  • docker命令

    千次阅读 2019-03-24 23:27:48
    1、service docker status 查看docker守护进程运行的状态 2、service docker start 启动docker的守护进程 3、service docker stop 关闭docker的守护进程 4、docker info 返回所有容器和镜像的数量、docker...
  • 阿里云CentOS环境之docker安装,启动,加速器(十四) 阿里云CentOS环境之docker安装,启动,加速器(十四) 介绍 前提条件 安装 1.卸载(可选) 2.安装yum-utils device-mapper-persistent-data lvm2...
  • 这可能是最为详细的Docker入门吐血总结

    万次阅读 多人点赞 2019-01-15 15:21:55
    Docker是什么? 在计算机技术日新月异的今天, Docker 在国内发展的如火如荼,特别是在一线互联网公司, Docker 的使用是十分普遍的,甚至成为了一些企业面试的加分项,不信的话看看下面这张图。 这是我在某...
  • 终于有人把 Docker 讲清楚了

    万次阅读 多人点赞 2020-05-10 10:08:15
    1、了解Docker的前生LXC LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpace。容器有效地将由单个操作系统...
  • Docker入门到实践

    万人学习 2014-11-29 13:50:07
    Docker的出现正好能帮助软件开发者开阔思路,尝试新的软件管理方法来解决这个问题。通过掌握Docker,开发人员便可享受先进的自动化运维理念和工具,无需运维人员介入即可顺利运行于各种运行环境。 《Docker技术入门...
  • 正确卸载和重装docker的方式

    万次阅读 2020-03-09 13:34:53
    文章目录查看已安装的版本卸载查看可安装的版本重装19.03.7查看安装后的版本 ...[root@master custom-wordpress-php-gd-freetype]# yum list installed|grep docker containerd.io.x86_64 1.2.13-3.1.el7 @do...
  • Centos7下安装Docker(详细安装教程)

    万次阅读 多人点赞 2019-09-04 09:42:47
    一,Docker简介 百科说:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间...
  • Docker 零基础从入门到使用

    万次阅读 多人点赞 2019-09-23 20:00:13
    诺!这只可爱的小鲸鱼就是docker了! Docker 是什么? Docker 是一个开源的应用容器引擎,让开发者...在讲 Docker 能干什么之前,我们不妨先看看没有 Docker 和有Docker分别是个什么样子的? 场景一 某公司需要开发...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 884,526
精华内容 353,810
关键字:

docker