Docker:把web应用部署到容器里

镜像与容器

镜像与容器,image and container。基于镜像可以去创建容器,镜像有点像是容器的模板,比如你用 centos 镜像创建一个容器,这个容器里的环境就相当于是一个 centos 系统。镜像里可能预装了一些东西,比如 nginx 镜像包含了 nginx 这个 web 服务器,mongodb 镜像里面已经安装好了 mongodb 数据库。这些镜像会基于某些系统类型的镜像去创建,比如 debian,alpine 等等。

我们自己也可以制作镜像,在一个 Dockerfile 文件里描述你的镜像,一般要基于某个系统类型的镜像,然后描述一下安装什么样的软件,做什么配置,公布哪些端口等等,执行 docker build 命令可以生成这个镜像。你可以把自己制作的镜像发布到公开的或者私有的镜像仓库里。

《 Docker:镜像与容器 》http://ninghao.net/course/3764

网络

网络,network。创建的容器默认都有一个桥接类型的网络,它们之间可以相互通信,但是容器跟外界联系得通过这个桥接网络,可以公开容器的一些端口,这样外界只能通过容器公开的端口号跟他通信。比如一个用 nginx 镜像创建的容器,可能需要公布一下 80 端口,因为这是 http 协议默认使用的端口号。

你可以指定让主机上的哪个端口对应这个 nginx 容器的 80 端口。比如你设置的是 8080 这个端口,假设主机的 ip 是 192.168.99.100 ,那么用户访问 http://192.168.99.100:8080 的时候,接待服务的就会是 nginx 容器。主机就是运行 docker 的那台机器。

我们也可以自定义容器的网络,然后让指定的容器加入到这个自定义网络里面,这样在这个网络里的容器之间可以相互通信,这个自定义网络以后的容器不能直接跟自定义网络内的容器进行通信。你也可以让一个容器同时属于多个网络。自定义网络可以用来隔离容器,这样会更安全。自定义网络内的容器可以直接使用容器的名字访问到对方,这样就不需要使用 ip 地址了。

《 Docker:网络 》http://ninghao.net/course/3814

数据卷

数据卷,data volumes。有时候容器跟主机之间,或者容器与容器之间要共享一些数据。基于镜像创建了容器,这个容器会有一个容器层的存储,在容器里数据的变化都会放到这个容器层的存储上保留下来,我们把容器删除掉以后,这个容器层存储上的东西也就没了。有些数据需要长久保存,比如 mysql 数据库容器里的数据库,你可以创建一个数据卷,挂载到 mysql 容器里保存数据库的地方,这样在数据库里的数据都会保存到主机上,也就是即使你删除掉了容器,在它的数据卷上的数据会被保留下来。

我们也可以手工指定数据卷在主机上的具体位置,然后把它挂载到容器里的某个位置上。在开发应用的时候,这种数据卷非常有用,比如你可以随时修改应用的代码,然后立即看到修改之后在容器里运行的结果。

《 Docker:存储 》http://ninghao.net/course/3808

Docker Compose

一般应用可能同时需要几个容器提供的服务,比如一个 php 应用,需要 web 服务,可以使用 nginx ,需要数据服务,可以使用 mysql / mariadb ,需要脚本解释服务,可以使用 php-fpm 。我们可以手工使用 docker 命令创建这些容器,在创建的时候你要添加一些配置选项,让这些容器可以一起合作为 php 应用提供服务。

更好的方法是,我们在一个文件里写清楚应用需要哪些容器提供的服务,这些容器是使用现成的镜像去创建,还是自己制作,容器公开的端口号,使用的数据卷,所属的网络,这些都可以在文件里写清楚。然后使用一条命令可以启动定义好的所有的容器。这就是 Docker Compose ,那个描述配置的文件的名字是 docker-compose.yml 。

《 Docker:组合 》http://ninghao.net/course/3826

《 Docker 容器化应用 》http://ninghao.net/course/3840

镜像仓库

Docker Hub 是 Docker 公司官方提供的 Docker 镜像的仓库,上面存储了官方提供的镜像,还有很多用户自己制作的镜像,你也可以把自己制作的镜像推送到这个仓库上。公开的镜像仓库是免费的,但私有的镜像仓库是收费的。国内也有服务商提供了这个镜像仓库的服务,比如阿里云,在国内推荐使用,因为上传或下载镜像的速度会更快,在阿里云的镜像仓库里面,你也可以找到 Docker Hub 上的所有的镜像。

使用 Docker

Windows 用户下载安装 Docker for Windows(https://docs.docker.com/docker-for-windows/),目前是测试版本。

macOS 用户下载安装 Docker for Mac(https://download.docker.com/win/beta/InstallDocker.msi),目前是测试版本。

Linux 用户下载安装 Docker for Linux (https://docs.docker.com/engine/installation/linux/)

Docker for Windows 与 Docker for Mac 都是在桌面电脑上使用的工具,它里面包含了 Docker 还有 Docker Compose 这些工具,它还提供了一个界面可以启动配置 Docker 。

在录制前几个 Docker 课程的时候,用的还是 Docker Toolbox ,它里面也包含了 Docker 还有相关的工具,它还需要用到 Virtualbox 。现在推荐使用 Docker for Windows 或 Docker for Mac ,因为它们使用了本机的虚拟技术。
php 应用开发环境

我在 《 Docker 容器化应用 》里介绍了使用 Docker 在本地创建一个开发 php 应用的环境。用到了 nginx,mariadb,php-fpm,可以运行一般的 php 应用,比如 Laravel,Drupal,WordPress 等等。在命令行下面,操作步骤如下:

cd desktop
git clone git://github.com/ninghao/nest
cd nest
docker-compose build
docker-compose up -d

启动以后,打开浏览器,输入 localhost:8080,可以打开 web 服务,访问 localhost:8080/phpinfo.php,可以打开 php 的信息页面。

在 build 服务的时候,会自动下载 php 的包管理工具 composer,由于国内网络问题,可能会失败,可以多 build 几次,或者找找方法科学上网 :)

运行 Laravel

进入到 console 服务,然后使用 composer 去安装 Laravel。

docker-compose exec console bash
cd /mnt/app
composer create-project --perfer-dist laravel/laravel laravel

完成以后配置一下 nginx ,打开 images/nginx/config/default.conf,修改 root 指令的值,设置成 /mnt/app/laravel/public 。然后重新启动 web 服务。

docker-compose restart web

访问 localhost:8080,可以打开 Laravel 的欢迎界面。注意在配置 Laravel 数据库的时候,数据库的主机不是 localhost,而是 db ,它是数据服务的名字,是在 docker-compose.yml 里面定义的。

总结

我靠,又要学新东西。别被它吓着,我们应该拥抱新鲜。Docker 绝对是每个开发者都需要了解的东西。

版权

1、更多视频教程 ninghao.net

2、原文出于 王皓


发布日期:

所属分类: Linux/Centos/Os 标签: