作为一个年轻的Docker用户,我将试着解释我的使用方式。我主要用它来完成两件事:隔离服务和容器化复杂环境。
1. 隔离服务
概述
就像关注点分离原则一样。
为什么?因为这样可以实现可重用性和可扩展性(顺便也有助于调试和维护)。例如,对于PHP Laravel网站的开发环境,我会运行几个容器:
- Mysql
- Apache-PHP
- Redis
- ...
每个容器(服务)都会链接到彼此以便协同工作。例如:
Apache <== Mysql (3306 port).
Apache容器现在可以通过暴露的3306端口与Mysql容器建立TCP连接。
类似的项目将依赖于一个单独的Docker镜像,但会在不同的容器中运行。 但是为了团队合作,应该将应用程序所需的每个工具都容器化。
源代码管理
我从不直接将源代码放入容器中。我更喜欢通过卷(docker run -v
选项)将它挂载到容器中。
当我想要运行命令以更改我的源代码时,例如构建、运行测试或npm更新,我会根据这个工具需要多少配置来决定是从主机还是容器中运行。
越复杂或应用程序特定的工具,我越倾向于在容器中完成。
运行容器
按照上面的例子,我会运行一个名为myapp
和一个名为mysql
的容器。
$ cd myapp
$ docker run -d \
-p 82:80 \
-p 22001:22 \
--expose 3306
--name mysql
author/mysqlimage
$ docker run -d \
-p 81:80 \
-p 22001:22 \
-v $(pwd):/var/www
--link mysql:db
--name myapp
author/apacheimage
myapp
容器将能够与mysql
容器进行通信。测试方法:在终端中键入$ telnet db 3306
。
使用Fig运行容器
正如我所说,Docker的命令对我来说是一场噩梦,因此我找到了另一个很棒的工具Fig,这使我最终得到了一个清晰的yaml文件,位于我的项目根目录下:
web:
image: lighta971/laravel-apache
links:
- db
ports:
- "81:80"
- "22001:22"
volumes:
- .:/app
db:
image: lighta971/phpmyadmin-apache
ports:
- "82:80"
- "22002:22"
expose:
- "3306"
然后,$ cd myapp && fig up
命令的结果与下面的命令相同:)
2. 将复杂环境容器化
我也在使用Docker进行Android开发。一个基本的Android/Cordova设置很大,像几GB的下载,并需要时间来设置环境。
这就是为什么我将所有组件放入单个“瑞士军刀”容器中的原因:
- Android SDK
- Android NDK
- Apache Ant
- Android工具
- Java
- ...
这样便生成了一个包含我所需的Cordova环境的镜像:
$ docker run -i
--privileged
-v /dev/bus/usb:/dev/bus/usb
-v $(pwd):/app
-p 8001:8000
lighta971/cordova-env
我在cvd
中设置了别名:
$ alias cdv='docker run -i --privileged -v /dev/bus/usb:/dev/bus/usb -v $(pwd):/app -p 8001:8000 lighta971/cordova-env'
现在我可以透明地使用容器内的所有程序,就像它们安装在我的系统上一样。例如:
$ cdv adb devices
$ cdv cordova build android
$ cdv cordova run android
$ cdv npm update
由于卷挂载选项
$(pwd):/app
,所有这些命令将在当前目录中工作。
Dockerfile
尽管如此,还有其他需要了解的事情,例如:
- 理解构建过程以制作高效的镜像
- 处理持久数据的需求
- 保持镜像包更新
- 等等。
希望这对你清楚明白 :)