`

docker

阅读更多

几个月以前,红帽(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 容器镜像。它也访问这里得到:https://index.docker.io/

我为什么要关心这些?

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

上面的命令会从 https://index.docker.io/ 上下载 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)。在你做这步之前,你必须通过 https://index.docker.io/account/signup/ 去注册一个 Docker 注册表。

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

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

所以,我的第一个镜像已经上传到 Docker 注册表上面了: https://index.docker.io/u/shekhargulati/node_image_007/

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

$ docker pull shekhargulati/node_image_007

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

分享到:
评论

相关推荐

    centos7.6离线安装docker-ce-19.03、nvidia-docker2

    离线环境下,在centos7.6系统上安装docker-ce-19.03,nvidia-docker2.4版本,其中docker-ce-19.03在docker-local.tar压缩文件里面,nvidia-docker2在nvidia-docker2.zip文件中。 具体安装流程如下: 1.安装docker ...

    Docker基础入门到实战视频教程.rar

    Docker基础入门到实战 网盘文件永久连接 01.Docker基本概念和框架 01.Docker -课程介绍 02.Docker -Docker 简介 03.Docker -Docker 的基本组成 04.Docker -Docker 容器相关技术简 02.Docker的安装和部署 01.Docker...

    docker18.09 离线安装包

    安装docker 获取root 权限 su root 拷贝所有文件到 /opt/docker/ (如果没有 docker目录执行 mkdir -p /opt/docker) yum localinstall -y /opt/docker/*.rpm 安装docker-compose cd /opt/docker/ tar ...

    Learning.Docker.1784397938

    Optimize the power of Docker to run your applications quickly and easily About This Book Learn to compose, use, and publish the Docker containers Leverage the features of Docker to deploy your ...

    Docker超详细基础教程.pdf

    Docker 是⼀个开源的应⽤容器引擎,基于 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应⽤以及依赖包到⼀个轻量级、可移植的容器中,然后发布到任何流⾏的 Linux 机器上,也可以实 现虚拟化。 容器是...

    详解如何使用Docker部署一个web项目并打包成镜像文件

    docker基本入门以后,可以试试打包docker镜像与dockerfile了 docker镜像 docker hub仓库有2类仓库,用户仓库和顶层仓库,用户仓库由docker用户创建的,顶层仓库由docker内部的人来管理的。仓库里存放的是镜像文件,...

    Docker 如何上传本地文件到容器目录?

    docker cp 本地文件路径 ID全称:容器路径 下面来举个例子: 我要把本地电脑的mysql-connector-java-5.1.46.jar上传到Linux下Docker里面的logstash容器下的/usr/share/logstash/lib目录。 1.首先使用ssh工具上传jar...

    详解从 0 开始使用 Docker 快速搭建 Hadoop 集群环境

    Docker 本身就是基于 Linux 的,所以首先以我的一台服务器做实验。虽然最后跑 wordcount 已经由于内存不足而崩掉,但是之前的过程还是可以参考的。 连接服务器 使用 ssh 命令连接远程服务器。 ssh root@[Your IP ...

    Docker如何进入启动容器

    本文介绍了Docker如何进入启动容器,分享给大家,具体如下: 在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。 这个时候如果需要进入容器进行操作,有多种方法,包括使用官方的...

    docker容器无法访问宿主机端口的解决

    最近在工作时遇到一个问题,docker容器无法访问宿主机的redis,telent6379端口不通。 经排查发现,该服务器启用了防火墙,防火墙把6379的端口的访问授权给docker0网卡访问即可。 操作如下: firewall-cmd –...

    Docker 开启远程链接(2375端口)提供外部访问【附:Docker远程链接操作工具 for windows x64】

    Docker 开启远程链接(2375端口)提供外部访问1. 登陆Docker所在服务器,编辑docker.service文件2. 利用Docker Client远程工具进行docker操作(无需登陆服务器)2.1 下载安装Dcoker远程链接工具3.软件声明 1. 登陆...

    完美解决Windows10下无法对docker容器进行端口访问的操作

    解决Windows10下无法对docker容器进行端口访问(端口映射的问题) 在Windows10系统服务器中安装了docker和docker-compose 并尝试在其中运行Nginx服务,映射也做好 问题:在主机的浏览器中,打开localhost:port无法...

    docker-compose v2.5.0版本安装包

    内含两个文件,一个是二进制程序包,一个是install.sh安装脚本。...(你也可以自行去github上面下载最新的docker-compose的二进制包,但是这将浪费你半个小时的时间,然后还要自己安装。所以1.9元交个朋友)

    docker-ce-18.09离线安装包

    在离线环境中安装docker比较痛苦,所依赖的第三方库比较多,推荐大家在可联网的主机上将rpm包下载完成后,再打包拷贝到离线的服务器上。 这里准备了一份docker-ce-v18的离线包供下载。 也可以自己手动下载最新包,...

    从0到1部署前后分离项目安装docker

    1.从0到1部署前后分离项目安装docker,在liunx系统环境下,包含下载配置,以及常用的docker命令,此教程还是需要有一点docker基础的同学参考的。 1.从0到1部署前后分离项目安装docker,在liunx系统环境下,包含下载...

    docker&&nvidia-docker安装包

    部署docker&&nvidia-docker的离线包; docker部署的步骤: 上传到服务器上,解压安装包,解压完成进入nvidia-docker目录,在进入里面的docker目录,cd nvidia-docker/docker/ 直接执行里面的install.sh脚本即可; ...

    docker学习笔记.md

    docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,...

    内网离线安装docker、docker-compose

    一键离线安装docker、docker-compose

    Ubuntu 16.04/18.04裸系统离线安装docker环境

    docker-engine_17.05.0_ce-0_ubuntu-trusty_amd64.deb libgcrypt20_1.8.1-4ubuntu1_amd64.deb libltdl7_2.4.6-2_amd64.deb libsystemd-journal0_204-5ubuntu20_amd64.deb 4 个文件放到同一目录 2. 运行命令...

    docker超详细基础教程

    docker超详细基础教程:Docker是一种容器化技术,可以将应用程序及其依赖项打包在一起,形成一个可移植的容器。使用Docker可以方便地部署、运行和管理应用程序,提高开发效率和系统稳定性。以下是Docker基础教程的...

Global site tag (gtag.js) - Google Analytics