Docker 如何安装和使用容器
基于容器的虚拟化根本不是什么新鲜事物。
但是,基于容器的虚拟化的新实现确实使它成为应用程序开发人员和管理员的热点。
使它流行的主要原因是它管理容器及其内部应用程序的灵活性。
开发人员现在可以轻松地将应用程序及其整个依赖项运送到任何地方,并保证它可以在任何地方运行。
因此,许多已经开始采用它作为其持续集成环境的一部分。
与其他类型的虚拟化不同,容器重量轻且开销少。
基于虚拟机管理程序的虚拟化技术需要创建虚拟硬件,并在其之上安装具有自己的内核和驱动程序的操作系统。
因此,从技术上讲,基于虚拟机管理程序的内容是完全隔离的,对于基本操作系统,来宾系统看起来像是一个独立的主机,与自身无关。
容器共享基本操作系统所使用的同一内核。
这是基于容器的虚拟化的主要优点,也是一个限制点。
这是一个限制点,因为它无法在其上运行任何其他操作系统(例如Windows)(仅因为Linux内核只能运行Linux发行版。)
什么是Docker?
Docker不过是一个软件引擎,可以管理软件应用程序并将其自动部署到容器中。
因此,以一种更好的方式来表达它,可以在任何地方构建,发布和运行应用程序。
它是开源的,并根据Apache 2许可发布。
它是由Docker,Inc.制作和开发的。
Docker随容器一起带来的灵活性已成为IT行业中的一种流行工具。
实际上,我们可以在数秒内运行第一个容器(是的,相信我,秒)。
使用docker的主要优点是“运送”部分。
当我说运送时,我们运送的是整个容器以及容器内所有依赖项的应用程序。
这使在任何地方运行该容器化应用程序变得如此容易,并为我们保证应用程序将按预期运行。
可移植性是docker的主要目标。
在继续进行安装部分之前,让我们首先了解docker的一些核心组件。
- Docker客户端和服务器
- Docker镜像
- Docker注册表
- Docker容器
Docker在客户端服务器模型中工作。
Docker客户端与服务器(这是一个等待处理请求的守护程序)联系,服务器守护程序完成创建,停止以及与容器相关的事情的实际工作。
如上图所示,docker在客户端服务器模型中工作。
在Docker主机上等待的Docker守护程序可以通过Docker客户端实用程序连接并可以执行命令。
Docker镜像是我们用来启动容器的镜像。
简单来说,我们可以说docker镜像不过是我们容器的源代码。
我们可以从官方Docker注册表中找到许多基本镜像,例如Ubuntu,centos等,然后可以从该镜像启动自己的容器,然后安装所需的应用程序并将其另存为另一个镜像,以用作应用程序的基本镜像。
Docker镜像是主要组件,可用于运送和下载应用程序(以便我们可以从中启动容器)。
Docker Registries就是存储和检索镜像以供以后使用的地方。
就像镜像的GIT存储库一样简单,或者说docker镜像的yum存储库就这么简单。
类似于yum存储库,docker注册表也可以是公共的也可以是私有的。
Docker容器:我们可以将容器视为Docker的主要执行部分。
与在普通Linux系统中运行一样,我们可以在容器中运行一个或者多个进程。
因此,容器不过是最终用户的执行环境。
我们可以在单个系统中运行多个容器,这些容器具有用于标识它们的名称,每个容器都运行不同的应用程序/进程,甚至是互连的进程。
例如,我们可以有一个仅运行Apache服务器的容器,而在同一台运行MySQL的docker主机中的另一个容器(Apache将其用于数据库)
现在,发布应用程序变得非常容易,我们可以简单地从正在运行的容器中制作一个镜像并将其标记,然后将其推送到注册表中,以便有权访问注册表帐户的任何人都可以拉出它并运行该容器。
Docker可以在具有现代Linux内核的任何服务器上运行。
推荐用于运行docker的内核版本是3.8或者更高版本。
如何安装Docker?
在Linux中安装Docker非常简单直接。
因为可以通过apt-get和yum等不同的软件包管理器将docker作为软件包使用,以方便安装。
由于这个原因,可以轻松地将docker安装在许多Linux发行版上。
话虽如此,它已经在Ubuntu和Red Hat Enterprise Linux上进行了良好的测试。
在本教程中,我们将看到如何在Ubuntu以及Red Hat Enterprise Linux上安装docker。
让我们从Ubuntu First开始。
他们建议使用以下版本的Ubuntu来运行docker。
- Ubuntu Precise 12.04(LTS)(64位)
- Ubuntu Saucy 13.10(64位)
- Ubuntu Saucy 13.10(64位)
- Ubuntu Raring 13.04(64位)
- Ubuntu Trusty 14.04(LTS)(64位)
请注意,Docker也可以在其他早期Ubuntu版本上运行(前提是它具有推荐的内核版本和其他依赖性),但是不同版本的Ubuntu具有不同的内核版本。
问题在于它们不是官方推荐的。
步骤1:第一步是验证系统中是否具有正确的内核版本。
如果我们使用的是Ubuntu 13.10或者更高版本,则不必担心,因为我们已经拥有最新版本。
但是在此示例中,我将使用具有较旧内核的ubuntu 12.04发行版。
因此,第一步是安装最新的内核版本。
我们可以通过运行以下命令在ubuntu中执行此操作。
$sudo apt-get update $sudo apt-get install linux-headers-3.8.0-27-generic linux-image-3.8.0-27-generic linux-headers-3.8.0-27
上面的命令将安装Docker所需的最新内核版本。
现在,使用这些内核更改来更新Ubuntu grub。
$sudo update-grub
现在我们可以重新启动服务器,执行uname -a命令时应该可以看到以下内容。
root@docker-workstation:~# uname -a Linux docker-workstation.example.com 3.8.0-23-generic #34~precise1-Ubuntu SMP Wed Sep 3 21:30:07 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
请注意,如果我们运行的版本早于Ubuntu 12.04.3.
,则只需要执行上述步骤即可。
如果我们正在运行Ubuntu 12.04.3及更高版本,则无需升级内核,因为默认情况下我们可能已经拥有3.8.0 x86_64或者更高版本的内核。
步骤2:现在我们将使用docker的devicemapper存储驱动程序。
因此,在继续操作之前要进行的下一步验证是我们是否已在内核中安装并启用了设备映射器。
这可以通过以下方法来完成。
root@docker-workstation:~# grep device-mapper /proc/devices 252 device-mapper
如果找不到,则可以使用下面的modeprobe命令实际启用该内核模块。
root@docker-workstation:~# modprobe dm_mod
泊坞窗的主要核心组件是对分层图像的使用。
为了实现这种分层方法,docker使用了几个内核功能。
Docker使用分层方法。
每层将被唯一命名。
可以在需要时安装每个层,或者在需要时进行修改。
甚至可以在具有另一个唯一名称的现有层之上创建新层。
当我们谈论docker镜像时,系统中的每个镜像都以层的形式存储。
现在请记住,设备映射器向Docker提供了分层功能,因此需要启用/安装它。
我们将在即将发布的与Docker相关的文章中更详细地讨论这些概念。
步骤3:现在,当我们使用Ubuntu时,下一步是将正式的Docker的apt-get存储库添加到我们的系统中。
这可以通过使用以下命令来完成。
root@docker-workstation:~# sh -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
现在让我们为该仓库添加GPG密钥。
可以如下所示进行。
root@docker-workstation:~# curl -s https://get.docker.io/gpg | sudo apt-key add
之后,只需运行apt-get update,我们就为软件包添加了Docker存储库。
步骤4:现在最后一步是安装docker本身。
现在,这可以通过一个apt-get命令完成,因为我们已经将apt信息库包含在列表中了。
root@docker-workstation:~# apt-get install lxc-docker
上面的命令将安装docker及其所有必需的依赖项,我们可以开始使用以下命令获取所有容器,图像,数据空间,驱动程序详细信息,内核版本,操作系统详细信息以及许多其他内容的当前状态。
更多的。
root@docker-workstation:~# docker info
步骤5:在默认防火墙设置中需要进行一些修改(仅在使用ubuntu UFW防火墙时适用)。
所做的更改是允许将数据包转发到容器。
所做的更改不过是修改/etc/default/ufw文件。
DEFAULT_FORWARD_POLICY="ACCEPT"
默认设置为DROP。
对其进行修改,使其看起来像上面显示的行。
现在,让我们继续了解Red Hat Linux系统中的安装。
然后,我们将看到如何使我们的第一个容器运行。
在Red Hat Enterprise Linux上安装Docker
现在,让我们看看在RHEL中安装docker的方法。
它非常简单,就像Ubuntu一样。
Docker包含在Red Hat Enterprise Linux 7的默认软件包列表中。
RHEL7上的Docker也得到正式支持。
没有其他版本的RHEL正式支持Docker。
以下版本支持Red Hat中的Docker。
- 红帽企业Linux(和CentOS)6及更高版本(64位)
- Fedora Core 19及更高版本(64位)
步骤1:所以这里的第一步是验证内核版本。
可以再次使用如下所示的命令来完成此操作(也就是说,默认情况下,所有受支持的red-hat版本都具有所需的内核)。
root@docker-workstation:~# uname -a Linux docker-workstation.example.com 3.10.9-200.fc19.x86_64 #1 SMP Wed Nov 20 10:34:35 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
步骤2:现在就像在Ubuntu上一样,我们需要确认是否在内核中安装并启用了devicemapper。
如下所示进行相同的操作。
root@docker-workstation:~# grep device-mapper /proc/devices
如果我们没有安装它,可以通过以下命令来完成。
root@docker-workstation:~# yum install -y device-mapper root@docker-workstation:~# modprobe dm_mod
步骤3:现在,如下所示安装Docker。
在Red Hat Enterprise Linux 6或者Centos 6上,可以通过以下命令执行此操作。
root@docker-workstation:~# rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
现在只需一个命令即可安装docker软件包,如下所示。
root@docker-workstation:~# yum -y install docker-io
如果我们使用的是Red Hat Enterprise Linux 7(提供了Red Hat服务器订阅),则方法略有不同。
我们可以通过运行以下命令来做到这一点。
root@docker-workstation:~# subscription-manager repos --enable=rhel-7-server-extras-rpms root@docker-workstation:~# sudo yum install -y docker
在fedora 20及更高版本上,我们需要运行以下命令来安装docker。
root@docker-workstation:~# yum -y install docker
在Linux上安装Docker的最简单方法
到目前为止,我们已经看到了用于安装docker的软件包管理器方法。
现在,让我们看看在Linux上安装docker的最简单最简单的方法。
这是通过docker正式提供的脚本完成的。
为此,我们首先需要确保在我们的系统上安装了curl。
root@docker-workstation:~# apt-get -y install curl
在Red Hat或者fedora中,我们当然需要运行以下命令。
root@docker-workstation:~# yum -y install curl
现在运行以下命令以执行Docker提供的脚本。
curl https://get.docker.io/| sudo sh
上面的命令会将脚本重定向到bash命令行,实习生将执行该脚本。
它将验证内核,设备映射器和所有其他必需的东西,并将安装docker并启动守护程序。
这是在Linux上安装docker的最简单方法。
了解Docker Daemon和客户端
现在我们已经在系统上安装了docker,让我们看看它是如何运行和启动容器的。
正如我在一开始提到的那样,docker是一个客户端服务器应用程序。
Docker守护程序应在服务器上运行,以便执行Docker客户端发送的命令。
Docker守护程序需要以root身份运行,因为它将执行普通用户没有的任务
允许。
默认情况下,docker将在/var/run/docker.sock侦听传入的docker客户端请求。
现在,尽管我们可以更改它以使其侦听TCP端口(以便其他远程客户端可以在此docker主机上执行命令),但不建议这样做。
使docker daemon在tcp端口上执行bing操作会增加安全风险,因为该端口将成为其他人进入系统内部并获得root级访问权限的大门。
因此,仅当Docker主机位于受信任的专用网络中时,才执行此操作。
echo DOCKER_OPTS="-H=tcp://0.0.0.0:4243" >> /etc/default/docker
上面的命令将永久添加启动参数,以便打开端口4243,以便远程Docker客户端可以连接。
或者,我们也可以通过手动启动它,使其在端口上运行,如下所示。
/usr/bin/docker -H tcp://0.0.0.0:4243 -d &
请记住,默认情况下,docker守护程序不提供任何形式的身份验证。
这意味着通过Docker客户端访问此端口的任何人都可以运行命令。
但是,Docker中有一种TLS身份验证形式,我将在另一篇文章中进行讨论。
我们实际上可以同时将docker守护程序绑定到/var/run/docker.sock以及TCP端口4243,如下所示。
/usr/bin/docker -d -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
使用Docker运行我们的第一个容器
既然我们已经安装并配置了docker守护程序,并且已经在我们的系统中运行,那么让我们开始使用我们的容器。
所有管理活动(如启动,停止,删除,镜像)均由docker客户端命令行及其不同的参数完成。
root@docker-workstation:~# docker help
使用上面的命令,我们可以获得与Docker相关的所有命令行参数。
root@docker-workstation:~# docker run -i -t ubuntu /bin/bash
繁荣!。
执行完上述命令后,我们现在正坐在Docker容器中。
带有新的根文件系统。
与启动虚拟主机相比,int如此惊人且快速吗?
上面命令的输出将向我们显示不同的步骤,例如从Docker官方存储库中拉下ubuntu镜像。
我们在命令中使用的-i标志将使STDIN对我们保持打开状态。
现在,随着STDIN向我们开放,我们需要在其上添加一个终端,这是通过命令行参数-t完成的(它将为我们在容器内提供一个伪终端)。
我们提供的下一个参数(“ ubuntu”)是用于此容器的镜像的名称(默认情况下,如果在本地驱动器中找不到,则Docker客户端将从官方Docker注册表中提取该镜像)。
我们刚刚启动的这些图像,例如“ ubuntu”,可以用作在顶部构建应用程序的基础。
现在,此ubuntu镜像将存储在本地驱动器中,以备后用。
我们给出的最后一个参数是一个命令,该命令需要在容器内运行。
这就是运行上面的docker run命令之后,我们作为最终结果坐在容器中的原因(这意味着我们位于新启动的ubuntu容器的bash pompt中)。
我们现在正坐在一个全新的Linux操作系统中,该操作系统具有用于进程,网络,文件系统等的完全不同的名称空间(但它与基本docker主机共享内核)。
我们可以为容器设置新的主机名,设置其自己的解析器等。
1.尝试在新启动的容器中运行ps -a(它将仅显示一个我们启动的名为bash的进程)
2.尝试运行#hostname命令(它将显示一个随机容器ID作为主机名,我们可以使用此ID引用此容器,甚至可以更改主机名)
3.有关容器的IP地址,请参阅#ip a。
键入exit或者CTRL + D后,容器将立即停止。
这是因为容器仅在我们作为参数提供的最终命令(在我们的docker run命令中为/bin/bash)期间存在。
但是,我们甚至可以在后台放置一个容器(通常是这样),如下所示。
root@docker-workstation:~# docker run --name test_container -t -d ubuntu /bin/sh