Docker解释:如何容器化和使用Nginx作为代理
状态: 已弃用
本文已弃用,不再维护。
原因
本文中的技术已经过时,可能不再反映 Docker 的最佳实践。
请参阅
介绍
在处理 Web 应用程序服务器的请求和提供静态内容时,久经考验的 Nginx 是当今非常流行的选择。 当您使用 docker 并容器化您的应用程序时,让 Nginx 为它们服务对于大多数情况同样有意义。 毕竟,这些容器让您可以轻松移植应用程序、快速扩展并为您的主机添加另一层(即 液滴)安全。
在这篇 DigitalOcean 文章中,我们将学习如何快速设置 docker,从基础镜像创建 docker 容器,并构建它以逐层运行 Nginx。 之后,按照我们从一开始的步骤,我们将创建一个 Dockerfile 来自动化整个过程。 最后,使用这个 Nginx docker 镜像,您将能够创建运行 Nginx 的自包含沙箱,可用于为您的“dockerised”应用程序提供服务。
词汇表
1. Docker 简介
2. Nginx 简介
3. 在 Ubuntu 上安装 Docker
4. 基本的 Docker 命令
- 运行 docker 守护进程和 CLI 用法
- 码头工人命令
5. 构建安装了 Nginx 的 Docker 容器
- 从 Ubuntu 创建基础 Docker 容器
- 为 Nginx 安装准备基础容器
- 安装 Nginx
- 配置 Nginx
6. 创建 Dockerfile 以自动构建镜像
- Dockerfile 基础
- Dockerfile 命令概述
- 创建 Dockerfile
- 定义基本面
- Nginx 安装说明
- 自举
- 最终的 Dockerfile
- 使用 Dockerfile 自动构建 Nginx 容器
Docker 简介
docker 项目 提供了更高级别的工具,可以协同工作,这些工具构建在一些 Linux 内核特性之上。 目标是帮助开发人员和系统管理员移植应用程序——连同它们的所有依赖项——并让它们跨系统和机器运行——无头疼。
Docker 通过创建安全的 LXC(即 基于 Linux Containers)的应用程序环境,称为“docker 容器”。 这些容器是使用 docker 镜像创建的,可以通过手动执行命令或通过 Dockerfiles 自动执行命令来构建。
注意: 了解更多关于 docker 及其部分(例如 docker daemon、CLI、图像等),请查看我们对项目的介绍性文章:docker Explained: Getting Started。
Nginx 简介
Nginx 是一个非常高性能的 Web 服务器/(反向)代理)。 由于重量轻、相对容易使用和易于扩展(使用附加组件/插件),它已经流行起来。 由于其架构,它能够处理 很多 请求(几乎无限制),这取决于您的应用程序或网站负载 - 使用旧的替代方案可能很难解决。 可以将 视为 工具,用于选择提供静态文件,例如图像、脚本或样式表。
在 Ubuntu 上安装 Docker(最新)
凭借其最新版本(0.7.1. 日期为 12 月 5 日),docker 可以部署在各种 Linux 操作系统上,包括 Ubuntu / Debian 和 CentOS / RHEL。
请记住,您可以使用 DigitalOcean 在 Ubuntu 13.04 上构建的即用型 docker 映像快速入门。
我们将快速介绍 Ubuntu(最新)的安装过程。
Ubuntu 安装说明
更新您的液滴:
sudo aptitude update sudo aptitude -y upgrade
确保 aufs 支持可用:
sudo aptitude install linux-image-extra-`uname -r`
将 docker 存储库密钥添加到 apt-key 以进行包验证:
sudo sh -c "wget -qO- https://get.docker.io/gpg | apt-key add -"
将 docker 存储库添加到 aptitude 源:
sudo sh -c "echo deb http://get.docker.io/ubuntu docker main\ > /etc/apt/sources.list.d/docker.list"
使用新增内容更新存储库:
sudo aptitude update
最后,下载并安装docker:
sudo aptitude install lxc-docker
Ubuntu 的默认防火墙(UFW: Uncomplicated Firewall)默认拒绝所有转发流量,这是 docker 需要的。
使用 UFW 启用转发:
使用 nano 文本编辑器编辑 UFW 配置。
sudo nano /etc/default/ufw
向下滚动并找到以 DEFAULT_FORWARD_POLICY 开头的行。
代替:
DEFAULT_FORWARD_POLICY="DROP"
和:
DEFAULT_FORWARD_POLICY="ACCEPT"
按 CTRL+X 并用 Y 确认保存并关闭。
最后,重新加载 UFW:
sudo ufw reload
基本的 Docker 命令
在我们开始使用 docker 之前,让我们快速回顾一下它的可用命令,以刷新我们的第一篇 Getting Started 文章中的记忆。
运行 docker 守护进程和 CLI 用法
安装后,docker daemon 应该在后台运行,准备好接受 docker CLI 发送的命令。 对于可能需要手动运行 docker 的某些情况,请使用以下命令:
运行 docker 守护进程:
sudo docker -d &
码头工人 CLI 用法:
sudo docker [option] [command] [arguments]
注意: docker 需要 sudo 权限才能工作。
码头工人命令
以下是当前可用(版本 0.7.1)docker 命令的摘要:
attach: Attach to a running container build: Build a container from a Dockerfile commit: Create a new image from a container's changes cp: Copy files/folders from the containers filesystem to the host path diff: Inspect changes on a container's filesystem events: Get real time events from the server export: Stream the contents of a container as a tar archive history: Show the history of an image images: List images import: Create a new filesystem image from the contents of a tarball info: Display system-wide information insert: Insert a file in an image inspect: Return low-level information on a container kill: Kill a running container load: Load an image from a tar archive login: Register or Login to the docker registry server logs: Fetch the logs of a container port: Lookup the public-facing port which is NAT-ed to PRIVATE_PORT ps: List containers pull: Pull an image or a repository from the docker registry server push: Push an image or a repository to the docker registry server restart: Restart a running container rm: Remove one or more containers rmi: Remove one or more images run: Run a command in a new container save: Save an image to a tar archive search: Search for an image in the docker index start: Start a stopped container stop: Stop a running container tag: Tag an image into a repository top: Lookup the running processes of a container version: Show the docker version information
让我们开始!
=
构建安装了 Nginx 的 Docker 容器
在我们的 VPS 上安装了 docker 并快速查看了它的命令之后,我们准备开始实际工作以创建运行 Nginx 的 docker 容器。
注意: 虽然在完成本节之后,我们将拥有一个安装了 Nginx 的运行 docker 容器,但由于其复杂性,绝对不推荐使用这种方法。 但是,它在这里为您提供了一个学习如何使用实时容器并熟悉我们稍后需要定义以自动化该过程的命令的机会。 要以更好的方式创建安装了 Nginx 的 docker 映像,请参阅下一节:创建 Dockerfile 以自动构建 Nginx 映像。
从 Ubuntu 创建基础 Docker 容器
使用 docker 的 RUN 命令,我们将首先基于 Ubuntu 映像创建一个新容器。 我们将使用“-t”标志附加一个终端。
sudo docker run -i -t -p 80:80 ubuntu /bin/bash
注意: 执行此命令后,docker 可能需要 pull Ubuntu 映像,然后才能为您创建新容器。
记住:您将被附加到您创建的容器中。 为了分离自己并返回主终端接入点,请运行转义序列:CTRL+P,然后是 CTRL+Q。 连接到 docker 容器就像连接到另一个内部的新液滴。
要将自己重新连接到此容器:
- 使用 sudo docker ps 列出所有正在运行的容器
- 找到它的 ID
- 使用 sudo docker attach [id] 附加回其终端
重要: 请不要忘记,由于我们是在一个容器中,所以下面的所有命令都会在那里执行,不会影响主机。
为 Nginx 安装准备基础容器
为了安装 Nginx 和该过程所需的工具,相关的应用程序存储库必须可供下载。
让我们将 Ubuntu 的 universe 附加到基础映像的默认列表中。
echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
使用新添加的源更新列表。
apt-get update
在我们继续安装 Nginx 之前,我们应该安装一些工具,例如 nano——以防万一。
apt-get install -y nano \ wget \ dialog \ net-tools
安装 Nginx
由于它在存储库中可用,我们可以简单地使用 apt-get 下载和安装 nginx。
apt-get install -y nginx
配置 Nginx
使用我们在上一步中安装的文本编辑器 nano,让我们创建一个示例 Nginx 配置来代理与应用程序服务器的连接。
# Delete the default configuration rm -v /etc/nginx/nginx.conf # Create a blank one using nano text editor nano /etc/nginx/nginx.conf
首先,在文件顶部,必须在 not 中添加一行,以让 Nginx 生成其进程然后退出。
我们不能允许这种情况发生的原因是因为 docker 依赖于单个进程来运行(它甚至可以是一个进程管理器)以及该进程何时停止(即 在产生工人后退出),容器停止。
从以下作为 nginx.conf
的第一行开始:
daemon off;
我们将使用一个简单的示例配置让 Nginx 作为反向代理运行。 在daemon off;
指令后复制粘贴以下内容。
worker_processes 1; events { worker_connections 1024; } http { sendfile on; gzip on; gzip_http_version 1.0; gzip_proxied any; gzip_min_length 500; gzip_disable "MSIE [1-6]\."; gzip_types text/plain text/xml text/css text/comma-separated-values text/javascript application/x-javascript application/atom+xml; # List of application servers upstream app_servers { server 127.0.0.1:8080; } # Configuration for the server server { # Running port listen 80; # Proxying the connections connections location / { proxy_pass http://app_servers; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; } } }
保存并退出按 CTRL+X 并用 Y 确认。
要运行 Nginx,您可以执行以下命令:
service nginx start
就是这样! 我们现在让 Nginx 在 docker 容器中运行,可以从外部世界通过端口 80 访问,因为我们使用 -p 80:80
标志进行设置。
记住: 这个 Nginx 文件,虽然配置正确,但不会做任何事情,因为服务器上当前没有运行应用程序服务器。 除了这个,您可以复制并使用另一个示例,该示例仅用作测试 HTTP 标头的转发代理,直到您的应用程序服务器安装并正常工作。
创建 Dockerfile 以自动构建镜像
正如我们在上一步中提到的,当然不推荐以这种方式创建容器以进行可扩展生产。 正确的做法可以认为是使用 Dockerfiles 以结构化的方式自动化构建过程。
在完成了在容器中下载和安装 Nginx 的必要命令之后,我们可以使用相同的知识来编写一个 Dockerfile,docker 可以使用它来构建一个镜像,然后可以使用它来轻松地运行 Nginx 实例。
在我们开始处理 Dockerfile 之前,让我们快速回顾一下基础知识。
Dockerfile 基础
Dockerfiles 是包含 commands 连续声明的脚本,将由 docker 按该顺序执行以自动创建新的 docker 映像。 它们对部署有很大帮助。
这些文件总是以使用 FROM
命令定义基本映像开始。 从那里开始, 构建过程 开始,随后采取的每个操作都形成了将提交到主机上的最终映像。
用法:
# Build an image using the Dockerfile at current location # Tag the final image with [name] (e.g. *nginx*) # Example: sudo docker build -t [name] . sudo docker build -t nginx_img .
注意: 要了解有关 Dockerfile 的更多信息,请查看我们的文章:Docker 解释:使用 Dockerfiles 自动构建映像。
Dockerfile 命令概述
- ADD:将文件从主机复制到容器中
- CMD:设置要执行的默认命令,或传递给 ENTRYPOINT
- ENTRYPOINT:设置容器内的默认入口点应用程序
- ENV:设置环境变量(例如 键=值)
- EXPOSE:将端口暴露在外部
- FROM:设置要使用的基础镜像
- MAINTAINER:设置 Dockerfile 的作者/所有者数据
- RUN:运行命令并提交结束结果(容器)图像
- USER:设置用户从镜像运行容器
- VOLUME:从宿主机挂载目录到容器
- WORKDIR:设置CMD指令执行的目录
创建 Dockerfile
要使用 nano 文本编辑器在当前位置创建 Dockerfile,请执行以下命令:
sudo nano Dockerfile
注意: 将以下所有行依次追加,形成要保存并用于构建的 Dockerfile。
定义基本面
让我们通过定义基础(基础)来开始我们的 Dockerfile,例如 FROM
映像(即 Ubuntu) 和 MAINTAINER
。
############################################################ # Dockerfile to build Nginx Installed Containers # Based on Ubuntu ############################################################ # Set the base image to Ubuntu FROM ubuntu # File Author / Maintainer MAINTAINER Maintaner Name
Nginx 安装说明
按照上一节的步骤,让我们形成安装 Nginx 的块。
# Install Nginx # Add application repository URL to the default sources RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list # Update the repository RUN apt-get update # Install necessary tools RUN apt-get install -y nano wget dialog net-tools # Download and Install Nginx RUN apt-get install -y nginx
自举
添加安装 Nginx 的说明后,让我们完成配置 Nginx 并获取 Dockerfile 以将默认配置文件替换为我们在构建期间提供的配置文件。
# Remove the default Nginx configuration file RUN rm -v /etc/nginx/nginx.conf # Copy a configuration file from the current directory ADD nginx.conf /etc/nginx/ # Append "daemon off;" to the beginning of the configuration RUN echo "daemon off;" >> /etc/nginx/nginx.conf # Expose ports EXPOSE 80 # Set the default command to execute # when creating a new container CMD service nginx start
最终的 Dockerfile
最后,Dockerfile 应该是这样的:
############################################################ # Dockerfile to build Nginx Installed Containers # Based on Ubuntu ############################################################ # Set the base image to Ubuntu FROM ubuntu # File Author / Maintainer MAINTAINER Maintaner Name # Install Nginx # Add application repository URL to the default sources RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list # Update the repository RUN apt-get update # Install necessary tools RUN apt-get install -y nano wget dialog net-tools # Download and Install Nginx RUN apt-get install -y nginx # Remove the default Nginx configuration file RUN rm -v /etc/nginx/nginx.conf # Copy a configuration file from the current directory ADD nginx.conf /etc/nginx/ # Append "daemon off;" to the beginning of the configuration RUN echo "daemon off;" >> /etc/nginx/nginx.conf # Expose ports EXPOSE 80 # Set the default command to execute # when creating a new container CMD service nginx start
再次按 CTRL+X 并用 Y 确认保存并退出文件。
使用 Dockerfile 自动构建 Nginx 容器
正如我们第一次在“基础”部分中讨论的那样,Dockerfiles 的使用包括使用“docker build”命令调用它们。
由于我们正在指示 docker 复制配置(即 nginx.conf)从当前目录替换默认目录,我们需要确保在开始构建过程之前将它与这个 Dockerfile 放在一起。
注意: 上面解释的将 in 复制到 Nginx 配置的过程允许您非常灵活并节省大量时间,无需处理从容器中附加和分离来创建配置文件。 现在您可以简单地使用一个来直接构建和运行映像。
使用文本编辑器 nano 创建示例 nginx.conf
:
sudo nano nginx.conf
并替换其内容以将其用作测试的正向代理:
worker_processes 1; events { worker_connections 1024; } http { sendfile on; server { listen 80; location / { proxy_pass http://httpstat.us/; proxy_set_header X-Real-IP $remote_addr; } } }
让我们按 CTRL+X 并用 Y 确认以同样的方式保存并退出 nginx.conf。
这个 docker 镜像将允许我们移植我们所有的进度并使用单个命令快速创建运行 Nginx 的容器。
要开始使用它,请使用以下内容构建一个新的容器映像:
sudo docker build -t nginx_img_1 .
并使用该图像 - 我们标记为 nginx_img_1 - 我们可以运行一个新容器:
sudo docker run -name nginx_cont_1 -p 80:80 -i -t nginx_img_1
现在你可以访问你的 Droplet 的 IP 地址,你的 Nginx 运行的 docker 容器将完成它的工作,将你转发到 HTTP 状态测试页面。
例子:
# Usage: Visit http://[my droplet's ip] http://95.85.10.236/200
示例响应:
200 OK
有关安装 docker(包括其他操作系统)的完整说明,请查看 docker.io 上的 docker 安装文档。