八个Docker的真实应用场景,使用虚拟机的时候

作者: 操作系统  发布:2019-11-06

Docker介绍

Docker是指容器化技术,用于支持创建和实验Linux Container。借助Docker,你可以将容器当做重量轻、模块化的虚拟机来使用,同时,你还将获得高度的灵活性,从而实现对容器的高效创建、部署和复制,并能将其从一个环境顺利迁移至另外一个环境。

Docker官方网站:

Github Docker 源码:

基础特性

  • 基于C/S架构应用程序
  • 模块化
  • 层与镜像版本控制
  • 支持回滚
  • 快速部署

Docker的应用场景

  • Web 应用的自动化打包和发布。
  • 自动化测试和持续集成、发布。
  • 在服务型环境中部署和调整数据库或其他的后台应用。
  • 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

Docker基础架构图

9159金沙官网 1

  • Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器
  • Docker 容器通过 Docker 镜像来创建
  • DOCKER_HOST:真正运行容器的主机
  • Containers:容器,独立运行的一个或一组应用
  • Images:镜像,用于创建 Docker 容器的模板
  • Registry:镜像仓库

镜像image与容器Container区别

  • 镜像是静态的,不会运行
  • 容器则是动态的,有生命周期

Docker容器镜像站:

Docker object

  • image
  • containers
  • networks
  • volumes
  • plugins

add by zhj:

Vagrant(官网、github)是一款构建虚拟开发环境的工具,支持 Window,Linux,Mac OS,Vagrant 中的 Boxes 概念类似于 Docker(实质是不同的),你可以把它看作是一个箱子,里面装了一些东西,Vagrant 创建虚拟机的时候,需要用到 Box ,它里面包含了虚拟机配置、虚拟机硬盘镜像和 Vagrant 配置的压缩包,有了 Box,你不需要再重新下载 ISO 镜像文件、新建虚拟机、修改虚拟机等配置,而是直接运行你所需要的操作系统。

开发需要在各种系统上进行开发任务,运维则需要在各种系统上学习工具使用。因此,虚拟机恐怕也是 IT 人员最常使用的工具之一了。最常用的虚拟化工具有 VMware Workstation 和 VirtualBox 等等,虽然底层的实现各有不同,但具体的使用方法则非常相近:打开工具,为虚拟机创建一块存储空间,配置一下性能参数,在界面中安装系统,接下来就可以使用了。很多时候,为了满足虚拟机重复使用的需要,各种虚拟机工具中还会带有“模版”功能和“快照”功能,前者可以方便地让用户创建出标准的虚拟机,后者可以让用户快速的回复到以前的状态。

Docker的安装

      可以简单的认为docker是对LXC(Linux Container)封装,它提供一种比LXC高级的API。Docker使用Go语言开发,利用了Linux提供的LXC,AUFS,namespace和cgroup技术。实现了文件系统,资源和网络的隔离,最终目标是实现类似PaaS平台的应用隔离。最大的优势在于相比重量级虚拟机如KVM、Xen、VMWare、VirtualBox而言启动快,占有资源小,迁移也非常方便。docker目前只运行在Linux上,不过这个Linux可以是上面说的重量级虚拟机,也可以是直接基于裸机的Linux。按docker公司高级软件工程师 Jerome Petazzoni的说法:“重量级” 的虚拟化包括KVM、Xen、VMWare、VirtualBox以及其他的虚拟化系统。“轻量级”指的就是OpenVZ、VServer、(LXC)containers,zones等等。我认为,“重量级”的虚拟化推动IaaS(就是我们经常说道的“云”)的发展,而“轻量级“虚拟化则推动PaaS的发展,这些有利于更广泛地进行“云”部署。docker使用场景参见:八个Docker的真实应用场景 和 Docker 的应用场景在哪里?

更多 Vagrant 概念,参考:Vagrant 是什么,不是什么。

虚拟化为 IT 人员提供了极大的便利。但是,人们很快便不满足此了。具体说来,使用虚拟机的时候,用户往往会遇到下面的问题:

直接在CentOS上安装Docker

首先安装之前先卸载之前的旧版本:

$ sudo yum remove docker 
                  docker-client 
                  docker-client-latest 
                  docker-common 
                  docker-latest 
                  docker-latest-logrotate 
                  docker-logrotate 
                  docker-selinux 
                  docker-engine-selinux 
                  docker-engine

安装docker依赖包:

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

添加docker源(如果Docker官方下载的速度太慢也可以使用阿里的镜像源:

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

安装docker:

$ sudo yum install docker-ce

安装完直接启动docker即可:

~]# systemctl start docker

使用docker version 可以看到我们安装docker的版本

~]# docker version 
Client:
 Version:      18.03.1-ce
 API version:  1.37
 Go version:   go1.9.5
 Git commit:   9ee9f40
 Built:        Thu Apr 26 07:20:16 2018
 OS/Arch:      linux/amd64
 Experimental: false
 Orchestrator: swarm

Server:
 Engine:
  Version:      18.03.1-ce
  API version:  1.37 (minimum version 1.12)
  Go version:   go1.9.5
  Git commit:   9ee9f40
  Built:        Thu Apr 26 07:23:58 2018
  OS/Arch:      linux/amd64
  Experimental: false

      另外,美团网技术团队的Docker系列之一:入门介绍 也不错。

Vagrant 支撑 VirtualBox、HyperV、VMWare 等虚拟机软件,我 Mac 电脑装的是 VMWare Fusion,但 Vagrant 支持是收费的(79 美元),好黑呀,不过 VirtualBox 是免费的,我又安装了个 VirtualBox(大概 300 M),以便做示例。

  • 虚拟化工具学习成本:有的时候,配置虚拟机的步骤比较繁琐,普通用户上手可能比较困难。
  • 环境无法共享:一个人创建的环境和另一个人创建的环境很难完全一致,在 Alice 的虚拟机中跑的好好的代码,到了 Bob 的机器上可能怎么也运行不起来。
  • 虚拟化平台不统一:不同用户、不同场景使用的平台可能不一样,在不改变工作流程的前提下,很难跨跃多个平台来进行虚拟化管理和资源使用。

使用Vagrant + Virtual Box快速搭建Docker环境

Vagrant介绍
Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境。它 使用Oracle的开源VirtualBox虚拟化系统,使用 Chef创建自动化虚拟环境。我们可以使用它来干如下这些事:

  • 建立和删除虚拟机
  • 配置虚拟机运行参数
  • 管理虚拟机运行状态
  • 自动配置和安装开发环境
  • 打包和分发虚拟机运行环境

Vagrant的运行,需要依赖某项具体的虚拟化技术,最常见的有VirtualBox以及VMWare两款,早期,Vagrant只支持VirtualBox,后来才加入了VMWare的支持。

Vagrant安装和使用

Vagrant是基于其他虚拟化产品来创建虚拟机的,这里我们选择开源产品Virtual Box,我们先安装Virtual Box和Vagrant:

  • Virtual Box下载地址:
  • Vagrant下载地址:

下载好之后先使用vagrant init centos/7生成默认的Vagrntfile,然后使用vagrant up即可自动创建虚拟机,我们为了配置Docker环境需要更改下Vagrantfile,在创建虚拟机的时候自动安装docker环境(配置config.vm.provision "shell"选项)并且按照自己的要求配置虚拟机的规模和网络。

我的Vagrantfile配置如下

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.require_version ">= 1.6.0"

boxes = [
    {
        :name => "docker-1",
    :eth1 => "172.16.56.11",
        :mem => "1024",
        :cpu => "1"
    }
]

Vagrant.configure(2) do |config|

  config.vm.box = "centos/7"
  boxes.each do |opts|
    config.vm.define opts[:name] do |config|
      config.vm.hostname = opts[:name]
      config.vm.provider "vmware_fusion" do |v|
        v.vmx["memsize"] = opts[:mem]
        v.vmx["numvcpus"] = opts[:cpu]
      end
      config.vm.provider "virtualbox" do |v|
        v.customize ["modifyvm", :id, "--memory", opts[:mem]]
        v.customize ["modifyvm", :id, "--cpus", opts[:cpu]]
      end
      config.vm.network :public_network, ip: opts[:eth1]
    end
  end

#  config.vm.synced_folder "../sync", "/home/vagrant/sync"

  config.vm.provision "shell", inline: <<-SHELL
      yum -y install wget
      wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
      yum makecache
      yum install -y yum-utils device-mapper-persistent-data lvm2
      yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
      yum makecache fast
      yum -y install docker-ce
      sudo systemctl start docker
  SHELL
end

之后使用vagrant up创建即可

λ vagrant up
Bringing machine 'docker-1' up with 'virtualbox' provider...
==> docker-1: Importing base box 'centos/7'...

 [KProgress: 20%
 [KProgress: 40%
 [KProgress: 90%
 [K==> docker-1: Matching MAC address for NAT networking...
==> docker-1: Checking if box 'centos/7' is up to date...
==> docker-1: Setting the name of the VM: docker-1_docker-1_1534247086153_83300
==> docker-1: Clearing any previously set network interfaces...
==> docker-1: Preparing network interfaces based on configuration...
    docker-1: Adapter 1: nat
    docker-1: Adapter 2: bridged
==> docker-1: Forwarding ports...
    docker-1: 22 (guest) => 2222 (host) (adapter 1)
==> docker-1: Running 'pre-boot' VM customizations...
==> docker-1: Booting VM...
==> docker-1: Waiting for machine to boot. This may take a few minutes...
    docker-1: SSH address: 127.0.0.1:2222
    docker-1: SSH username: vagrant
    docker-1: SSH auth method: private key
    docker-1: 
    docker-1: Vagrant insecure key detected. Vagrant will automatically replace
    docker-1: this with a newly generated keypair for better security.
    docker-1: 
    docker-1: Inserting generated public key within guest...
==> docker-1: Machine booted and ready!
==> docker-1: Checking for guest additions in VM...

...

在这个过程中Vagrant会帮我们创建好一台Centos 7的虚拟机并安装好Docker环境,使用vagrant ssh直接登陆虚拟机

λ vagrant ssh
Last login: Wed Aug 15 15:54:32 2018 from 10.0.2.2
[vagrant@docker-1 ~]$ sudo docker version
Client:
 Version:           18.06.0-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        0ffa825
 Built:             Wed Jul 18 19:08:18 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.0-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       0ffa825
  Built:            Wed Jul 18 19:10:42 2018
  OS/Arch:          linux/amd64
  Experimental:     false
[vagrant@docker-1 ~]$

Vagrantfile中有一项config.vm.synced_folder可以配置本地文件夹同步到虚拟机,挂载本地文件夹到虚拟机中需要VBoxAdditions的支持,这个可以在虚拟机起来之后在安装,也可以参考vagrant-vbguest这个插件的使用,这个功能比较适合开发人员,可以在本地编写代码而在Linux环境中调试代码运行。

Docker和vagrant都是最近才开始了解学习的,有什么错误或者不对的地方还请大家指正,有什么不懂的也可以一起交流。

 

使用 Vagrant 的目的,就是方便在虚拟机中做 Consul 的集群(Mac OS、Ubuntu 安装及使用 Consul)。

后来,上面的问题终于有了解决的方法:Vagrant

 

安装 Vagrant(使用 homebrew)

Vagrant 是一套用 Ruby 编写的工具,它为用户提供了一种标准化、可定义、可分享的虚拟化平台使用模式。使用 Vagrant,用户可以使用文本文件来“定义”一个虚拟机,快速创建出自己想要的环境,还可以将其分享给其他人;此外,Vagrant 还支持多款虚拟化平台,VMware、Virtualbox、AWS 甚至是 Docker 都可以,用户再也不需要为对接多个虚拟化平台而犯愁了。

9159金沙官网 2

$ brew install vagrant

本文便旨在向读者介绍性感的 Vagrant,带领读者进行 Vagrant 快速上手。这个过程中还会用其搭建一台 ELK 服务器,来展示 Vagrant 的便捷和强大。

几个月以前,红帽(Red Hat)宣布了在 Docker 技术上和 dotCloud 建立合作关系。在那时候,我并没有时间去学习关于 Docker 的知识,所以在今天,趁着这个 30 天的挑战,我决定去学习一下 Docker 究竟是怎样的。这篇博文并不是说以后怎么在 OpenShift 上用 Docker 的。请阅读由 Mike McGrath 撰写的 "关于 OpenShift 和 Docker 的技术思考"。也可以看看这个 Stackoverflow 的问题,了解一下 Docker 和 OpenShift 的差别。

安装好 Vagrant 之后,就可以使用初始化 Box 了,你可以使用别人封装好的 Box,也可以自己封装 Box,比如下面命令:

部分操作步骤和脚本来自官方文档,下文不会单独指出。

什么是 Docker?

Docker 提供了一个可以运行你的应用程序的封套(envelope),或者说容器。它原本是 dotCloud 启动的一个业余项目,并在前些时候开源了。它吸引了大量的关注和讨论,导致 dotCloud 把它重命名到 Docker Inc。它最初是用 Go 语言编写的,它就相当于是加在 LXC(LinuX Containers,linux 容器)上的管道,允许开发者在更高层次的概念上工作。

Docker 扩展了 Linux 容器(Linux Containers),或着说 LXC,通过一个高层次的 API 为进程单独提供了一个轻量级的虚拟环境。Docker 利用了 LXC, cgroups 和 Linux 自己的内核。和传统的虚拟机不同的是,一个 Docker 容器并不包含一个单独的操作系统,而是基于已有的基础设施中操作系统提供的功能来运行的。这里有一个 Stackoverflow 的答案,里面非常详细清晰地描述了所有 Docker 不同于纯粹的 LXC 的功能特性

Docker 会像一个可移植的容器引擎那样工作。它把应用程序及所有程序的依赖环境打包到一个虚拟容器中,这个虚拟容器可以运行在任何一种 Linux 服务器上。这大大地提高了程序运行的灵活性和可移植性,无论需不需要许可、是在公共云还是私密云、是不是裸机环境等等。

Docker 由下面这些组成:

  1. Docker 服务器守护程序(server daemon),用于管理所有的容器。
  2. Docker 命令行客户端,用于控制服务器守护程序。
  3. Docker 镜像:查找和浏览 docker 容器镜像。它也访问这里得到:
$ vagrant box add ubuntu/trusty64

笔者使用的环境为 macOS Sierra 10.12.3 ,Vagrant 1.9.1 以及 VirtualBox 5.1.14。

我为什么要关心这些?

Docker 之所以有用,是因为把代码从一个机器迁移到另一个机器经常是困难的。它尝试去使得软件迁移的过程变得更加可信和自动化。Docker 容器可以移植到所有支持运行 Docker 的操作系统上。

可以看这篇文章了解更多:how the Fedora Project is embracing Docker

ubuntu/trusty64是一个公开 Boxes(更多 Boxes)。运行上面第一行命令后,Vagrant 会在工作目录下创建 Vagrantfile 配置文件。在线下载 Box 会比较慢,你可以先下载 Box 之后,再加载本地的 Box 进行初始化。

1. 前期准备和安装

Vagrant 将其支持的各种虚拟化平台称为 “Provider”。我们在本次的快速上手中选择了 VirtualBox 作为后端虚拟化平台。因此,您首先需要安装最新版本的 VirtualBox 来搭配 Vagrant。请访问这里下载最新版的 VirtualBox。

安装 Vagrant 的方法也很简单,在此处下载安装即可。需要注意的是,如果您使用的是 macOS 或 Linux,您可能希望使用 Brew 或者 YUM 等软件管理器来安装,然而官方并不推荐这样做:在第三方软件管理器的软件仓库中,Vagrant 可能版本较低,或者缺少依赖包。因此还是建议用户直接在官方网站上下载安装。

在安装之后,用户的家目录下会多出一个给 Vagrant 使用的隐藏文件夹 .vagrant.d。这里将保存 Vagrant 所需的所有基础配置。如果将其删除,再次运行 Vagrant 时,Vagrant 会认为这是一次全新安装,然后再次将该文件夹创建出来。

但是我已经在使用虚拟机(VMs)了

到现在为止,要把程序可靠地移植的唯一选择是虚拟机(Virtual Machines,VMs)。虚拟机现在已经很常见了,但虚拟机是非常低级,它提供的是完整的操作系统环境。虚拟机的问题是,迁移的时候太大了。它们包含了大量类似硬件驱动、虚拟处理器、网络接口等等并不需要的信息。 虚拟机也需要比较长时间的启动,同时也会消耗大量的内存、CPU 资源。

Docker 相比起来就非常轻量级了。运行起来就和一个常规程序差不多。这个容器不仅仅运行快,创建一个镜像和制作文件系统快照也很快。它可以在 EC2, RackSpace VMs 那样的虚拟环境中运行。事实上,在 Mac 和 Windows 系统上使用 Docker 的更好方式是使用 Vagrant。Docker 的初衷其实是发挥类似 VM 的作用,但它启动得更快和需要更少的资源。

我使用的是 Ubuntu 64 Box:,其他 Box 下载地址:

2. 创建项目文件夹和 Vagrantfile

接下来我们就可以为创建虚拟机做准备了。首先,我们要为虚拟机创建一个主目录,用来存放与该服务器相关的文件等;然后在这个文件夹中创建 Vagrant 的主配置文件:Vagrantfile。

Vagrantfile 是用来描述虚拟机状态的主文件,其中包括虚拟机镜像、机器配置、网络配置、以及初始化脚本等。通过使用 vagrant init 命令,我们便可以创建出一份标准的 Vagrantfile。

$ mkdir vagrant_getting_started
$ cd vagrant_getting_started
$ vagrant init

这样一来,我们便创建出 Vagrantfile 这个文件了。

它就像 Vagrant 一样吗?

我遇到的一个疑问是,我应该用 Vagrant 还是 Docker 去为我的下一个项目创建沙箱环境?答案再一次是一样的。

Docker 比起 Vagrant 来说,运行起来会更加省资源。Vagrant 提供的环境其实是基于 Virtual Box 提供的虚拟机。可以阅读 Stackoverflow 的这个回答了解更多。

下载好 Box 之后,你可以创建这样的工作目录:

3. 获取虚拟机模版:Box

有了虚拟机的配置文件还不够,我们要告诉 Vagrant 使用哪一个虚拟机模版。以前我们会自己从头创建虚拟机,然后自己制作成模版;而在 Vagrant 的世界,模版名称叫做 “Box”。此外,Vagrant 还有一个专门的模版仓库,提供一些权威机构或用户创建的模版供用户下载。

让我们用 Vagrant 下载一份 CentOS 7.3 的 Box。这里我们选用了 Bento 项目提供的镜像。这个项目由 Chef 公司发起,旨在为 Vagrant 制作各种操作系统的标准 Box。

$ vagrant box add bento/centos-7.3

首次下载时间较长。在国内,速度可能会比较慢。如果有搭梯子的方法,建议各位在 Shell 中使用 HTTP 代理下载。

下载完成之后,这份 CentOS 7.3 的 Box 会被保存在 ~/.vagrant.d/boxes/bento-VAGRANTSLASH-centos-7.3中。再继续往下寻找,会找到.vmdk格式的虚拟机文件。这就是我们需要的虚拟机模版了。

Vagrant Box 的命名规则为“用户名/项目名”,比如 bento/centos-7.3,和 Github 的风格很像。

打开我们创建的“Vagrantfile”文件,告诉 Vagrant 我们要使用刚刚下载的 bento/centos-7.3

Vagrant.configure("2") do |config|
  config.vm.box = "bento/centos-7.3"
end

如果我们在这里填了一个没有预先下载好的 Box 名称,Vagrant 会先去官方的 Box 库将其下载下来,保存在上面提到的目录中。

Box 还支持版本标记,如果我们希望使用某一个 Box 的特定版本,我们也可以在 Vagrantfile 中指定。例如:

Vagrant.configure("2") do |config|
  config.vm.box = "bento/centos-7.3"
  config.vm.box_version = "2.3.1"
end

噢,不是!另一个应用程序打包系统

当第一次读到 Docker 打包应用程序时,我困惑了。我们为什么需要再多一个应用打包系统(packaging system)?我早已经把我的 Java 程序打包成 JAR 或 WAR 了。在花了些时间阅读了关于 Docker 的资料后,我明白了 Docker 应用包(application package)的含义。Docker 就是虚拟机和你的像 WAR 或 JAR 那样的应用包之间的桥梁。一方面来说,虚拟机是非常重量级的(耗资源),因为移植时要附带些不需要的东西。另一方面来说,应用代码包(the application code packages)是非常的轻量的,并没有附带足够可靠地运行起来的信息。Docker 很好地平衡了这两方面。

在 Docker 中,应用程序包(application package)意味着一个包含了应用程序代码和所需部署环境的包。例如,在 Java 中我们一般把我们的 Web 应用程序打包在一个 WAR 文件中。这个 WAR 文件是一个非常简约的软件包,它仅仅包含了应用程序的代码。但应用程序需要特定部署的环境去高效地运行起来。有时候部署的环境和开发时的环境是不同的。例如开发者使用 Java 7 开发程序,但部署时的环境是在 OpenJDK Java 6 中;又或者是在 Mac 上开发的,但在 RHEL 上部署。情况也有可能是:有一些系统库(system libraries)在开发环境和模拟环境(staging environment)中,在不同的应用程序上有不同的效果。Docker 通过不仅仅打包应用程序,也打包应用程序的依赖环境来解决这个问题。

$ tree
.
├── boxes
│   └── precise64.box
└── works

2 directories, 1 files

4. 启动虚拟机以及使用 SSH 连接

接下来我们便可以启动虚拟机了。

$ vagrant up

这个过程中完全不需要打开 VirtualBox,Vagrant 会自己去调用 VirtualBox,完成所有创建的工作。

创建完成之后,我们可以通过 Vagrant 提供的 SSH 直接连接到服务器中,Vagrant 已帮我们配置好端口映射和密钥,非常方便。

$ vagrant ssh

按照平时的方式退出 SSH 便可退回到原来的 Shell。

如果希望将这台服务器关机,可以执行:

$ vagrant halt

在现在的这个目录下再次执行 vagrant up 即可将其重新开启。

如果希望删除这台虚拟机,也非常方便:

$ vagrant destroy

此时,这台虚拟机便会被删除。但是,我们使用过的 Box 并不会被删除掉。它还会保存在 ~/.vagrant.d 中,以便我们再次使用。如果需要删除某一个 Box,使用 vagrant box remove 加上 Box 的名称即可。

开始使用 Docker

在 Fedora 机器上使用这篇博文中的指令安装 Docker

$ vagrant up
$ vagrant ssh

然后安装 Docker Fedora 镜像:

$ sudo docker pull mattdm/fedora

上面的命令会从  上下载 Docker Fedora 镜像。
安装了 Docker Fedora 镜像后,我们可以使用下面命令列出所有的镜像:

$ sudo docker images

REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
shekhargulati/node_image_007   latest              e12b3054d981        50 minutes ago      470.3 MB (virtual 601.8 MB)

mattdm/fedora                         12.04               8dbd9e392a96        7 months ago        131.5 MB (virtual 131.5 MB)

上面列表中第一个镜像就是我以前创建的。它打包了 NodeJS 及 Express Fremework。第二个镜像就是存储的 Docker Fedora 镜像了。

现在,我们在 Docker 容器内运行一个脚本:

$ sudo docker run -t -i -p 3000 mattdm/fedora /bin/bash

在运行完上面的命令后,我们就在 Docker 的容器里面了。我们可以通过 ls 命令列出所有的命令。

现在我们创建下面的目录结构 /home/shekhar/dev

$ mkdir -p home/shekhar/dev
$ cd home/shekhar/dev

现在,我会安装 NodeJS。运行下面的命令去在 Fedora Docker 镜像上安装 Node:

$ sudo yum install npm

接着,我们安装 Express 框架:

$ npm install express -g

Express 框架安装后,我们创建一个新的 Express 程序,然后运行它:

$ express myapp
$ cd myapp
$ npm install
$ node app.js

上面会在 30009159金沙官网 , 端口启动 NodeJS Express 程序。

现在打开另一个命令行标签,列出所有的 Docker 进程:

$ sudo docker ps
CONTAINER ID        IMAGE                                 COMMAND             CREATED             STATUS              PORTS                     NAMES
4a5715a915e5        mattdm/fedora   /bin/bash           5 minutes ago       Up 5 minutes        0.0.0.0:49157->3000/tcp   red_duck

你会注意到,3000 端口和本机上的 49157 绑定了。你可以通过下面所示的 curl 命令测试 Express 应用:

$ curl 0.0.0.0:49157
<!DOCTYPE html><html><head><title>Express</title><link rel="stylesheet" href="/stylesheets/style.css"></head><body><h1>Express</h1><p>Welcome to Express</p></body></html>

现在 commit 镜像,然后 push 到 Docker 镜像注册表(registry)。在你做这步之前,你必须通过 去注册一个 Docker 注册表。

$ sudo docker commit 4a5715a915e5 shekhargulati/node_image_007
$ sudo docker push shekhargulati/node_image_007

请使用你自己的用户名和镜像名。

所以,我的第一个镜像已经上传到 Docker 注册表上面了: 

你可以使用 pull 命令下载这个镜像:

$ docker pull shekhargulati/node_image_007

这就是今天的内容。保持反馈!


原文:Day 21: Docker--The Missing Tutorial
翻译整理:Segmentfault

 

创建命令:

5. 共享文件夹

Vagrant 提供了在宿主机和虚拟机之间的一个共享文件夹功能。如果你使用的是 VirtualBox,这个功能要求虚拟机中安装有 VirtualBox Guest Addition。我们刚刚使用的 “bento/centos-7.2” Box 中已经预装了该工具,所以可以直接使用。

宿主机方面,共享文件夹便是我们刚才使用的 Vagrantfile 所在的项目文件夹;虚拟机方面,共享文件夹的路径位于 /vagrant

注意:但如果你是在 “bento/centos-7.3” Box 中使用共享目录功能,请不要尝试升级内核。在我自己的测试过程中,更新内核会导致 VirtualBox Guest Addition 失效,导致共享文件夹无法使用。

Vagrant 还提供了其他的同步方法,包括 rsync,NFS 等等。但这些或多或少需要在宿主机上面做一些相应的配置,所以这里还是推荐使用 VirtualBox Guest Addition。

$ mkdir vagrant_projects
$ mkdir boxes
$ mkdir works

6. 网络

Vagrant 可以帮助我们配置端口映射。比如我们刚刚使用的 vagrant ssh 命令,实际上连接的也是我们宿主机的 2222 端口,只是由 Vagrant 操纵 VirtualBox 将虚拟机的 22 端口映射了过来而已。

此外,我们还可以在 Vagrantfile 中自行配置希望映射的端口,写法也非常简单:

Vagrant.configure("2") do |config|
  config.vm.box = "bento/centos-7.3"
  config.vm.network :forwarded_port, guest: 80, host: 4567
end

这样一来,如果在这个虚拟机里开启了跑在 80 端口的 HTTP 服务,便可以在宿主机的 http://127.0.0.1:4567 访问到了。

网卡也可以通过 Vagrantfile 来配置。上面的内容都是针对于使用 VirtualBox NAT 的网络选项来说的,这种配置适用于一些比较简单的场景。如果有配置 Public IP 或 Private IP 的需求,也可以写在 Vagrantfile 中:

Vagrant.configure("2") do |config|
  config.vm.box = "bento/centos-7.3"
  config.vm.network :forwarded_port, guest: 80, host: 4567
  config.vm.network "private_network", ip: "192.168.10.101"
  config.vm.network "public_network"
end

在 Vagrant 和 VirtualBox 的搭配中,Vagrant 所谓的 private_network 会自动和 VirtualBox 的 “Host-only network” 相对应,是一个仅包含了宿主机和虚拟机的网络,且需要预先在 VirtualBox 的网络配置中创建出来;而 public_network 和 “Bridged network” 相对应,在网络中和宿主机处于平等地位。

9159金沙官网 3

VirtualBox 的网络配置,图示中显示的是“Host-only network”

然后把下载好的 Box 放到 boxes 文件夹下,然后命令转到 boxes 目录下(cd boxes),然后执行添加 Box 命令:

7. 系统初始化

如果 Vagrant 仅能做到如此,对于解放生产力来说还是不够的。因此 Vagrant 内置了一套系统初始化功能,能够让用户在创建虚拟机时便将初始化工作一并完成。这套功能在 Vagrant 中被称为 “Provision”。

Provision 支持多种初始化脚本。用户可以把需要执行的 Shell 命令写在 Vagrantfile 中,也可以单独写一个 Bash 脚本。Vagrant 还支持 Ansible、CFEngine、Chef、Puppet 等众多配置管理工具。Vagrant 介绍了使用 Bash 脚本的例子,我们这里用 Ansible 来做一个范例,来展示一下如何利用 Provision 功能。

如果希望使用 Ansible,前提是宿主机上已安装好了 Ansible,macOS 下使用 Brew 或者 pip 均可,这里暂且不表。接下来,我们在这个虚拟机项目的文件夹中创建一个 Ansible Playbook,将其命名为 elk-playbook.yml

---
- hosts: all
  become: true
  tasks:
    - name: disable-ipv6
      sysctl:
        name: "net.ipv6.conf.all.disable_ipv6"
        value: 1
        sysctl_set: yes
        reload: yes
    - name: download-java-8u112
      shell: 'curl -v -j -k -L -H "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u112-b15/jdk-8u112-linux-x64.rpm > /vagrant/jdk-8u112-linux-x64.rpm'
      args:
        creates: "/vagrant/jdk-8u112-linux-x64.rpm"
    - name: install-java-with-yum
      yum:
        name: /vagrant/jdk-8u112-linux-x64.rpm
        state: present
    - name: add-elk-repo
      yum_repository:
        name: elk-5.x
        description: Elasicsearch repo files
        file: elk-5.x
        baseurl: https://artifacts.elastic.co/packages/5.x/yum
        gpgcheck: no
    - name: install-elk-packages
      yum:
        name: "{{ item }}"
        state: present
      with_items:
        - elasticsearch
        - logstash
        - kibana
        - filebeat
        - metricbeat

接下来,我们编辑 Vagrantfile,告诉 Vagrant 在创建虚拟机之后执行我们的 Playbook。

Vagrant.configure("2") do |config|
  config.vm.box = "bento/centos-7.3"
  config.vm.provision "ansible" do |ansb|
    ansb.playbook = "elk-playbook.yml"
    ansb.sudo = true
  end
end

然后我们便可以执行 vagrant up 了。在正常显示虚拟机创建过程提示后,将会显示的 Ansible 执行过程。

因为要下载的内容比较多,安装时间可能会比较长。在成功执行完成 Ansible Playbook 之后,一个完整安装了 ELK 环境的虚拟机便创建完成了!

$ vagrant box add ubuntu precise64.box

8. 全网共享

有了这些功能,Vagrant 在日常开发和学习环境中已经带给用户极大的便利了。然而这还不算完,Vagrant 还有一个不得不说的犀利功能:全网共享。

比如,你在你自己的虚拟机中运行着自己开发的网站,希望展示另一个城市的朋友。有了 Vagrant,你可以轻松地创建出一个临时的地址,朋友只要访问这个地址,便可以直接访问到你虚拟机上的网站来;不仅是网站,通过这个地址 SSH 到你的虚拟机也可以;甚至,任何一个端口,经过配置之后,都可以映射到这个公网的地址,共享给他人进行访问,称得上完全意义上的“全网全局共享”。

使用这个功能的前提是用户已经注册了 HashiCorp 的 “Atlas” 账号。HashiCorp 是发布和维护 Vagrant 工具的公司,Atlas 是这家公司的一套企业级 IT 产品,但创建账号、使用共享功能是完全免费的。

首先,我们要在 Shell 中登录 Atlas 账号。

$ vagrant login
Username or Email: colinleefish@gmail.com
Password (will be hidden):
You are now logged in!

然后就可以使用共享功能了。

$ vagrant share
...
==> default: Your Vagrant Share is running!
==> default: URL: http://frosty-weasel-0857.vagrantshare.com
...

如果你的虚拟机中的 80 端口正在提供 HTTP 服务,上面的链接便可以直接访问到你的网站。

如果你希望朋友通过 SSH 连接到你的服务器,在共享命令中加入 --ssh 参数即可。

$ vagrant share --ssh
==> default: Detecting network information for machine...
    default: Local machine address: 192.168.163.152
    default: Local HTTP port: 4567
    default: Local HTTPS port: disabled
    default: SSH Port: 22
==> default: Generating new SSH key...
    default: Please enter a password to encrypt the key:
    default: Repeat the password to confirm:
    default: Inserting generated SSH key into machine...
==> default: Checking authentication and authorization...
==> default: Creating Vagrant Share session...
    default: Share will be at: itty-bitty-polar-8667
==> default: Your Vagrant Share is running!
    default: Name: itty-bitty-polar-8667
...

将最下面的随机名字(itty-bitty-polar-8667)发给你的朋友,你的朋友在他的 Shell 中执行 vagrant connect --ssh itty-bitty-polar-8667 即可连接到你的虚拟机上来了。

$ vagrant connect --ssh itty-bitty-polar-8667
Loading share 'itty-bitty-polar-8667'...
The SSH key to connect to this share is encrypted. You will
require the password entered when creating the share to
decrypt it. Verify you have access to this password before
continuing.

Press enter to continue, or Ctrl-C to exit now.
Password for the private key:
Executing SSH...
Welcome to Ubuntu 12.04.3 LTS (GNU/Linux 3.8.0-29-generic x86_64)

 * Documentation:  https://help.ubuntu.com/
Last login: Fri Mar  7 17:44:50 2014 from 192.168.163.1
vagrant@vagrant:~$

当然,你和你的朋友能使用这个功能的前提是你们都安装了 Vagrant。

……既然 Vagrant 这么强大,有什么理由不推荐给他呢?


有关 Vagrant 的特点和使用方法,我们就先介绍到这里,希望对读者有所帮助。感谢阅读,也欢迎留言或者和我交流。

添加后之后,可以查看所添加的 Box 列表:

$ vagrant box list
ubuntu64 (virtualbox, 0)

命令转到 works 目录下(cd works)接着进行初始化虚拟机:

$ vagrant init ubuntu64

初始化完成后,会在当前目录下生成一个 VagrantFile 配置文件,里面是对虚拟机环境的一些配置(可以手动修改),然后启动虚拟机:

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: bridged
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: The guest additions on this VM do not match the installed version of
    default: VirtualBox! In most cases this is fine, but in rare cases it can
    default: prevent things such as shared folders from working properly. If you see
    default: shared folder errors, please make sure the guest additions within the
    default: virtual machine match the version of VirtualBox you have installed on
    default: your host and reload your VM.
    default: 
    default: Guest Additions Version: 4.2.0
    default: VirtualBox Version: 5.1
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => /Users/xishuai/vagrant_project/works
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: flag to force provisioning. Provisioners marked to run always will still run.

虚拟机启动好之后(可以在 VirtualBox 中查看是否已启动),就可以登录虚拟机了:

$ vagrant ssh
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic x86_64)

 * Documentation:  https://help.ubuntu.com/
New release '14.04.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.

Welcome to your Vagrant-built virtual machine.
Last login: Tue Dec 27 10:16:06 2016 from 10.0.2.2
vagrant@precise64:~$ 

这个命令就表示已经进入了 Ubuntu 的系统,可以像在虚拟机中使用一样使用它了。

当然也可以把你配好的 Box 导出出来,给其他人使用,执行命令:

$ cd ~/VirtualBox VMs/works_default_1482820841651_93029
$ vagrant package  --output works_default_1482820841651_93029 --base ubuntu64.box

Vagrant 命令列表:

  • vagrant box list:查看box列表
  • vagrant add box box 名字 box地址:添加box,自动帮你生成 Vagrantfile
  • vagrant init box 名字:初始化 Vagrantfile
  • vagrant up:启动虚拟机
  • vagrant ssh:连接虚拟机
  • vagrant halt:关闭虚拟机
  • vagrant reload:重新加载 Vagrantfile 文件
  • vagrant suspend:暂时挂起虚拟机
  • vagrant destroy:销毁虚拟机
  • vagrant status:查看虚拟机运行状态
  • vagrant package:导出 Box

在使用 Vagrant 的时候,遇到了这样一个问题:创建的 Ubuntu 虚拟机,需要访问外部网络,所以需要将虚拟机的网络模式设置为桥接模式(Bridged),于是就使用 VirtualBox 进行设置,但设置成功之后,每次 Vagrant 启动虚拟机的时候,都会进行网络模式重置,但如果用 VirtualBox 启动的话,就没有什么问题。

9159金沙官网 4

这个问题搞了好久,最后的解决方案是修改 Vagrantfile 配置文件,添加如下配置:

config.vm.network "public_network", bridge: "en0: Wi-Fi (AirPort)"
config.vm.boot_timeout = 20

boot_timeout是链接超时设置(20 秒),bridge后面表示桥接的网络模式(WiFi 网络),如果不进行设置的话,每次启动虚拟机的时候,会进行选择网络模式:

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Specific bridge 'en1: Wi-Fi (AirPort)' not found. You may be asked to specify
==> default: which network to bridge to.
==> default: Available bridged network interfaces:
1) en0: Wi-Fi (AirPort)
2) en1: Thunderbolt 1
3) en2: Thunderbolt 2
4) p2p0
5) awdl0
6) bridge0
7) vmnet1
8) vmnet8
==> default: When choosing an interface, it is usually the one that is
==> default: being used to connect to the internet.
    default: Which interface should the network bridge to?     

由于之前的 Ubuntu 版本太低(12.04),安装 .NET Core 的时候,遇到了一些问题,后来又换了一个 Ubuntu Box(版本 14.04),但配置的时候,又遇到了下面问题:

$ vagrant init ubuntu_server1
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
xishuaideMacBook-Pro:ubuntu_server1 xishuai$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'ubuntu_server1'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: ubuntu_server1_default_1482924693668_66404
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: 
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default: 
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: No guest additions were detected on the base box for this VM! Guest
    default: additions are required for forwarded ports, shared folders, host only
    default: networking, and more. If SSH fails on this machine, please install
    default: the guest additions and repackage the box to continue.
    default: 
    default: This is not an error message; everything may continue to work properly,
    default: in which case you may ignore this message.
==> default: Mounting shared folders...
    default: /vagrant => /Users/xishuai/vagrant_project/ubuntu_server1
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=1000,gid=1000 vagrant /vagrant

The error output from the command was:

mount: unknown filesystem type 'vboxsf'

解决方案(参考 Vagrant error : Failed to mount folders in Linux guest):

$ vagrant plugin install vagrant-vbguest

另外,附一些 Linux 常用命令:

  • command &:将进程放在后台执行
  • ctrl + z:暂停当前进程 并放入后台
  • jobs:查看当前后台任务
  • bg( %id):将任务转为后台执行
  • fg( %id):将任务调回前台
  • kill( %id):杀掉任务

参考资料:

  • Vagrant 安装配置
  • 用 Vagrant 管理虚拟机
  • 快速打造跨平台开发环境 vagrant + virtualbox + box
  • 开始使用 Vagrant
  • windows 下 使用 vagrant 来管理 linux 虚机开发环境
  • Vagrant PUBLIC NETWORKS

本文由9159.com发布于操作系统,转载请注明出处:八个Docker的真实应用场景,使用虚拟机的时候

关键词:

上一篇:没有了
下一篇:没有了