出品丨Docker公司(ID:docker-cn)
编译丨小东
每周一、三、五晚6点10分 与您不见不散
上一小节我为大家介绍了关于物理服务器的组成、使用的操作系统以及安装 Docker 这三个部分的内容。今天,我将为大家带来第二小节的内容,点击下列文章标题,查看系列教程:
Docker-compose
如果您想在 Docker 上快速运行一些服务,那么 docker-compose 可能是最简单的选择了。
根据经验来讲,从 Docker Compose 迁移到 Swarm 的过程并不像我希望的那样简单,所以如果您打算扩展您的“家庭版实验室”,请关注本教程的第三篇文章。
首先,您需要安装可执行文件,如下所示:
$ sudo apt-get update
$ sudo apt-get install docker-compose
一旦完成安装,就可以输入以下命令来查看它是否能正常运行:
$ docker-compose version
docker-compose version 1.8.0, build unknown
docker-py version: 1.9.0
CPython version: 2.7.13
OpenSSL version: OpenSSL 1.1.0f 25 May 2017
太棒了! 在本地群集中用 Docker Compose 配置服务的过程(就像在 Composefile 中那样定义),如下列所示:
version: '2'
services:
web:
image: nginx
restart: always
ports:
- 80:80
volumes:
- ./www:/usr/share/nginx/html
internal:
image: httpd
restart: always
ports:
- 8080:80
volumes:
- ./internal-www:/usr/local/apache2/htdocs
这个示例创建了两个服务。Web 服务是一个 Nginx 实例,它负责监听80端口的HTTP请求。内部服务是一个 Apache httpd 实例,它负责从容器外部监听8080端口。内部服务同时也监听80端口,但是在与Docker一起运行时并不会引起任何问题。其实,您可以设置多个应用程序监听同一个端口,只需要将它们绑定到不同的外部端口就可以了。
现在是时候尝试一下了!我们将上面的 YAML 内容保存为 docker-compose.yml ,同时为它们创建一个 index.html 的文件,并检查它们是否能正常工作,如下所示:
$ docker-compose up -d
Creating network "sample_default" with the default driver
Creating sample_internal_1
Creating sample_web_1
$ docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------
sample_internal_1 httpd-foreground Up 0.0.0.0:8080->80/tcp
sample_web_1 nginx -g daemon off; Up 0.0.0.0:80->80/tcp
$ ls
docker-compose.yml internal-www www
$ echo 'Hello!' | sudo tee www/index.html
Hello!
$ echo 'Secret hello!' | sudo tee internal-www/index.html
Secret hello!
$ curl -s http://localhost/
Hello!
$ curl -s http://localhost:8080/
Secret hello!
第一个“docker-compose up -d”命令将启动这两个服务。我们可以使用“docker-compose ps” 命令来检查它们是否正常运行。正如上面所示,它们正在监听我们为其定义的端口,并创建了各自的 docroot 文件夹。然后,我们用“echo”命令创建了两个简单的纯文本文件,这两个文件都被称为 index.html ,并且用“curl”命令测试它们是否可以正常回复。如果您想的话,也可以在浏览器中看到它们,只需要用服务器的 IP 地址替换掉 localhost 即可。
如果您在终端上使用自己创建的用户,则必须添加“sudo”命令。通过容器创建的目录将属于 root 用户。
“restart: always”在 Composefile 文件中是必备的一行命令,确保 Docker 会重新启动容器。 通过以下命令,您也可以看到它们都记录了什么:
$ docker-compose logs
Attaching to sample_web_1, sample_internal_1
web_1 | 172.22.0.1 - - [05/Jan/2018:21:25:07 +0000] "GET / HTTP/1.1" 200 7 "-" "curl/7.52.1" "-"
internal_1 | AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.22.0.2. Set the 'ServerName' directive globally to suppress this message
internal_1 | AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.22.0.2. Set the 'ServerName' directive globally to suppress this message
internal_1 | [Fri Jan 05 21:24:51.008938 2018] [mpm_event:notice] [pid 1:tid 139822354126720] AH00489: Apache/2.4.29 (Unix) configured -- resuming normal operations
internal_1 | [Fri Jan 05 21:24:51.009102 2018] [core:notice] [pid 1:tid 139822354126720] AH00094: Command line: 'httpd -D FOREGROUND'
internal_1 | 172.22.0.1 - - [05/Jan/2018:21:25:10 +0000] "GET / HTTP/1.1" 200 14
提示:将“-f”添加到该命令中用来跟踪日志。只需按下“Ctrl + C”即可完成。
如果您已经测试好并且玩够了的话,那么您就可以使用一行简单的命令来轻松地停止和删除它们,如下所示:
$ docker-compose down
Stopping sample_web_1 ... done
Stopping sample_internal_1 ... done
Removing sample_web_1 ... done
Removing sample_internal_1 ... done
Removing network sample_default
如果您只想停止容器但不想删除它们,请使用“docker-compose stop”命令。
我希望这对您来说会很有趣,因为使用“docker-compose” 会比通过SSH会话手动编辑文件和在服务器上执行命令做得更好。您可以将 Composefile 文件提交到 Git 私有仓库中,并进行基本的自动化设置,以便在发生变改时可以自动更新服务。如果您的堆栈不是私有的,并且不包含任何敏感数据,那么您可以使用 GitHub 仓库。或者,注册一个 BitBucket 账号,在那里您可以选择使用公共和私人仓库。一旦您将 “docker-compose.yml”文件上传至云端,那么请在服务器上安装 git,并将镜像仓库克隆到一个文件夹中。现在,您就可以在操作界面中轻松地将更改提交到文件并更新容器,如下所示:
BitBucket :
(浏览 https://bitbucket.org 查看详情);
$ cd /to/your/cloned/folder
$ git pull
$ docker-compose pull
$ docker-compose up -d
“git pull”命令会从您的 Git 仓库中获取变更,然后使用“docker-compose pull”命令将所有的 Docker 镜像下载到本地,并且定义更新过的 YAML 文件。最后使用“docker-compose up -d” 命令来启动所有新的服务,重新创建已变更配置的服务,并留下没有变更的服务。如果您不喜欢像vim或nano这样的工具,那么也可以使用您喜欢的桌面文本编辑器。
有了上面的设置之后,已经没有什么能够阻止在变更配置之后进行自动化的更新了。我使用 “cron”工具来检查配置变更,因为我只拥有少数的服务。假设我们要每15分钟检查一次变更,只需用“crontab -e”编辑 cron 时间表,并添加以下命令就可以了:
*/15 * * * * cd /to/your/cloned/folder && git pull && docker-compose pull && docker-compose up -d
使用 cron 的好处在于,您可以将其封装到Bash脚本中,并使用“cron”命令调用该脚本。
恭喜您! 现在您拥有了一套可以运行的 Docker 容器,并且可以通过编辑一个简单的 YAML 文件来进行自动更新和配置,同时还可以执行“git push”命令。
结 语
这个解决方案可以运行少数的应用程序,但扩展性不是很理想。而且将所有应用程序都集中运行在一台服务器上也是不可靠的一件事情,因为如果这台服务器出了故障,那么就什么都不能访问了。
所以,在本教程的第三篇文章中,我将为大家带来使用 Docker Swarm 将上文中的设置扩展到多个服务器的演示,敬请期待。
点击下列标题,阅读更多干货
如果本文对你有帮助,欢迎分享到朋友圈!获取更多Docker实用技巧,扫描下图二维码!