使用 docker 创建一个静态网站
将 docker 作为本地 web 开发环境是使用 docker 的最简单情况,可以完全实现生产环境,保证开发环境和部署环境一致,下面讲创建一个简单的网站 sample。
通过 Dockerfile 创建 sample website
- 创建工作目录
|
|
- 创建 nginx 配置文件
|
|
- 编写 Dockerfile
|
|
Dockerfile 内容主要包含下面几项
- 安装 nginx
- 在容器中创建一个目录
/var/www/html
- 将下载的本地 nginx 配置文件添加到镜像中
- 开放镜像的 80 端口
|
|
构建 sample 网站和 nginx 镜像
利用之前的 Dockerfile,可以利用 docker build
命令构建出新的镜像,并将该镜像命名为 czero/nginx:v1
通过 docker history
可以看到构建过程
|
|
从 sample 网站和 nginx 镜像构建容器
使用 czero/nginx:v1 镜像,构建容器
- 生成网站首页
|
|
- 创建容器
|
|
在执行docker run
命令时,会创建一个 blog 容器,-v
选项允许将宿主机的目录挂载到容器中,然后会传入 nginx
启动命令,让 ningx 启动后已交互模式在前台运行。
卷在 docker 中非常有用,卷是一个或者多个容器内被选定的目录,可以绕过分层的联合文件系统,为 docker 提供持久数据或者共享数据,对卷的修改会直接生效,并会绕过镜像,当提交或者创建镜像时,卷不会被包含在镜像中。利用卷可以实现不想把代码或者应用等构建到镜像中,或者是希望同时对代码做开发和测试、代码频繁改动,不想在开发过程中重新构建镜像、希望在多个容器中共享代码。
-v
参数指定了卷的源目录和容器里的目的目录,这两个目录通过:
分隔,如果目的目录不存在,docker 会自动创建。也可以在目的目录后面添加rw、ro
来指定目录的读写状态-p
参数指定了将容器内部的端口映射到本地的指定端口,本地端口:容器端口
,可以不指定本地端口。
- 查看容器
通过docker ps
命令可以查看正在运行的容器,可以看到 blog 容器正在活跃状态,并将 80 端口映射到本地的 80端口。
使用 docker 构建一个 web 应用
现在构建一个更大的 web 应用,一个基于 sinatra 的 web 应用。
构建 sinatra 应用程序
- 创建 Dockerfile 文件
|
|
- 构建 docker 镜像
|
|
创建 sinatra 容器
- 下载 sinatra web 应用代码
|
|
- 创建 docker 容器
|
|
Dockerfile 中的 CMD
指令,会让镜像启动容器时,执行该命令
- 查看容器执行命令的输出
|
|
在运行 docker logs
命令时,加上-f
参数,会持续食醋胡容器的 stderr
和 stdout
- 查看 docker 容器中正在运行的程序
|
|
- 查看 docekr 容器端口映射
|
|
- 访问 sinatra
sinatra 应用只接受输入参数,并将输入转成 JSON 输出
构建 Redis 镜像和容器
扩展 sinatra 应用程序,在后端加入 redis 数据库,并在数据库中存入输入参数。构建全新的镜像和容器运行 redis 数据库,通过 docker 管理两个容器。
- 创建Dockerfile
|
|
- 生成镜像1docker build -t czero/redis:v1 .
dockerfile 指定安装 redis 服务,开放 6379 端口,并启动 redis 服务
- 创建容器
|
|
- 测试连接 redis
|
|
连接到 redis 容器
连接到 docker 容器有两种方式,
- ip地址方式
- docker link功能
ip 方式连接
查看 容器 IP 信息
安装docker时,会创建一个名为 docker0
的网卡,主机上的容器都会在这个网卡上分配到一个地址,docker0 网卡,拥有一个私有IP段,172.16~172.30
,网卡是一个虚拟的以太网桥,用于连接本地忘了和容器网络,在容器中,会以veth
开头来命令网卡,并随机分配到一个 ip 地址,当知道了容器的ip,两个容器便可以通过 IP及端口相互访问,但是这种方式有个缺点。由于容器的 ip 地址是由 docker0
网卡分配的 ip 地址,当容器被重启,容器本身的 ip 地址会改变,这样当两个容量使用固定 ip 地址方式访问,这样便会连接不上。
通过 link 连接 容器
- 删除掉之前的容器
|
|
- 创建新的 redis 容器
|
|
- 创建 web 应用连接 redis
|
|
--link
标志创建两连个容器间父子连接,这个标志需要两个参数: 一个是要连接的容器名称,另外一个便是连接后容器的别名 ,上面列子便是连接到 sinatra_redis
容器,并使用 db
作为别名。别名可以访问公开的信息,而无需关注底层容器的名字。连接让父容器可以访问子容器,并且把子容器的一些连接细节分给父容器。
这样会在安全性上得到提高,在启动 redis 时,并没有使用 -p
开放容器端口,当使用--link
时,可以让父容器直接访问子容器的开放端口。在启动容器守护进程时,如果加上 --ice=false
便会关闭所有没有连接的容器通信。被连接的容器要求必须是同一主机上的容器,不同主机上的容器不能连接
在创建两个容器连接后,会在两个地方写入连接信息
- /etc/hosts 文件
|
|
- 包含连接信息的环境变量中
|
|
- 容器应用通信
使用 host 或者 ENV 给应用加入连接信息,例如
在docker run 命令中加入 –dns 或者 –dns-search 标志可以为容器定义dns
再次使用curl
命令测试 sinatra 程序
再次确认 redis 是否收到更新