构建 Sinatra 应用程序
创建文件夹:
mkdir sample01 && cd sample01
touch Dockerfile
编辑 Dockerfile :
FROM ubuntu:18.04
MAINTAINER nikki nikki@example.com
ENV REFRESHED_AT 2019-10-19
RUN apt-get update
RUN apt-get -y install ruby-full
RUN apt-get -y install build-essential redis-tools
RUN gem install --no-rdoc --no-ri sinatra json redis
RUN mkdir -p /opt/webapp
EXPOSE 4567
CMD [ "/opt/webapp/bin/webapp" ]
Dockerfile 依旧完成了一些安装任务,并在最后使用 CMD 指定 /opt/webapp/bin/webapp 作为 Web 应用程序的启动文件
构建:
sudo docker build -t nikki01/sinatra .
创建 Sinatra 容器
创建镜像之后,下载 Sinatra Web 应用程序的源代码,因为原书给的链接失效了,所以我将整本书的代码都下载下来
链接:https://pan.baidu.com/s/1mw_I0mBv6n78N2UGDTW_DQ&shfl=sharepset
提取码:m68w
这里用到的文件目录在:
dockerbook-code-master/code/5/sinatra
找到其中的 webapp 目录,将其复制到 sample01 中并查看:
ls -l webapp
应该有 bin、lib、Dockerfile 三个文件夹
给其中的文件添加可执行权限:
chmod +x $PWD/webapp/bin/webapp
使用 docker run 从镜像创建一个新容器:
sudo docker run -d -p 4567 --name webapp -v $PWD/webapp:/opt/webapp nikki01/sinatra
这里从 nikki01/sinatra 镜像创建了一个新的名为 webapp 的容器,指定了一个新卷 $PWD/webapp 存放新的 Sinatra Web 应用程序,并将这个卷挂载到在 Dockerfile 里创建的目录 /opt/webapp
CMD 指令指定了要运行的命令,此时可以使用 docker logs 查看输出:
sudo docker logs webapp
使用 docker top 命令查看 Docker 容器里正在运行的进程:
sudo docker top webapp
查看刚才指定的端口映射到本地宿主机的哪个端口:
sudo docker port webapp 4567
在我的机器上是映射到 32772
目前的 Sinatra 应用没做什么,只是接受输入参数,可以使用 curl 命令(先确保安装了 curl)测试这个程序:
curl -i -H 'Accept:application/json' -d 'name=Foo&status=Bar' http://localhost:32772/json
可以看到,传入的参数转化成 JSON 散列后的输出:{“name”:“Foo”,“status”:“Bar”}
构建 Redis 镜像和容器
现在我们要扩展 Sinatra 应用程序,加入 Redis 后端数据库,并在 Redis 数据库中存储输入的参数,因此需要构建全新的镜像和容器运行 Redis 数据库,之后利用 Docker 的特性关联两个容器
创建一个新的镜像:
mkdir sample02 && cd sample02
touch Dockerfile
Dockerfile 内容如下:
FROM ubuntu:18.04
MAINTAINER nikki nikki@example.com
ENV REFRESHED_AT 2019-10-20
RUN apt-get update
RUN apt-get -y install redis-serve