返回顶部
首页 > 资讯 > 精选 >Docker是什么,有什么用?一看就明白
  • 515
分享到

Docker是什么,有什么用?一看就明白

2023-06-03 13:06:24 515人浏览 安东尼
摘要

Docker是一个基于轻量级虚拟化技术的容器,整个项目基于Go语言开发,并采用了Apache 2.0协议。Docker可以将我们的应用程序打包封装到一个容器中,该容器包含了应用程序的代码、运行环境、依赖库、配置文件等必需的资源,通过容器就可

Docker是什么,有什么用?一看就明白

Docker是一个基于轻量级虚拟化技术的容器,整个项目基于Go语言开发,并采用了Apache 2.0协议。Docker可以将我们的应用程序打包封装到一个容器中,该容器包含了应用程序的代码、运行环境、依赖库、配置文件等必需的资源,通过容器就可以实现方便快速并且与平台解耦的自动化部署方式,无论你部署时的环境如何,容器中的应用程序都会运行在同一种环境下。

举个栗子,小明写了一个CMS系统,该系统的技术栈非常广,需要依赖于各种开源库和中间件。如果按照纯手动的部署方式,小明需要安装各种开源软件,还需要写好每个开源软件的配置文件。如果只是部署一次,这点时间开销还是可以接受的,但如果小明每隔几天就需要换个服务器去部署他的程序,那么这些繁琐的重复工作无疑是会令人发狂的。这时候,Docker的用处就派上场了,小明只需要根据应用程序的部署步骤编写一份Dockerfile文件(将安装、配置等操作交由Docker自动化处理),然后构建并发布他的镜像,这样,不管在什么机器上,小明都只需要拉取他需要的镜像,然后就可以直接部署运行了,这正是Docker的魅力所在。

那么镜像又是什么呢?镜像是Docker中的一个重要概念:

  • Image(镜像):它类似于虚拟机中使用到的镜像,由于任何应用程序都需要有它自己的运行环境,Image就是用来提供所需运行环境的一个模板。
  • Container(容器):Container是Docker提供的一个抽象层,它就像一个轻量级的沙盒,其中包含了一个极简的linux系统环境与运行在其中的应用程序。Container是Image的运行实例(Image本身是只读的,Container启动时,Docker会在Image的上层创建一个可写层,任何在Container中的修改都不会影响到Image,如果想要在Image保存Container中的修改,Docker采用了基于Container生成新的Image层的策略),Docker引擎利用Container来操作并隔离每个应用(也就是说,每个容器中的应用都是互相独立的)。

其实从Docker与Container的英文单词原意中就可以体会出Docker的思想。Container可以释义为集装箱,集装箱是一个可以便于机械设备装卸的封装货物的通用标准规格,它的发明简化了物流运输的机械化过程,使其建立起了一套标准化的物流运输体系。而Docker的意思为码头工人,可以认为,Docker就像是在码头上辛勤工作的工人,把应用打包成一个个具有某种标准化规格的"集装箱"(其实这里指出的集装箱对应的是Image,在Docker中Container更像是一个运行中的沙盒),当货物运输到目的地后,码头工人们(Docker)就可以把集装箱拆开取出其中的货物(基于Image来创建Container并运行)。这种标准化与隔离性可以很方便地组合使用多个Image来构建你的应用环境(Docker也提倡每个Image都遵循单一职责原则,也就是只做好一件事),或者与其他人共享你的Image。

本文作者为SylvanasSun(sylvanas.sun@gmail.com),首发于SylvanasSun’s Blog。
原文链接:sylvanassun.GitHub.io/2017/11/19/…
(转载请务必保留本段声明,并且保留超链接。)

Docker VS 虚拟机

在上文中我们提到了Docker是基于轻量级虚拟化技术的,所以它与我们平常使用的虚拟机是不一样的。虚拟机技术可以分成以下两类:

系统虚拟机

  • 系统虚拟机:通过软件对计算机系统的模拟来提供一个真实计算机的替代品。它是物理硬件的抽象并提供了运行完整操作系统所需的功能。虚拟机通过物理机器来管理和共享硬件,这样实现了多个虚拟机环境彼此之间的隔离,一台机器上可以运行多个虚拟机,每个虚拟机包括一个操作系统的完整副本。在系统虚拟机中,所运行的所有软件或操作都只会影响到该虚拟机的环境。我们经常使用的VMWare就是系统虚拟机的实现。
  • 程序虚拟机:允许程序独立运行在平台之外。比较典型的例子就是JVM,Java通过JVM这一抽象层使得Java程序与操作系统和硬件平台解耦(因为每个Java程序都是运行在JVM中的),因此实现了所谓的compile once, run everywhere。

Docker所用到的技术与上述两种都不相同,它使用了更轻量级的虚拟化技术,多个Container共享了同一个操作系统内核,并且就像运行在本地上一样。Container技术相对于虚拟机来说,只是一个应用程序层的抽象,它将代码与依赖关系打包到一起,多个Container可以在同一台机器上运行(意味着一个虚拟机上也可以运行多个Container),并与其它Container共享操作系统内核,每一个Container都在用户空间中作为一个独立的进程运行,这些特性都证明了Container要比虚拟机更加灵活与轻量(一般都是结合虚拟机与Docker一起使用)。

Container技术其实并不是个新鲜事物,最早可以追溯到UNIX中的chroot(在1979年的V7 Unix中引入),它可以改变当前正在运行的进程及其子目录的根目录,在这种修改过的环境下运行的程序不能在指定的目录树之外访问文件,从而限制用户的活动范围,为进程提供了隔离空间。

之后各种Unix版本涌现出很多Container技术,在2006年,Google提出了"Process Containers"期望在Linux内核中实现进程资源隔离的相关特性,由于Container在Linux内核中的定义过于宽泛混乱,后来该项目改名为CGroups(Control Groups),实现了对进程的资源限制。

2008年,LXC(Linux Containers)发布,它是一种在操作系统层级上的虚拟化方法,用于在Linux系统上通过共享一个内核来运行多个互相隔离的程序(Container)。LXC正是结合了Linux内核中的CGroups和对分离的名称空间的支持来为应用程序提供了一个隔离的环境。而Docker也是基于LXC实现的(Docker的前身是dotClound公司中的内部项目,它是一家提供PaaS服务的公司。),并作出了许多改进。

使用Docker

在使用Docker之前你需要先安装Docker(这好像是一句废话。。。),根据不同的平台安装方法都不相同,可以去参考Install Docker | Docker Documentation或者自行Google。

安装完毕之后,输入docker --version来确认是否安装成功。

$ docker --version

Docker version 17.05.0-ce-rc1, build 2878a85复制代码

从Docker Hub中可以pull到其他人发布的Image,我们也可以注册一个账号去发布自己的Image与他人共享。

[root@Jack ~]# docker search redis # 查看Redis镜像是否存在

[root@Jack ~]# docker pull redis # 拉取redis镜像到本机

Using default tag: latest

Trying to pull repository docker.io/library/redis ...

latest: Pulling from docker.io/library/redis

Digest: sha256:cd277716dbff2c0211c8366687d275d2b53112fecbf9d6c86e9853edb0900956

[root@Jack ~]# docker images # 查看镜像信息

REPOSITORY TAG IMAGE ID CREATED SIZE

docker.io/python 3.6-onbuild 7195f9298ffb 2 weeks ago 691.1 MB

docker.io/mongo latest d22888af0ce0 2 weeks ago 360.9 MB

docker.io/redis latest 8f2e175b3bd1 2 weeks ago 106.6 MB复制代码

有了Image,之后就可以在其之上运行一个Container了,命令如下。

[root@Jack ~]# docker run -d -p 6379:6379 redis # 运行redis,-p代表将本机上6379端口映射到Container的6379端口 -d代表在后台启动

[root@Jack ~]# docker ps -a # 查看容器信息,如果不加-a只会显示当前运行中的容器

# 如果想要进入容器中,那么需要执行以下命令

[root@Jack ~]# docker ps # 先获得容器的id

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

1f928073b7eb redis "docker-entrypoint.sh" 45 seconds ago Up 44 seconds 0.0.0.0:6379->6379/tcp desperate_khorana

[root@Jack ~]# docker exec -it 1f928073b7eb /bin/bash # 然后再执行该命令进入到容器中

root@1f928073b7eb:/data# touch hello_docker.txt # 在容器中创建一个文件

root@1f928073b7eb:/data# exit # 退出

exit

[root@Jack ~]#

# 也可以在启动时直接进入 命令如下

[root@Jack ~]# docker run -d -it -p 6379:6379 redis /bin/bash复制代码

我们对Container做出了修改,如果想要保留这个修改,可以通过commit命令来生成一个新的Image。

# -m为描述信息 -a为作者 1f9是你要保存的容器id 取前3个字符 docker可以自行识别

# sylvanassun/redis为镜像名 :test 为一个tag 一般用于标识版本

[root@Jack ~]# docker commit -m "test" -a "SylvanasSun" 1f9 sylvanassun/redis:test

sha256:e7073e8e5bd70b8d58092fd6bd8c2551e65dd29241c235eddf2a7f4b4b25cbbd

[root@Jack ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

sylvanassun/redis test e7073e8e5bd7 2 seconds ago 106.6 MB

docker.io/Python 3.6-onbuild 7195f9298ffb 2 weeks ago 691.1 MB

docker.io/mongo latest d22888af0ce0 2 weeks ago 360.9 MB

docker.io/redis latest 8f2e175b3bd1 2 weeks ago 106.6 MB复制代码

想删除一个容器或镜像也很简单,但在删除镜像前需要先删除依赖于它的容器。

[root@Jack ~]# docker stop 1f9 # 关闭运行中的容器,相应的也有docker start id命令来启动一个容器

1f9

[root@Jack ~]# docker rm 1f9 # 删除容器

1f9

[root@Jack ~]# docker rmi e70 # 删除上面保存的镜像

Untagged: sylvanassun/redis:test

Deleted: sha256:e7073e8e5bd70b8d58092fd6bd8c2551e65dd29241c235eddf2a7f4b4b25cbbd

Deleted: sha256:751db4a870e5f703082b31c1614a19c86e0c967334a61f5d22b2511072aef56d复制代码

如果想要自己构建一个镜像,那么需要编写Dockerfile文件,该文件描述了镜像的依赖环境以及如何配置你的应用环境。

# 使用python:2.7-slim 作为父镜像

FROM python:2.7-slim

# 跳转到/app 其实就是cd命令

WORKDIR /app

# 将当前目录的内容(.)复制到镜像的/app目录下

ADD . /app

# RUN代表运行的shell命令,下面这条命令是根据requirements.txt安装python应用的依赖包

RUN pip install --trusted-host pypi.python.org -r requirements.txt

# 暴露80端口让外界访问

EXPOSE 80

# 定义环境变量

ENV NAME World

# 当容器启动时执行的命令,它与RUN不同,只在容器启动时执行一次

CMD ["python", "app.py"]复制代码

然后就可以通过docker build -t xxx/xxxx .命令来构建镜像,-t后面是镜像名与tag等信息,注意.表示在当前目录下寻找Dockerfile文件。

学会如何构建自己的镜像之后,你是否也想将它发布到Docker Hub上与他人分享呢?要想做到这一点,需要先注册一个Docker Hub账号,之后通过docker login命令登录,然后再docker push image name,就像在使用git一样简单。

关于Docker的更多命令与使用方法,请参考Docker Documentation | Docker Documentation,另外我还推荐使用Docker Compose来构建镜像,它可以很方便地组合管理多个镜像。

Docker提供了非常强大的自动化部署方式与灵活性,对多个应用程序之间做到了解耦,提供了开发上的敏捷性、可控性以及可移植性。同时,Docker也在不断地帮助越来越多的企业实现了向云端迁移、向微服务转型以及向devops模式的实践。

如今,微服务与DevOps火爆程度日益渐高,你又有何理由选择拒绝Docker呢?让我们一起选择拥抱Docker,拥抱未来!

--结束END--

本文标题: Docker是什么,有什么用?一看就明白

本文链接: https://lsjlt.com/news/234344.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Docker是什么,有什么用?一看就明白
    Docker是一个基于轻量级虚拟化技术的容器,整个项目基于Go语言开发,并采用了Apache 2.0协议。Docker可以将我们的应用程序打包封装到一个容器中,该容器包含了应用程序的代码、运行环境、依赖库、配置文件等必需的资源,通过容器就可...
    99+
    2023-06-03
  • Redis是什么?看这一篇就够了
    本文由葡萄城技术团队编撰并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 引言 在Web应用发展的初期,那时关系型数据库受到了较为广泛的关注和应用,原因是因为那时候Web站点基本上访问和...
    99+
    2020-08-08
    Redis是什么?看这一篇就够了
  • 分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
    在分布式的应用中,为了防止单点故障,保障高可用,通常会采用主从结构,当主节点挂掉后,从节点可以代替主节点提供服务。 Redis通过复制 + sentinel哨兵来实现主从模式。 Zo...
    99+
    2024-04-02
  • Docker有什么作用
    小编给大家分享一下Docker有什么作用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!讲个故事为了更好的理解 Docker 是什么,我们先来讲个故事:我需要盖一个...
    99+
    2023-06-15
  • 比赛条件。不明白为什么
    大家好,今天本人给大家带来文章《比赛条件。不明白为什么》,文中内容主要涉及到,如果你对Golang方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢!问题内容当我运行代码时会发...
    99+
    2024-04-04
  • 入职后,我才明白什么叫Cache
    前言 事情其实是这样的,当时领导交给我一个perf硬件性能监视的任务,在使用perf的过程中,输入命令perf list,我看到了以下信息:我的任务就要让这些cache事件能够正常计数,但关键是,我根本不知道这些misses、loads是什...
    99+
    2023-07-31
  • AcceptSocket == SOCKET_ERROR这句不明白什么意思
    `AcceptSocket == SOCKET_ERROR` 是一个条件语句,用于判断一个接收套接字(AcceptSocket)是否...
    99+
    2023-08-08
    意思
  • Docker的Flocker有什么用
    本篇内容介绍了“Docker的Flocker有什么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Flocker 同时也提供了 API 和命...
    99+
    2023-06-27
  • 什么是Docker Volume?
    摘要:Docker Volume,通常翻译为数据卷,用于保存持久化数据。当我们将数据库例如MySQL运行在Docker容器中时,一般将数据通过Docker Volume保存在主机上,这样即使删除MySQL容...
    99+
    2024-04-02
  • Docker Volume是什么
    本篇内容主要讲解“Docker Volume是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Docker Volume是什么”吧!一:简介Docker镜像是由多个文件系统(只读层)叠加而成....
    99+
    2023-06-04
  • 什么叫 SSH ?原理详解,看这一篇就够了!
    SSH(Secure Shell,安全外壳)是一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务。传统远程登录或文件传输方式,例如Telnet、FTP,使用明文传输数据,存在很多的安全隐患。随着人们对网络安全的重视,这些方式...
    99+
    2023-08-03
  • ubuntu中docker-compose有什么用
    Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它使用一个 YAML 文件来配置应用程序的服...
    99+
    2024-03-05
    ubuntu
  • led灯亮一会就灭了是什么原因
    led灯亮一会就灭了 的原因有:1、电源电压不稳定或过高;2、长时间工作或环境温度过高;3、LED灯中的灯泡或电源驱动器可能存在故障;4、电路连接问题。本教程操作系统:Windows10系统、Dell G3电脑。LED灯亮一会就灭了可能有以...
    99+
    2023-08-15
  • docker command的用法是什么
    Docker是一种容器化平台,可以用来轻松创建、部署和运行应用程序。Docker命令用于与Docker引擎进行交互,并管理容器和镜像...
    99+
    2023-10-19
    docker
  • 十一条Docker守则分别是什么
    十一条Docker守则分别是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。很多人最终还是决定使用 Docker 解决问题。 Docker 的优点很多,比如:一体化——将...
    99+
    2023-06-19
  • 什么是Docker容器
    本篇内容主要讲解“什么是Docker容器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是Docker容器”吧!容器技术的起源假设你们公司正在秘密研发下一个“...
    99+
    2024-04-02
  • Docker的DockerFly是什么
    本篇内容主要讲解“Docker的DockerFly是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Docker的DockerFly是什么”吧!Dockerfly是基于 Docker1.12+...
    99+
    2023-06-27
  • Docker中Prometheus是什么
    这篇文章主要介绍了Docker中Prometheus是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一:Prometheus是什么 Prometheus是一个开源的系统监...
    99+
    2023-06-04
  • Kubernetes和Docker是什么
    小编给大家分享一下Kubernetes和Docker是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是Docker虽然,我们一直在谈论容器,探讨基于容器的...
    99+
    2023-06-04
  • react白屏原因是什么
    本教程操作环境:Windows10系统、react18.0.0版、Dell G3电脑。react白屏原因是什么?react history模式下的白屏问题近期,再用react的时候,由于不想用丑陋的hash,便将路由模式切换成history...
    99+
    2023-05-14
    React
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作