×

docket

docket(docker容器与虚拟机有什么区别)

jnlyseo998998 jnlyseo998998 发表于2022-10-21 01:23:24 浏览67 评论0

抢沙发发表评论

本文目录

docker容器与虚拟机有什么区别

谢邀~

我们单位最近在推docker,已经在开发测试环境使用(稍显落后),下面我就谈谈自己的Docker的理解,以及Docker和虚拟机的区别。

虚拟机

先说说什么是虚拟机:在一台物理机器上,利用虚拟化技术,虚拟出来多个操作系统,每个操作系统之间是隔离的。

说起来有些绕,那么我们看看虚拟机的架构图,就容易理解了。例如我们要在一台物理机器运行三个Java项目,彼此之间隔离。

从下往上看,解释起来其实很简单:

最下面的一层就是物理机,可以是服务器,设置是一台个人电脑;

  • 电脑上需要安装操作系统,比如我们安装了win10的操作系统;

  • 再往上就是虚拟机软件了,比如我们常用的VirtualBox、VMWare,它们的作用是模拟计算机硬件;

  • 继续向上,就是虚拟机模拟出来的操作系统了;

  • 在虚拟的操作系统中,安装所需的软件、组件等。比如我们需要在虚拟操作系统中安装JDK、Tomcat等;

  • 最后就是具体的应用了,例如部署到Tomcat中。

Docker

再说说什么是Docker,找了一句官方的解释:Docker是开源的应用容器引擎。是不是又一头雾水?我们还是先看看Docker的架构图。

依然从下往上看:

  • 最下面两层,概念同上。

  • 往上,可以看做Docker容器的管理器。

  • 依赖和应用都被打包成了Docker镜像。例如,JDK、Tomcat、应用都被打包在了一起,运行在Docker容器里,容器和容器间是隔离的。

  • 这里提示:Linux支持Docker,Windows和MacOS的话,不直接支持(win10专业版好像可以直接支持,不过我都是安装Linux的虚拟机,在上面跑Docker)。

Docker和虚拟机的区别

  • 从两者的架构图上看,虚拟机是在硬件级别进行虚拟化,模拟硬件搭建操作系统;而Docker是在操作系统的层面虚拟化,复用操作系统,运行Docker容器。

  • Docker的速度很快,秒级,而虚拟机的速度通常要按分钟计算。

  • Docker所用的资源更少,性能更高。同样一个物理机器,Docker运行的镜像数量远多于虚拟机的数量。

  • 虚拟机实现了操作系统之间的隔离,Docker算是进程之间的隔离,虚拟机隔离级别更高、安全性方面也更强。

  • 虚拟机和Docker各有优势,不存在谁替代掉谁的问题,很多企业都采用物理机上做虚拟机,虚拟机中跑Docker的方式。

我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。

有docker了,为什么还需要nas系统

感谢邀请,Docker和NAS完全是两个不同的东西,侧重点不一样。Docker又叫容器,实际上是SaaS的技术,提供的是应用服务。

例如现在企业如果需要部署服务,使用Docker是非常快捷的方法,因为Docker不需要你部署逻辑服务器,也不需要起复杂的虚拟机。虚拟机虽然可以隔离出很多“子电脑”,但占用空间更大,启动慢,而且需要硬件支持

而Docker容器是在操作系统层面上实现的虚拟化,直接利用本地主机的操作系统,因此更轻量。不像虚拟机一样,需要对整个OS虚拟化,Docker虚拟的是Linux内核之上的应用部分,所以启动更迅速,可以到秒级。

如果企业需要广泛部署某个应用,只需要把包含这个应用的镜像在私有云的服务器上基于容器安装启动(你可以理解为我们家庭安装操作系统时的Ghost),那么这个应用就能很快部署。这比建立虚机再安装应用快多了,就类似复制黏贴。

所以很多企业使用Docker快速搭建自己的应用,实现秒级的应用搭建和启动。这是Docker的作用,应用部署。但是Docker应用所需的存储空间是共享的。

而NAS其实是存储服务器,NAS(Network Attached Storage:网络附属存储)按字是基于网络,用于资料存储功能的服务器,因此也称为“网络存储器”。它的作用是管理数据,做到控制和存储分离。NAS可用实现通过网络存取数据,而现在NAS已经从云端走到了家庭,成为家庭的存储利器之一

NAS里面内置一个用于管理的轻量化Linux系统,但是这个仅仅是管理,有的NAS也可用直接作为Linux服务器部署业务,但是这个能力很弱。所以Docker主要是用于应用的安装,而NAS主要是运用于保存数据,这是两个应用方向。

而且正如刚才所说的,NAS的家庭应用已经很普遍了,你就可以认为是一个映射的外挂硬盘,这个应用场景类似于建立一个小型的家庭数据中心,应用场景比容器广泛的多,容器Docker主要还是基于企业部署应用的。

所以简单的理解,Docker的作用是企业快捷的基于物理服务器安装APP提供服务,NAS是提供数据存储,两个都需要

Docker有什么优势

Docker是一个开源容器引擎,将应用以及依赖打包到一个可移植的镜像中,并且将配置脚本化、自动化,实现一键部署、虚拟化和集群化,快捷高效交付应用。

一,Docker核心技术

Docker核心概念:

1)镜像Image,应用和依赖打包生成的文件。

2)容器Container,运行应用的实例。

3)仓库Repository,存放镜像文件的地方。

Docker-compose资源编排,将多个服务和对应的容器组织成为一个应用系统,声明在docker-compose.yml文件中,将这些服务作为一个整体来创建和启动。

Docker Swarm集群管理工具,统一管理组织多个Docker节点,支持动态扩容等特性,集群化部署和管理应用系统,和Kubernetes(k8s)相比,更加轻量,适合较小规模。

二,Dockerfile配置是核心

Dockerfile声明应用和依赖,比如拉取代码、添加运行库、设置数据卷、配置环境变量,等等。

三,Docker镜像构建

1,本地构建

Dockerfile完成后,可以在本机直接运行docker build命令。

2,云服务自动构建

代码托管在Git,配置阿里云容器镜像服务,在提交代码时,自动触发构建Docker镜像。

3,优化构建速度

合理的拆分Dockerfile,可以提高构建速度,比如将很少变化的部分独立出来,配置Dockerfile_base,然后Dockerfile的基础镜像引用它。

四,一键部署

配置docker-compose.yml文件,声明需要创建的服务、镜像、资源,比如环境变量、端口,等等,一键启动和运行应用系统。

需要集群化部署到多个Docker节点时,使用Docker Swarm或者Kubernetes(k8s)管理维护服务器节点,可以增加必要的控制参数,比如label, role,指定需要部署运行的容器在特定节点上。

我是工作多年的Web应用架构师,陆续发布关于软件开发方面的文章,欢迎关注我,了解更多IT专业知识。

如何通俗的解释“Docker”

我家是搞养殖的,养了几十头羊,有的瘦小,有的强壮。之前,所有羊在一个食槽里吃饲料,强壮的羊会挤兑瘦小的,不让其吃。结果就是强壮的愈加强壮,瘦小的愈加瘦小。为了解决这个问题,我为每头羊分配了一个食槽,每头羊只能在属于它的食槽吃饲料,去其他食槽吃就会挨打,一段时间后,每头羊便可以吃到为其分配的饲料,羊的长势也就比较均衡了。

有人的地方就有江湖,羊也一样。强壮的羊经常欺负瘦小的羊,导致瘦小的羊受伤,为了解决这个问题,我们将经常欺负弱小的羊单独圈起来,这样,对于它来说世界就只有它一头羊了,精力无处发泄,只能撞墙了。原先的羊圈,欺负弱小的情形还在继续发生,理想的方法是为每头羊准备一个单独的羊圈,我将方法提出后,被家里以成本过高为由否决了。

我们以进程类比羊,以操作系统类比羊圈,以资源类比饲料。

进程A为了运行流畅,可能会无限申请内存及CPU时间,挤压了其他进程的资源,导致其他进程运行卡顿,用户就会认为其他软件用户体验差,进而卸载,这是非常不公平的。操作系统的解决方法是可为每个进程分配固定的资源(内存、CPU运行时间等),进程不能使用额外的资源。这就相当于为每头羊分配了一个食槽,里面放适合它的饲料。在计算机中,这种技术叫CGroups。

进程是可以看到其他进程的,也可以看到其他进程产生的文件。进程可调用kill、rm杀死其他进程或删除属于其他进程的文件。通过权限机制可缓解此问题,但是更好的方法是,进程只能看到属于自己的资源,进程想作恶,都不知道如何下手。在计算机中,这种技术叫做Namespace,将进程放在一个独立的Namespace中,进程就只能看到属于它的资源了,相当于为每头羊准备一个单独的羊圈。

通过CGroups和Namespace技术,进程只能使用固定的资源,并认为自己独享操作系统,这就是容器虚拟化技术。

容器虚拟化技术是操作系统级虚拟化。文件系统属于Namespace的一种,通过容器虚拟化技术,进程A使用Ubuntu16.04的文件系统,进程B使用Ubuntu22.04的文件系统,虽然二者使用的内核是同一个,但应用软件的行为(由软件、依赖库、配置文件等决定)分别与Ubuntu16.04和Ubuntu22.04一致,就可以认为,分别虚拟出了Ubuntu16.04和Ubuntu22.04操作系统。

Docker整合了上述虚拟化技术,并提供了一系列工具,简化并自动化容器虚拟化技术使用流程。风云际会,掀开了云原生时代的序幕。


我写了一个称作docker.sh 的小项目,该项目旨在通过一系列的实验使用户对docker的底层技术,如Namespace、CGroups、rootfs、联合加载等有一个感性的认识。在此过程中,我们还将通过Shell脚本一步一步地实现一个简易的docker,以期使读者在使用docker的过程中知其然知其所以然。该项目的仓库地址如下:

项目为什么用docker

项目为什么要用 docker,需要了解 docker 的优势,结合项目的实际情况来决定是否需要使用 docker,千万不能“为了使用而使用”或者“跟风使用 docker”。

使用 docker 是为了快速交付

和传统的虚拟机相比,docker 具有所用的资源更少、性能更高、隔离级别更高、安全性方面也更强等特点,让我们看看下面几个场景,估计你会有更深的体会。

01. 移植性更强

相信开发人员都会遇到这样的问题:代码在本地跑的好好的,但是一发布到测试环境怎么就有问题了呢?

通常我们的的代码包需要依赖于环境中的很多因素,比如配置文件、依赖库、中间件的配置等等,其中一项有问题可能都会导致我们代码出现问题;对于开发人员来说,最希望的就是我们的代码能够一次创建,在任意地方都能运行。

而使用 docker 之后,可以实现开发、测试、运维环境的标准化,镜像文件直接做为交付物,避免了因为环境不同导致的各种问题。

02. 更容易扩展

docker 容器可以在任意平台运行,不管是物理机还是虚拟机,不管是公有云还是私有云,甚至是个人电脑,所以我们的项目容易做迁移和扩展。

比如我们应用部署了两台机器,当我们想再扩展第三台机器的时候,我们需要先搭建好代码运行所需的环境,尽管虚拟机也有一些快速 copy 的技术,但是这个过程依然是很慢的,而且有些环境配置还容易出错,而有了 docker,只需要构建镜像然后运行即可,非常方便快速。

因为 docker 快速的构建方式,也让我们的项目可以实现自动且快速的扩容和缩容。

03. 更加轻量

在 docker 出现之前,通常会采用物理机上部署多台虚拟机,每个应用都部署在一个虚拟机中;但是虚拟机非常的重,虚拟机的构建速度通常都是按照分钟计算,占用的资源比较多。

而 docker 的速度很快,秒级,并且使用的资源更少,性能更高;同样一个物理机器,docker 运行的镜像数量远多于虚拟机的数量。

使用 docker 只是快速交付的一部分

docker 的优点这么多,那是不是用了 docker 之后,我们的交付速度更快了呢?

我见过一个项目,他们号称已经微服务化了,当然他们确实也做到了:把一个项目拆成了数个服务,每个服务在生产环境上部署了多套,算下来就是 N * M 个应用包(七八十个),都做了容器化...

  • 但是他们依然是人肉运维,也是就是他们每次提测和上线需要手动部署,没有自动化测试和发布;

  • 生产环境发生问题的时候,需要手动去拿日志跟踪问题,开发和运维依然是两个团队,甚至是所属两个不同的部门,沟通的成本很高;

  • 他们虽然实现了容器化,但其实并没有实现快速交付,甚至比传统的方式更慢了。

所以,不要为了 docker 而 docker;如果你们的项目环境配置复杂,每来一个新人配置环境都需要一两天;每次提测和上线,经常问题都是运行环境的问题;开发人员的开发环境不统一;开发能力强,运维能力弱的时候,甚至公司比较穷,想实现资源使用的最大化,都可以考虑使用 docker,不过像要做微服务化+容器化,当容器集群规模比较大的时候,还需要工具做容器的自动化管理和编排,自动化测试及部署等等。

我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。

可以用docker代替虚拟机,运行生产服务器吗

正面回答这个问题之前,先看看虚拟机和Dcoker的区别。

  • 虚拟机:在一台物理机器上,利用虚拟化技术,虚拟出来多个操作系统,每个操作系统之间是隔离的。举例说明:电脑上安装操作系统,比如我们安装了win10的操作系统;再往上安装虚拟机软件,比如我们常用的VirtualBox、VMWare,它们的作用是模拟计算机硬件;这样虚拟机模拟出来的操作系统了;在虚拟的操作系统中,安装所需的软件、组件等。比如我们在虚拟操作系统中安装JDK、Tomcat等;最后就是具体的应用了,也就是把应用部署到Tomcat中。

  • Docker:官方解释是开源的应用容器引擎。用人话解释一下:依然需要现在电脑上安装操作系统, 然后安装Docker容器的管理器,到了这一步,不需要自己安装JDK和Tomcat,而是由开发人员将素有的依赖和应用都被打包成了Docker镜像。例如,JDK、Tomcat、应用都被打包在了一起,运行在Docker容器里,容器和容器间是隔离的。

总结一下虚拟机和Docker的区别:

  • 从两者的架构图上看,虚拟机是在硬件级别进行虚拟化,模拟硬件搭建操作系统;而Docker是在操作系统的层面虚拟化,复用操作系统,运行Docker容器。

  • Docker的速度很快,秒级,而虚拟机的速度通常要按分钟计算。

  • Docker所用的资源更少,性能更高。同样一个物理机器,Docker运行的镜像数量远多于虚拟机的数量。

  • 虚拟机实现了操作系统之间的隔离,Docker算是进程之间的隔离,虚拟机隔离级别更高、安全性方面也更强。

再正面回答一下“Docker可以代替虚拟机运行生产服务器么”?

  • Docker是可以用于生产环境的;但是Docker是有学习成本的,前期要踩不少的坑;
  • 如果没有容器集群管理工具的话,只用Docker的话,没有太大必要(人肉维护?开发和运维都会死的);
  • 虚拟机和Docker各有优势,很多企业都采用物理机上做虚拟机,虚拟机中跑Docker的方式。
  • 总之,要说Docker代替虚拟机还为时过早,至少短期内不会;

我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。

在个人电脑(非服务器)上中重度使用docker是什么体验

我现在就是这样子,我目前个人使用的是Mac book,Mac OS实际上是BSD Unix系统的一个分支,与Linux还有些许的不同,包括常用的编译工具,Linux实用工具等。而有时候又会需要Linux环境,但我嫌虚拟机启的太慢了,所以自己搭了docker环境,可以与宿主机互联,并且利用VSCode的远程连接和容器功能实现可视化,目前用的很舒服?。只需要简单几秒钟就可以启一个新的镜像,同时可以利用docker image很容易实现Linux定制等功能。总的来说,个人感觉体验比Mac上的Virtual box或者VMFusion好很多。

小白docker求入门!求大佬帮忙

本文邀请yeedom来解答,通过大量的图片、示例介绍,帮助你快速、全面地从入门到实战~

1、docker是什么

Docker使用go基于linux lxc(linux containers)技术实现的开源容器,诞生于2013年年初,最开始叫dotcloud公司,13年年底改名为docker inc。

2017年下载次数达到了百亿次,估值达13亿美元,通过对应用封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)全生命周期管理,达到“一次封装,到处运行”

为何使用docker?

Docker直译码头工人,将各种大小和形状的物品装进船里。这对从事软件行业的人来说,听起来很熟悉,花了大量时间和精力把一个应用放在另一个应用里。

docker出现之前,对不同环境的安装、配置、维护工作量很多,如部署,配置文件,crontab,依赖等等。使用docker,无需关心环境,只需要一些配置就能构建镜像,而部署则用一条run命令。

虚拟机VS容器

虚拟机需要有额外的虚拟机管理应用和虚拟机操作系统层,操作系统层不仅占用空间而且运行速度也相对慢。docker容器是在本机操作系统层面上实现虚拟化,因此很轻量,速度接近原生系统速度。

虚拟机启动速度是分钟级别,性能较弱、内存和硬盘占用大,一个物理机最多跑几十个虚拟机,但它的隔离性比较好。docker启停都是秒级实现,内存和硬盘占用非常小,单机支持上千个容器,在ibm服务器上可运行上万个容器。容器跟虚机相比,有着巨大的优势。

docker优点

只关心应用:以往我们需要关心操作系统、软件、项目,有了docker我们可以只关心应用而不是操作系统,docker发展迅速,基于docker的paas平台也层出不穷,使得我们能更方便的使用docker;

快速交付:docker可在秒级提供沙箱环境,开发,测试,运维使用完全相同的环境来部署代码

微服务:docker有助于将一个复杂系统分解,让用户用更离散的方式思考服务

离线开发:将服务编排在笔记本中移动办公,使用docker可在本机秒级别启动一个本地开发环境;

降低调试成本:在测试和上线时产生无效的类、有问题的依赖、缺少的配置等问题,docker可让一个问题调试和环境重现变得更简单;

CD:docker让持续交付实现变得更容易,特别是对于蓝绿部署就更简单。

第一版上线时,需要上第二版新功能,两个版本功能会有冲突,这时用docker实现蓝绿部署就非常方便了;

如:可以部署两个版本同时在线,新版本测试没问题了把老版本流量切到新版本就可以了

迁移:可以很快的迁移到其他云或服务器

与传统虚拟机方式相比,容器化方式在很多场景下都是存在极为明显的优势。无论是开发、测试、运维都应该尽快掌握docker,尽早享受其带来的巨大便利;

容器化方式在很多场景下都有极大的优势。无论是开发、测试、运维都应该尽快掌握docker,尽早享受其带来的巨大便利。

概念

再来了解docker非常关键的概念,这样才能理解docker容器整个生命周期。

概念-镜像

镜像(类)=文件系统+数据,我常常用开发语言中的类比作镜像,对象比作容器镜像由多个层加上一些docker元数据组成,容器运行着由镜像定义的系统。

概念-容器

容器(对象)=镜像运行实例

容器是镜像的运行实例,可以使用同一个镜像运行多个实例。如图所示,一个ubuntu docker镜像产生了三个ubuntu容器,docker利用容器运行和隔离应用。

从读写角度来说,镜像是只读的,容器是在镜像上添加了一层可读写的文件系统。

概念-层

层=文件变更集合

像传统虚机应用,每个应用都需要拷贝一份文件副本,运行成百上千上磁盘空间会迅速耗光,而docker采用写时复制来减少磁盘空间,当一个运行中的容器要写入一个文件时,它会把该文件复制到新区域来记录这次的修改,在执行docker提交时将这次修改记录下并产生一个新的层。docker分层解决大规模使用容器时碰到的磁盘和效率问题。

概念-仓库

docker借鉴了大量git优秀的经验。docker仓库分公有库和私有库,最大的公开仓库是docker hub,国内也有很多仓库源。

2、创建第一个docker应用

通过创建一个docker应用来看看docker是怎么方便使用的。

创建docker镜像方式

创建docker有四种方式

但最常用的docker命令+手工提交和Dockerfile的方式

对于我们来说Dockerfile是最常用也是最有用的。

那创建一个docker应用只需要三步:编写dockerfile、构建镜像、运行容器

编写dockerfile

那我们就开始用dockerfile来创建一个应用

Dockerfile是包含一系列命令的文本文件,这个文件包含6条命令

1、FROM是使用php官方镜像,左边是镜像名字,右边是标签名字,标签名字不写默认是latest

2、声明维护人员

3、RUN运行一条linux命令,我们把php代码重定向到/tmp/index.php

4、EXPOSE声明要开放的端口

5、WORKDIR启动容器后默认目录

6、CMD容器启动后,默认执行的命令,相当于应用的入口,用php自带的webserver监听8000

构建镜像

使用docker build命令生成镜像,—tag指定镜像的名字,左边是名字,右边是标签,最后有个.表示在当前目录查找Dockerfile。可以看到,每个命令都会有个输入输出,输入是命令,输出是给到层的id,所以,基本上每个命令都会产生一个层。最后提示镜像构建成功,并打上镜像标签。

运行容器

第三,使用docker run命令运行镜像,-p将容器的8000端口映射到本机8000端口,—name给容器起个名字。用curl对本机8000端口请求,服务器返回当前时间,说明我们构建的容器运行成功了。

请求本地8000端口,服务器返回当前时间

dockerfile常用命令

其实Dockerfile常用命令就5个:from、add、run、workdir、cmd

创建docker应用步骤

•编写dockerfile

•构建镜像

•运行容器

使用docker应用步骤

•拉取镜像

•运行容器

dockerfile最佳实践

•精简镜像用途

尽量让每个镜像的用途单一

•选择合适基础镜像

选择以alpine、busybox等基础的镜像

busybox:号称操作系统里的瑞士军刀,只有……这么大,但却有一百多常用命令

如果你的目标是小而精,busybox是首选,因为它已经精简到没有bash,使用的是ash,一个兼容posix的shell

Alpine:你的目标是小但是又有一些工具的话,可以选择alpine,它是一个面向安全的轻量linux发行版,它关注安全、性能和资源效能,比busybox功能更完善,还提供apk查询和安装软件包,大小只有2-3兆。

很多官方的镜像都有alpine的镜像,像刚刚使用的php镜像。

•提供维护者信息

•正确使用版本

使用明确的版本号,而非依赖于默认的latest,避免环境不一致导致的问题

•删除临时文件

如安装软件后的安装包,如上图2、3步骤

•提高生成速度

如内容不变的指令尽量放在前面,这样可以复用

•减少镜像层数

多条命令写在一起,使生成的镜像层数少,如上图2、3步骤

•恰当使用multi-stage

保证最终生成镜像最小化

3、常用命令

想使用一个镜像,用这个命令就可以了,默认按评分排序。official如果是ok表示是官方镜,Auto标示它是否用dickerfile进行自动化镜像构建。

pull

一旦确定一个镜像,通过对其名称执行docker pull来下载。标签默认是latest,严格来讲,镜像的仓库名还应该添加仓库地址的,默认是registry.hub.docker.com Docker images命令查找下载的镜像。

run

使用docker run运行一个容器,it表示用交互式方式运行,最后表示要执行的命令。

其实更常用的方式是以后台方式来执行,这时用d参数在后台运行,运行后用exec命令进去到容器。

tag

Docker tag给镜像一个新tag名字。

Docker images查看centos镜像,把centos:latest打上centos:yeedomliu,这时再看会有3个centos,latest和yeedomliu的镜像id是相同的。把centos:yeedomliu删除,再查看latest还会存在,最后用rmi命令删除latest就会真正把latest镜像删除掉。如果相同镜像存在多个标签,只有最后一次的rmi命令会真正删除镜像。

ps

Ps可以查看运行中的容器

rmi

删除一个镜像,同一个镜像id的不同标签的镜像,使用rmi删除最后一个镜像才会真正删除这个镜像。

rm

删除docker容器,如果运行中的容器需要加-f

diff

容器启动后文件变化情况

logs

查看容器运行后的日志

cp

我们想从容器里面拷贝文件到宿主机,或相反的过程就可以用到cp命令

container prune

随着使用docker时间越长,停止状态下的容器会越来越多,这些都会占据磁盘空间

image prune

未被打标签的镜像可以用image prune命令清理

system prune/df

如果你觉得刚刚两条命令执行起来麻烦,可以用docker system prune一条命令搞定

另外用system df查看docker磁盘空间

实战

了解了docker基础知识后,可进入相对实战的环节

•本地开发

我们的项目使用了很多服务,如redis/mysql/mongodb等等,如果一个个运行起来,还加上配置,容易出手,也比较麻烦

kitematic:与使用命令行管理本地容器相比,你更想使用图形工具对容器管理,官方推出的容器管理工具,通过它可以查找镜像、创建容器、配置、启停容器等管理。

这是配置容器端口和宿主机端口,目录,网络等映射界面

docker-compose

compose定位是“定义和运行多个docker容器的应用”,前身fig,目前仍然兼容fig格式的模板文件。

一条命令可以把一个复杂的应用启动起来

日常工作中,经常碰到多个容器相互完成某项任务

docker-compose示例1

默认模板文件名叫docker-

compose.yml

,结构很简单,每个顶级元素为服务名称,次级信息为配置信息。这里使用了redis/mongodb/mysql/nginx镜像,分别给它们映射了本地目录、端口、密码等信息,nginx镜像需要使用redis/mysql等服务,用links命令连接进来。

docker-compose示例2

如果在本地开发,每个项目都可以像之前说的那样配置,这里提供了另外一种做法。我把公共的资源在一开始就启动,每个项目里只启动nginx镜像并关联其它的服务即可。

公共服务compose

项目compose

•常见问题

主进程:docker启动第一个进程称主进程,就是id为1的进程,这个进程退出就意味着容器退出,所以想要使docker作为服务使用,这个进程是不能退出的。expose命令是声明暴露的端口,运行时用-P才会生效。一般ports命令是做真正的端口映射,比较常用。

•架构

安装了docker的主机,一般在一个私有网络上

1、调用docker客户端可以从守护进程获取信息或发送指令

2、docker守护进程使用