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

    万次阅读 多人点赞 2019-10-29 23:15:26
    文章目录@[toc]dockerdocker 手册centos7 联网安装docker官方安装手册镜像加速基本概念镜像容器docker 镜像操作下载 CentOS 镜像查看centos7镜运行 centos7删除镜像镜像导出镜像导入容器操作启动容器后台运行查看...




    docker

    官网是这样介绍docker的:

    Docker is an open platform for developers and sysadmins to build, ship, and run distributed applications…

    其实看完这句话还是不明白docker究竟是什么

    我们可以把他想象成是一个用了一种新颖方式实现的超轻量虚拟机。当然在实现的原理和应用上还是和VM有巨大差别的,并且专业的叫法是应用容器(Application Container)。

    docker

    比如现在想用MySQL,那就找个装好并配置好的MySQL的容器(可以认为是特殊的,轻量级的虚拟机),运行起来,那么就可以使用 MySQL了。

    那么为什么不直接在操作系统中安装一个mysql,而是用容器呢?

    安装MySql过程并不简单,要配置安装源,安装依赖包,对mysql进行配置…如果要在多台主机上安装,每台主机都要进行这些繁琐的操作,万一服务器挂了,这一系列操作还要再重来一遍

    但有了docker,一个安装配置好的mysql容器,可以直接拿到另一台主机上启动,而不必重新安装mysql

    另外,docker还有一重要的用处,就是可以保证开发,测试和生产环境的一致.




    docker 手册

    中文免费手册 [Docker — 从入门到实践]
    https://vuepress.mirror.docker-practice.com

    docker 从入门到实践,离线版

    docker pull dockerpracticecn/docker_practice
    docker run -it --rm -p 4000:80 dockerpracticecn/docker_practice
    




    centos7 安装docker

    离线安装包

    下载离线安装包
    https://download.csdn.net/download/weixin_38305440/12265961

    上传离线安装包

    • docker-install 目录上传到 /root

    切换到docker-install目录

    cd docker-install
    

    安装

    rpm -ivh *.rpm
    

    yum 在线安装 docker

    官方安装手册

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

    卸载旧版

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

    安装一组工具

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

    设置 yum 仓库地址

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

    更新 yum 缓存

    sudo yum makecache fast
    

    安装新版 docker

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

    启动docker系统服务

    启动 docker

    sudo systemctl start docker
    

    设置 docker 开机启动

    sudo systemctl enable docker
    

    镜像加速

    由于国内网络问题,需要配置加速器来加速。
    修改配置文件 /etc/docker/daemon.json

    下面命令直接生成文件 daemon.json

    cat <<EOF > /etc/docker/daemon.json
    {
      "registry-mirrors": [
        "https://dockerhub.azk8s.cn",
        "https://hub-mirror.c.163.com"
      ]
    }
    EOF
    

    之后重新启动服务。

    # 重新加载docker配置
    sudo systemctl daemon-reload
    
    #重启docker服务
    sudo systemctl restart docker
    

    查看镜像配置

    docker info
    

    运行 hello-world 镜像,验证 docker

    sudo docker run hello-world
    




    基本概念

    镜像

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

    镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。

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

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

    容器

    镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

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

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

    容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。

    按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。

    数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。




    docker 镜像操作

    下载 CentOS 镜像

    docker pull centos:7
    

    查看centos7镜

    docker images
    

    docker image ls
    

    运行 centos7

    docker run -it xxxx bash
    
    • xxxx - 镜像名, 或 image id 的前几位
    • -it 这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
    • bash 放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash。

    删除镜像

    • 501 镜像 id 前几位,一般三位以上,足够区分即可
    docker image rm 501
    
    • 删除指定仓库的镜像
    docker image rm centos
    

    镜像导出

    docker save mysql:5.7 node:8 | gzip > app.tar.gz  
    

    镜像导入

    docker load < apps.tar.gz  
    




    容器操作

    启动容器

    docker run -it centos:7 bash
    

    当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:

    • 检查本地是否存在指定的镜像,不存在就从公有仓库下载
    • 利用镜像创建并启动一个容器
    • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
    • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
    • 从地址池配置一个 ip 地址给容器
    • 执行用户指定的应用程序
    • 执行完毕后容器被终止

    后台运行

    docker run -dit centos:7
    
    • -d 后台运行容器
    • 容器是否会长久运行,是和 docker run 指定的命令有关,和 -d 参数无关。

    查看后台运行的容器输出结果

    docker container logs 802
    

    查看容器

    docker container ls -a
    # 或
    docker ps -a
    
    • -a all, 全部

    终止容器

    docker container stop 802
    

    重新启动容器

    docker container restart 802
    

    进入容器

    在使用 -d 参数时,容器启动后会进入后台。

    某些时候需要进入容器进行操作,可以使用 docker exec 命令

    docker exec -it 802 bash
    

    删除容器

    docker container rm 802
    
    • 如果删除运行中的容器,需要添加 -f 参数

    清理所有终止状态容器

    docker container prune
    




    数据管理

    在这里插入图片描述

    在容器中管理数据主要有两种方式:

    • 数据卷(Volumes)
    • 挂载主机目录 (Bind mounts)

    数据卷

    数据卷 是一个可供一个或多个容器使用的特殊目录

    • 数据卷 可以在容器之间共享和重用
    • 对 数据卷 的修改会立马生效
    • 对 数据卷 的更新,不会影响镜像
    • 数据卷 默认会一直存在,即使容器被删除

    创建数据卷

    docker volume create my-vol
    

    查看所有数据卷

    docker volume ls
    

    查看指定 数据卷 的信息

    docker volume inspect my-vol
    

    查询的结果:

    [
        {
            "Driver": "local",
            "Labels": {},
            "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
            "Name": "my-vol",
            "Options": {},
            "Scope": "local"
        }
    ]
    

    启动挂载数据卷的容器

    docker run -it --mount source=my-vol,target=/webapp centos:7 bash
    
    # 或者:
    
    docker run -it -v my-vol:/webapp centos:7 bash
    
    • -v my-vol:/webapp 把数据卷 my-vol 挂载到容器的 /webapp 目录

    删除数据卷

    • 删除指定的数据卷,如果数据卷被容器使用则无法删除
    docker volume rm my-vol
    
    • 清理无主数据卷
    docker volume prune
    

    挂载主机目录

    docker run -it --mount type=bind,source=/usr/app,target=/opt/app centos:7 bash
    
    # 或
    
    docker run -it -v /usr/app:/opt/app centos:7 bash
    
    
    • -v 如果本地目录不存在 Docker 会自动为你创建一个文件夹
    • --mount 参数时如果本地目录不存在,Docker 会报错

    查看挂载目录信息

    docker inspect 91a
    

    显示结果:

    ...
    
    "Mounts": [
        {
            "Type": "bind",
            "Source": "/usr/app",
            "Destination": "/opt/app",
            "Mode": "",
            "RW": true,
            "Propagation": "rprivate"
        }
    ],
    
    ...
    
    




    网络

    自动分配映射端口

    docker run -d -P tomcat
    
    # 查看容器信息
    docker container ls -a
    

    显示结果:

    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
    d03480b1a781        tomcat              "catalina.sh run"   3 minutes ago       Up 3 minutes        0.0.0.0:32768->8080/tcp   trusting_gagarin
    

    映射指定端口

    docker run -d -p 8080:8080 tomcat
    
    • 8080:8080 本机端口:容器端口

    映射多个端口

    docker run -d \
           -p 5000:5000 \
           -p 80:8080 tomcat
    

    映射指定端口(指定网卡)

    docker run -d -p 192.168.64.150:8080:8080 tomcat
    

    自动分配映射端口(指定网卡)

    docker run -d -p 192.168.64.150::8080 tomcat
    

    查看端口配置

    docker port 8af
    




    容器互联

    新建网络

    docker network create -d bridge my-net
    
    • -d driver,网络类型,默认 bridge,也可以是 overlay(Swarm mode)

    列出网络

    docker network ls
    

    查看网络信息

    docker inspect 67d
    

    连接容器

    docker run -it --name app1 --network my-net centos:7
    

    新开终端执行:

    docker run -it --name app2 --network my-net centos:7
    

    在两个终端中分别执行:

    ping app1
    
    ping app2
    

    显示如下:

    [root@35569c623c4c /]# ping app1
    PING app1 (172.18.0.2) 56(84) bytes of data.
    64 bytes from 35569c623c4c (172.18.0.2): icmp_seq=1 ttl=64 time=0.577 ms
    64 bytes from 35569c623c4c (172.18.0.2): icmp_seq=2 ttl=64 time=0.061 ms
    64 bytes from 35569c623c4c (172.18.0.2): icmp_seq=3 ttl=64 time=0.066 ms
    ......
    
    • 多个容器互联,推荐使用 Docker Compose




    Dockerfile

    准备

    • centos:7镜像
    • jdk压缩包 jdk-8u212-linux-x64.tar.gz
    • tomcat7压缩包 apache-tomcat-7.0.96.tar.gz

    Dockerfile文件

    #以centos7为基础,安装oracle jdk8和tomcat7
    FROM centos:7
    #ADD命令将压缩包传入镜像中的指定目录,并同时解压缩
    ADD jdk-8u212-linux-x64.tar.gz /opt/
    ADD apache-tomcat-7.0.96.tar.gz /usr/
    #为了方便,把文件夹名称改得简单一点
    RUN mv /usr/apache-tomcat-7.0.96 /usr/tomcat
    #设置环境变量
    ENV JAVA_HOME=/opt/jdk1.8.0_212 \
        CATALINA_HOME=/usr/tomcat \
        PATH=$PATH:/opt/jdk1.8.0_212/bin:/usr/tomcat/bin
    #暴露容器的8080端口
    EXPOSE 8080
    #设置启动容器时自动运行tomcat
    ENTRYPOINT /usr/tomcat/bin/startup.sh && tail -F /usr/tomcat/logs/catalina.out
    
    FROM centos:7
    ADD jdk-8u212-linux-x64.tar.gz /opt/
    ADD apache-tomcat-7.0.96.tar.gz /usr/
    RUN mv /usr/apache-tomcat-7.0.96 /usr/tomcat
    ENV JAVA_HOME=/opt/jdk1.8.0_212 \
        CATALINA_HOME=/usr/tomcat \
        PATH=$PATH:/opt/jdk1.8.0_212/bin:/usr/tomcat/bin
    EXPOSE 8080
    ENTRYPOINT /usr/tomcat/bin/startup.sh && tail -F /usr/tomcat/logs/catalina.out
    

    使用 Dockerfile 构建镜像

    docker build -t tomcat:7 .
    
    • 注意末尾的点,表示构建过程中从当前目录寻找文件

    启动容器

    准备存储目录

    • webapps目录,例如 /opt/webapps
    • logs目录,例如 /var/lib/tomcat-logs
    mkdir /opt/webapps
    mkdir /opt/webapps/ROOT
    mkdir /var/lib/tomcat-logs
    
    # 添加欢迎页
    cat <<EOF > /opt/webapps/ROOT/index.html
    <h1>Hello Docker!!!</h1>
    EOF
    

    启动容器,挂载目录

    docker run \
    -d \
    -p 8080:8080 \
    --name tomcat7 \
    -v /opt/webapps:/usr/tomcat/webapps \
    -v /var/lib/tomcat-logs:/usr/tomcat/logs \
    tomcat:7
    
    展开全文
  • 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---(2)docker 镜像信息

    万次阅读 多人点赞 2018-01-10 09:20:54
    docker pull xxx,就可以把想要的镜像拉下来直接使用,但是pull下来的镜像存储在哪里呢?这里做下记录: 此处docker 版本为:Docker version 1.13.1 1. 进入docker目录,如下: root@iZuf6axmuekh1n14dwcufmZ:/# cd ...

    docker pull xxx,就可以把想要的镜像拉下来直接使用,但是pull下来的镜像存储在哪里呢?这里做下记录:

    此处docker 版本为:Docker version 1.13.1

    1. 进入docker目录,如下:

    root@iZuf6axmuekh1n14dwcufmZ:/# cd var/lib/docker/
    root@iZuf6axmuekh1n14dwcufmZ:/var/lib/docker# ls
    aufs  containers  image  network  plugins  swarm  tmp  trust  volumes

     

    2. 进入containers,每一个序列号,都是一个镜像,如下:

     

    cd containers/
    
    2addde372f5b4850ab167f1067db525313e1569e7117074841cc171acca7621d  4ce1634ce6f17474c8e6696bcf428e621f8c9572e1387316cf8183c97f4ad271

     

    3.进入其中一个镜像,发现目录结构如下,这就是这个镜像的内容了,如下:

     

    cd 2addde372f5b4850ab167f1067db525313e1569e7117074841cc171acca7621d/
    
    2addde372f5b4850ab167f1067db525313e1569e7117074841cc171acca7621d-json.log  checkpoints  config.v2.json  hostconfig.json  hostname  hosts  resolv.conf  resolv.conf.hash  shm

     

    4.在containers同级目录,有个叫image的文件夹,进入如下:

     

    cd images/aufs
    
    distribution  imagedb  layerdb  repositories.json

     

    里面有个repositories.json的文件,详细记录了镜像的一些信息:

     

    {"Repositories":{"mysql":{"mysql:latest":"sha256:7d83a47ab2d2d0f803aa230fdac1c4e53d251bfafe9b7265a3777bcc95163755","mysql@sha256:1f95a2ba07ea2ee2800ec8ce3b5370ed4754b0a71d9d11c0c35c934e9708dcf1":"sha256:7d83a47ab2d2d0f803aa230fdac1c4e53d251bfafe9b7265a3777bcc95163755"},"tomcat":{"tomcat:latest":"sha256:3dcfe809147daf54fbdbe1f6886b4c49df63f28e2b3c8ac119fef6a7f7490d3c","tomcat@sha256:d167fd5df11d7a7f7a3b04bd08a021948c67c92932ed38c740296c2ae69f67a3":"sha256:3dcfe809147daf54fbdbe1f6886b4c49df63f28e2b3c8ac119fef6a7f7490d3c"}}}

     

    (如果image没有aufs目录的,可能是这样的

    
    [root@izbp163wlhi02tcaxyu image]# ls
    overlay2
    [root@izbp163wlhi02tcaxyu image]# cd overlay2/
    [root@izbp163wlhi02tcaxyu overlay2]# ls
    distribution  imagedb  layerdb  repositories.json

    命令行如下:

    展开全文
  • 一文玩转 Docker

    万次阅读 2020-05-01 12:18:49
    Docker基本命令 镜像:(镜像,从认识上简单的来说,就是面向对象中的类,相当于一个模板。从本质上来说,镜像相当于一个文件系统。Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置...

    Docker基本命令

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

    查看本地所有镜像:
    	docker images
    	docker images -q	# 查看所用镜像ID
    	
    查找镜像:
    	docker search Redis
    
    拉取镜像:
    	docker pull Redis:5.0 # 不指定版本默认为最新,查找版本可以去	https://hub.docker.com/
    
    删除镜像:
    	docker rmi  镜像ID # 删除指定镜像
    	docker rmi  `docker images -q` # 删除所有镜像
    
    docker文件创建镜像:
    	docker build  -t 【image name】
    
    镜像标签:
    	docker tage 【image ID】【image name】
    
    更新镜像:启动镜像后 
    	apt-get update
    

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

    查看正在运行的容器:
    	docker ps  
    查看所有容器:
    	docker ps  -a
    
    构建容器:
    	docker run -it 【镜像ID】 /bin/bash
    	docker run -it --name mycentos docker.io/centos:7 /bin/bash
    参数说明:
      -i: 以交互模式运行容器,通常与 -t 同时使用;
      -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
      -d: 守护(后台)模式运行容器,并返回容器ID;需要使用docker.exec进入容器,退出后,容器不会关闭;
      -it: 创建的容器一般为交互式容器;
      -id: 创建的容器一般为守护式容器;
      --name="nginx-lb": 为容器指定一个名称。
    
      运行一个在后台执行的容器,同时,还能用控制台管理:
      	docker run -it -d ubuntu:latest
      运行一个带命令在后台不断执行的容器,不直接展示容器内部信息:
      	docker run -d ubuntu:latest ping www.docker.com
      运行一个在后台不断执行的容器,同时带有命令,程序被终止后还能重启继续跑,还能用控制台管理:
      	docker run -d --restart=always ubuntu:latest ping www.docker.com
      为容器指定一个名字:
      	docker run -d --name=ubuntu_server ubuntu:latest
      容器暴露80端口,并指定宿主机80端口与其通信(之前是宿主机端口,之后是容器需暴露的端口): 
      	docker run -d --name=ubuntu_server -p 80:80 ubuntu:latest
      指定容器内目录与宿主机目录共享(之前是宿主机文件夹,之后是容器需共享的文件夹): 
      	docker run -d --name=ubuntu_server -v /etc/www:/var/www ubuntu:latest
    
    启动容器:
    	docker start 容器ID
    	docker start 容器名
    
    进入容器:	# 退出容器,容器不会关闭
    	docker exec -it 容器ID  /bin/bash
    	docker exec -it 容器名  /bin/bash
    
    停止容器:
    	docker stop 容器ID
    	docker stop 容器名
    
    重命名: 
    	docker rename 原容器名  新容器名
    
    删除容器:# 如果容器删除失败,需要先停止,才能删除
    	docker rm 容器ID  
    	docker rm 容器名
    	docker rm `docker ps  -aq`
    	
    查看容器信息:
    	docker inspect 容器名
    

    在这里插入图片描述
    容器中的管理数据主要有两种方式:
    数据卷(Data Volumes)

    数据卷是宿主机中的一个目录或文件。容器目录与数据卷目录绑定后,对方的绑定会立即同步。一个数据卷可以被多个容器载,一个容器也可以挂载多个数据卷。对数据卷的更新,不会影响镜像。数据卷 默认会一直存在,即使容器被删除。作用:容器数据持久化,外部机器与容器通信,容器之间数据交互。

    数据卷容器(Data Volume Containers)

    如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载。

    1、Docker安装

    1.更新apt包索引
    	yum update
    	
    2.安装一些必要的系统工具:
    	yum install -y yum-utils device-mapper-persistent-data lvm2
    	
    3.添加软件源信息:
    	yum -y install yum-utils #安装yum-config-manager命令对应工具
    	yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    	
    4.更新 yum 缓存:
    	yum makecache fast
    	
    5.安装 Docker-ce:
    	yum -y install docker-ce
    	
    6.启动 Docker 后台服务
    	systemctl start docker
    	
    7.测试运行 hello-world
    	docker run hello-world
    	由于本地没有hello-world这个镜像,所以会下载一个hello-world的镜像,并在容器内运行。
    	
    8.查看docker的镜像
    	docker images
    
    9.设置Docker开机启动
    	systemctl enable docker
    

    1.1、配置阿里云免费的镜像加速器(阿里云为每个用户配置了不同的镜像加速器,并提供配置教程)

    2、About Docker

    2.1、Docker 镜像如何制作?

    (1).容器转镜像

    容器转镜像:
    docker commit 容器ID 镜像名:版本号
    
    镜像转成文件:
    docker save -o 压缩文件名称 镜像名:版本号
    
    文件转成镜像: 
    docker load -i 压缩文件名称
    

    (2).Dockerfile

    Dockerfile 是一个文本文件。包含了一条条的指令,每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像。对于开发人员:可以为开发人员提供一个完全一个的开发环境。对于测试人员:可以直接拿开发时构建的镜像或Dockerfile 文件构建一个新的镜像开始工作。对于运维人员:在部署的时候,可以实现应用的无缝移植。

    3、使用Docker搭建MySQL服务

    1.拉取官方镜像(我们这里选择5.7,如果不写后面的版本号则会自动拉取最新版)

    docker pull mysql:5.7   # 拉取 mysql 5.7
    docker pull mysql       # 拉取最新版mysql镜像
    

    2.检查是否拉取成功

    docker images
    

    3.创建Mysql目录

    cd /opt	# 具体路径可根据自我喜好
    mkdir mysql
    cd mysql
    

    4.一般来说数据库容器不需要建立目录映射

    docker run -p 3306:3306 --name c_mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
       - –name:容器名,此处命名为c_mysql
       - -e:配置信息,此处配置c_mysql的root用户的登陆密码
       - -p:端口映射,此处映射 主机3306端口 到 容器的3306端口
       - -d:源镜像名,此处为 mysql:5.7
    

    5.如果要建立目录映射($PWD表示当前路径,\表示换行输入)

    docker run -p 3306:3306 --name mysql \
    -v /mydata/mysql/conf:/etc/mysql \
    -v /mydata/mysql/logs:/var/log/mysql \
    -v /mydata/mysql/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=root \
    -d mysql:5.7
    
    • linux命令结尾加了“\”意为将最后的回车换行给注释了,系统理解为命令还没有结束,因而是继续等待用户进行输入,直到读到结束符,如回车。
    • -v:主机和容器的目录映射关系,":"前为主机目录,之后为容器目录。

    6.检查容器是否正确运行

    docker container ls
    
    • 可以看到容器ID,容器的源镜像,启动命令,创建时间,状态,端口映射信息,容器名字。

    7.连接Mysql
    进入docker本地连接mysql客户端

    docker exec -it c_mysql /bin/bash
    mysql -uroot -proot
    

    未完,待持续更新…

    混〔IT〕的小学生 热爱编程,喜欢挑战新事物! 撩撩博主 😃

    展开全文
  • docker-compose教程(安装,使用, 快速入门)

    万次阅读 多人点赞 2017-12-03 22:31:45
    教程基于ubuntu下最新的...Docker Compose是一个用来定义和运行复杂应用的Docker工具。一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose不再需要使用shell脚本来启动容器。 Compose 通过一个配...
  • Centos7下安装Docker(详细安装教程)

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

    万次阅读 2020-11-05 17:17:08
    Docker02_docker的常用命令 Docker官方文档地址:https://hub.docker.com/ docker的帮助命令 # 查看 docker 的版本 docker version # 查看 docker 的详细信息(系统信息、镜像和容器的数量) docker info # 查看 ...
  • docker-compose详解

    万次阅读 多人点赞 2019-02-18 11:06:19
    1 安装: 官方: curl -L ...chmod +x /usr/local/bin/docker-compose 或者使用包管理工具:...
  • 初识Docker

    万次阅读 多人点赞 2018-05-07 10:38:02
    Ubuntu Docker 安装 CentOS Docker 安装 Windows Docker 安装 MacOS Docker 安装 这里我的电脑是mac,采用brew安装,安装完毕记得更换国内的docker镜像源哦. 安装完毕,就开始使用,一探docker的神秘了. 开始之前...
  • 与sgy一起开启你的Docker之路 关键词: Docker; mac; Docker中使用gdb无法进入断点,无法调试; 写在前面 这篇博客适合谁? 对于Docker并不了解,只是有一点模糊的感觉,觉得Docker可以当成虚拟机用之类的 只是...
  • Docker stop停止/remove删除所有容器

    万次阅读 多人点赞 2017-12-01 17:22:57
    $ docker ps // 查看所有正在运行容器 $ docker stop containerId // containerId 是容器的ID$ docker ps -a // 查看所有容器 $ docker ps -a -q // 查看所有容器ID $ docker rm $(docker ps -a -q) // 删除所有容器
  • docker 设置国内镜像源

    万次阅读 多人点赞 2019-02-07 10:18:05
    创建或修改 /etc/docker/daemon.json 文件,修改为如下形式 # vi /etc/docker/daemon.json { "registry-mirrors": ["http://hub-mirror.c.163.com"] } systemctl restart docker.service 国内加速地址有: ...
  • 这可能是最为详细的Docker入门吐血总结

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

    万次阅读 多人点赞 2018-09-07 08:45:25
    因需要安装opendronemap,而这个依赖于docker,所以记录了一下安装docker的步骤,比较简单.通过apt的docker官方源安装最新的Docker CE(Community Edition),即Docker社区版,是开发人员和小型团队的理想选择。 开始...
  • docker 登陆 镜像仓库

    万次阅读 2019-02-24 00:22:04
    在配置非https的镜像仓库时,docker是不能直接拉取,需要配置daemon.json 官网解决地址:https://docs.docker.com/registry/insecure/#deploy-a-plain-http-registry ...vi /etc/docker/daemon.json {"insecur...
  • Docker的安装与配置命令

    万次阅读 2020-05-15 23:15:16
    docker 安装 安装依赖包 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 设置阿里云镜像源 sudo yum-config-manager --add-repo ...
  • linux安装和使用docker教程

    万次阅读 2020-08-16 16:51:19
    文章目录linux安装和使用docker教程1、docker官网安装地址2、卸载linux系统中的docker3、安装docker4、查看安装docker列表5、启动docker6、设置docker开机启动7、查看docker版本8、docker的image远程仓库地址9、拉去...
  • Docker——入门实战

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

    万次阅读 2019-10-19 10:47:38
    本文介绍 Neo4j的Docker安装,增删改查及索引操作实战操作可查看另一篇文章: https://blog.csdn.net/GodDavide/article/details/102636364 一、简介 Neo4j是一个世界领先的开源图形数据库。 它是由Neo技术使用...
  • docker linux私有仓库搭建

    万次阅读 2020-09-28 08:23:15
    云环境 docker 私有仓库操作 docker私有仓库地址:118.190.66.172:5000 使用步骤,在本机的该文件 centos:/etc/sysconfig/docker ubuntu: /etc/default/docker 1 在该文件下加上如下配置 DOCKER_OPTS="--...
  • docker安装es和kibana教程

    万次阅读 2020-08-16 19:38:16
    docker安装es和kibana教程 文章目录docker安装es和kibana教程1、前提2、拉去es和kibana的镜像(由于工作原因,本人拉去6.5.0版本)3、启动es4、查看启动进程5、启动kibana 1、前提 已经安装好docker 如果没有安装...
  • docker学习笔记

    万次阅读 2017-08-08 14:50:34
    docker学习笔记 一.更新内核,升级内核至3.x 二.安装docker: rpm --import/etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 yum -y install docker-io 三.启动docker: service docker start chkconfig docker on 四.下载...
  • Docker入门

    万次阅读 多人点赞 2020-12-14 13:33:28
    文章目录1 Docker简介1.1 什么是虚拟化-VT1.2 什么是DockerDocker的优势1.3 Docker容器与虚拟机比较1.4 Docker 组件1.4.1 Docker服务器与客户端1.4.2 Docker镜像与容器1.4.3 Registry(注册中心)2 Docker安装与启动...
  • Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和...
  • docker私有库的搭建

    万次阅读 2020-09-27 09:09:57
    docker pull registry:latest 2 配置 /etc/default/docker 因为https需要证书密码等比较复杂,直接加 insecure-registry即可 # Docker Upstart and SysVinit configuration file # Customize location of Docke
  • Docker in docker 实现

    万次阅读 2020-11-06 11:34:44
    Docker in docker 文章目录Docker in docker原理实现(centos7)常见问题参考 在docker容器内运行docker一般是不被倡导的。但有些场景和业务上,需要在容器内使用docker对组件进行编译构建,不同的组件所需的依赖有...
  • docker在linux上的安装部署

    万次阅读 2020-09-27 09:11:56
    以下文章了解之后你可以在服务器上部署项目,本地不需要安装 tomcat,jdk,mysql等服务器,通过docker可以一键解决 快速入门 安装docker $ apt install docker.io -y 若找不到资源,需要更新资源库,命令为: $ ...
  • docker重启后遇到这个问题,记录一下解决办法 systemctl status docker.service ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; ...
  • portainer连接远程docker

    万次阅读 2020-03-04 17:03:57
    安装 portainer > docker pull portainer/portainer ...docker run -d --name portainerUI -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer 访问 protainer http://...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 512,984
精华内容 205,193
关键字:

docker