在现实生活中,容器就是用来装东西的东西。把你的应用放到容器里,容器里的环境你可以自由定制,你可以在里面安装配置应用需要的任何东西,然后你可以把这个装载着应用的容器拿到任何地方去运行,这些地方不需要知道容器里面到底有什么,它只需要知道怎么样去运行这个容器就行了。Docker 提供了一系列的工具,让我们把应用放到容器里变得更简单。
镜像与容器
镜像与容器,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 绝对是每个开发者都需要了解的东西。
Docker
评论
赞++
8 年 4 个月 以前
起得真早呀,皓哥~ 你是不是4点就起来工作了呀!
8 年 4 个月 以前
没有,今早 3 点一泡尿憋醒,再就睡不着了,然后就起来写点东西。
8 年 4 个月 以前
Docker for Windows 有几个坑:
1、需要 Windows 10 64位,并开启 Hyper-V 虚拟化功能;Windows 10 64位以下系统只能使用 Docker Toolbox;
2、需要打开那个图形化界面,设置向主机暴露端口,不然无法访问 localhost
8 年 4 个月 以前
收到。哈哈 ~
8 年 4 个月 以前
另外,建议皓哥把 Docker Swarm 的教程也出了~~还有将 Docker 用于生产环境的那套流程整理一下 ; )
8 年 4 个月 以前
嗯。好来 ~
8 年 4 个月 以前
皓哥将来有没有打算录一套将「Node.js + React + React Native + MongoDB + Docker」这些技术运用到一个完整项目(CMS、微信公众账号开发、微信朋友圈里分享的那种、或其他某某系统)的打算?
8 年 4 个月 以前
Node.js 与 MongoDB 做了一个基础。具体用它们干啥,我觉得还是得用您自己的想法。
8 年 4 个月 以前
别被它吓着,我们应该拥抱新鲜!
8 年 4 个月 以前
皓哥,我刚刚把最新的 nest 仓库拉下来,运行构建。发现在 Windows 10 64位下,composer.phar 存在没有执行权限的错误。在 Dockerfile 里添加了 chmod +x /usr/local/bin/composer 就好了
8 年 4 个月 以前
收到。
8 年 4 个月 以前