图片 2

入门教程,Docker的介绍和安装

By admin in 新闻公告 on 2019年11月20日

Docker介绍

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

Docker官方网站:

Github Docker 源码:

基础特性

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

Docker的应用场景

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

Docker基础架构图

图片 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:

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
的应用场景在哪里?

直接在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 + 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都是最近才开始了解学习的,有什么错误或者不对的地方还请大家指正,有什么不懂的也可以一起交流。

 

 

图片 2

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

什么是 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
    容器镜像。它也访问这里得到:

我为什么要关心这些?

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

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

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

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

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

它就像 Vagrant 一样吗?

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

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

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

当第一次读到 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
通过不仅仅打包应用程序,也打包应用程序的依赖环境来解决这个问题。

开始使用 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

上面会在 3000 端口启动 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

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 大奖888网页版登陆 版权所有