Docker 新手心得

本贴最后更新于 1829 天前,其中的信息可能已经时移世改

说实话,我之前对于 Docker 的印象并不算太好,觉得这又是一个赶时髦的技术,过不了多久热度就会过去的。不过这学期选了一门企业级服务器导论的课中讲到了关于 Docker 的内容,而且现在 Solo 也大力推荐使用 Docker 进行部署,让我感觉不了解一点关于它的知识好像不太合适。于是就学习了一些相关的内容,并做了一些简单的实践。

首先,我一开始只知道 Docker 是把不同的软件隔离在不同的容器中运行,但是并不知道这样的意义何在。我觉得从我们个人计算机的使用角度来看,不同的软件在操作系统中同时运行并没有什么问题啊,就算是我在阿里云(算是服务器了)里面部署的网站,也是一堆软件直接装在一个操作系统上,运行也非常正常,为啥还要专门装到 Docker 里面隔离开来,简直就是莫名其妙嘛。之后在企业级服务器上老师讲了企业级应用的部署发展史,才终于明白 Docker 的意义。课上老师说到最早的时候企业级应用在服务器中的部署和个人计算机中应用的运行差不多,都是一大堆软件同时运行在一个操作系统上。但是后来有人发现这样非常不安全,一但黑客攻破了其中一个软件,他就有可能从这个软件出发获取到整个操作系统的权限,从而控制服务器上的所有软件。而且全部运行在一个操作系统上对于资源的分配也很成问题,有可能一个无关紧要的程序占用了过多的资源,导致另一个重要的程序没法运行了。另外,一个程序崩溃了可能导致整个电脑死机,从而影响到其他程序。于是就出现了虚拟化技术,VMware 就是最典型的例子,它能够实现在一台电脑上同时运行多个虚拟的操作系统,一个操作系统只运行一个程序,这样就大大提高了安全性,就算攻破一个软件也只能获取到那一个虚拟操作系统的权限,而且可以非常方便地管理不同的操作系统分配到的资源大小,就算一个虚拟机死机了也不影响其他虚拟机。但是这个技术也存在一个问题,就是为了运行一个程序需要安装一整个操作系统,而操作系统本身也会占用不少资源,这样就造成了资源的大量浪费。于是就又出现了 Docker 这种技术,也就是容器化的技术。我对 Docker 的理解还不全,尝试说一下,如果有问题欢迎大家指出。Docker 本身充当了应用程序的运行环境,在 Docker 之上运行了各个容器,这些容器相互之间应用了特殊的机制实现了高级别的隔离,就算一个容器崩溃了也不会影响到其他容器。同时因为不需要运行一个个完整的操作系统,因此它和虚拟机相比节省了大量的资源。另外,Docker 安装应用是通过一种特殊的方式即镜像安装,能够做到开箱即用,不需要关注各种乱七八糟的配置,也就是说只要在开发机的 Docker 中能成功运行的镜像,换到另一台机器的 Docker 中就一定能成功运行,而不会因为 jdk 版本或者数据库版本等依赖问题导致无法运行。这个概念有点类似 Java 虚拟机的广告,即“一次编译,到处运行”,但它比 Java 虚拟机做到了更高的层面,任何语言开发的应用只要打包成 Docker 镜像就能到处运行。

下面讲一下如何安装 Docker 并且部署一个 nginx 程序。

先说 Windows 系统。如果使用的是 Win10 以前的版本或者 Win10 家庭版等不支持 Hyper-V 的版本,那么需要通过 Docker Toolbox 来使用 Docker,下载地址:https://github.com/docker/toolbox/releases 。如果是 Win10 专业版及以上版本,那么直接下载 Docker Desktop 即可,下载地址:https://hub.docker.com/?overlay=onboarding 。下载安装完成之后桌面会出现 Docker 的图标,双击即可,这里双击了之后并不会有弹出窗口,但是在右下角托盘图标里面会有一个 Docker is starting 的图标出现。等到图标的提示变成 Docker is running 就代表启动完成了。不过 Windows 环境下的 docker 不太靠谱,很可能卡在 starting 就不动了。

再来说说 Linux 系统。通过 yum install docker 命令就可以直接安装 Docker,非常方便。安装完成后输入 service docker start 就可以让 Docker 运行起来。

安装完成之后可以尝试部署一个 nginx 上去。打开控制台输入 docker run -d --name mynginx -p 80:80 nginx 。这里面的参数的意思分别是:run 代表运行;-d 代表后台运行,即不输出交互信息;--name 代表新建容器的名字,mynginx 就是自己取的容器名;-p 代表容器和本机端口的映射,其中前一个 80 是本机的 80 端口,后一个 80 是容器的;最后面的 nginx 代表 Docker 中央镜像库中的 nginx 镜像。其实本来正规的方法是要先用 docker pull nginx 命令先把镜像拉到本地再 run 的,不过直接 run 它也会自动去拉下来。如果是本机部署的,打开浏览器输入 127.0.0.1 就可以看到 nginx 的初始化页面,如果是云服务器部署的话输入 IP 地址或域名就行。

  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    491 引用 • 917 回帖
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    311 引用 • 546 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • T0UGH

    有道理,新年快乐 😄

推荐标签 标签

  • OnlyOffice
    4 引用 • 2 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    6 引用 • 63 回帖
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 431 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    5 引用 • 26 回帖 • 529 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 22 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 462 关注
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    98 引用 • 344 回帖
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    407 引用 • 1246 回帖 • 582 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    6 引用 • 15 回帖 • 113 关注
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    351 引用 • 1814 回帖
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    25 引用 • 191 回帖 • 16 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    69 引用 • 373 回帖
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 536 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    110 引用 • 54 回帖
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 672 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 210 关注
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 154 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 709 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    58 引用 • 22 回帖 • 1 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    77 引用 • 390 回帖
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    36 引用 • 37 回帖 • 529 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖 • 8 关注
  • 电影

    这是一个不能说的秘密。

    120 引用 • 599 回帖