1 项目背景
1.1 请求与响应
使用restbed库完成基于REST风格的HTTP请求和响应【Restbed 框架为 C++11 构建的程序带来了 restful 功能,它基于 boost.asio 创建。】 完成POST、GET、DELETE、PUT请求,遵循REST的风格
1.2 数据存储
简便起见,本次后台的数据存储在文件中,主要涉及文本文件的操作,不涉及数据库的操作
2 搭建开发环境
基于镜像创建容器,然后在容器中进行代码开发。
2.1 创建容器
1 查看镜像docker images使用的基础镜像如下
xxxxxxxxxxxx 1.1.3 9cad6bb8b6ca 6 months ago
2 使用xxxxx创建容器
按照实际情况一般默认
网络选择桥接模式
注意APP服务端口号不要冲突,一般需要更改
3 容器的一些操作
查看正在运行的容器
docker ps
查看运行包括停止的容器
docker ps -a
停止运行的容器
docker stop id
删除容器
docker rm id
查看容器的详细信息
docker container inspect id (可以查看目录挂载信息)
进入我创建的容器
docker exec –it id /bin/bash
容器的数据卷:
容器挂载了多个数据卷,数据卷内部是同步的,不同数据卷之间是相互隔离的
一个设置为日志的挂载目录:容器内/var/log/和本机的/var/log/同步
一个设置为项目开发的挂载目录:容器内/workspace和本机的/home/xxxxx/workspace同步
"Mounts": [
{
"Type": "bind",
"Source": "/var/log/",
"Destination": "/var/log/",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/home/xxxxxx/workspace",
"Destination": "/workspace",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
2.2 vscode远程连接入容器
-
本地启动docker服务 本地安装docker步骤
1、下载 docker.exe ,放到任意 PATH 包含的路径(系统环境变量那里,配置完成后cmd中能执行)就可以了。适用于win7 及以上的系统。链接:https://github.com/StefanScherer/docker-cli-builder/releases/
2、本地配置docker
创建一个context:
docker context create dockerservice1 --docker "host=ssh://hostname@ip:port"
切换到该context:
docker context use dockerservice1
测试验证:
docker info 如果执行成功,会输出和在远程主机运行 docker info 一样的结果。实际上这里 docker ,会把命令传输到远程主机执行,并把远程主机上的执行结果在本地显示。
设置ssh免密登陆
1、 生成本机公、私钥: ssh-keygen -t rsab
2、 拷贝公钥 id_rsa.pub 到远程主机
3、 添加到认证文件: cat id_rsa.pub >> .ssh/authorized_keys
-
vscode安装远程连接的插件,remote系列 -
vscode远程连接到docker
3 接口设计
GET /api/v1/item/12
/api/v1/items
POST /api/v1/item/
PUT /api/v1/item/3
DELETE /api/v1/item/2
http://127.0.0.1:80/api/v1/item
4 前端开发
这里使用postman来发送http请求
5 后端开发
主要过程:
- 通过restbed库获取request的内容,是get这类方法就从url中获取,是post方法,就从body中获取参数
- 进行数据格式的转换,转为后台需要的数据结构
- 进行存储,存储到文件或数据库中
- 重构优化,多文件
6 测试部署
6.1 编译项目
g++ -o web webserver.cpp ../service/method.cpp -l restbed -l jsoncpp
../web
6.2 测试项目
参照前端开发,通过postman发送各个方法的请求,测试响应结果是否是期待的
6.3 部署项目
通过编写dockerfile,将项目放到docker镜像中,build生成docker镜像。 运行包含这个项目的容器,容器启动自动启动服务。
6.3.1 编写dockerfile
# 设置基础构建镜像
FROM xxxxxxxxx1.1.3
# 设置创建者的基本信息
MAINTAINER xxxxxx@xxxxxx.com
# 项目ADD到容器中
ADD webdemo.tar.gz /workspace
# CD到工作目录
WORKDIR /workspace/webdemo/controller
# 暴露端口 容器打算使用8080端口
EXPOSE 8080
# 进行编译
RUN g++ -o web webserver.cpp ../service/method.cpp -l restbed -l jsoncpp
# 运行
CMD ["./web"]
注意: 这里暴露的端口是我们服务发布的端口,不然到时候无法访问我们的服务。 此外这里EXPOSE只是声明,运行容器的时候要显式指定-p指定宿主机的端口和容器端口的映射 如:docker run -d -p 8064:80 --net=bridge --name=hcy_test hcy_test_webdemo:1.0
6.3.2 通过dockerfile创建docker容器
docker build -f ./Dockerfile -t hcy_test_webdemo:1.0 . 参数说明: -f指定dockerfile的路径 -t指定镜像的tag名称 . 代表上下文路径
6.3.3 查看镜像
docker images
6.3.4 通过镜像实例化一个容器
docker run -d -p 8064:80 --net=bridge --name=hcy_test hcy_test_webdemo:1.0 参数说明: –detach -d 在后台运行容器,并且打印容器id。 -p port端口映射 宿主机端口:容器端口
6.3.5 查看容器内进程服务是否启动
docker top id
6.3.6 (可选)进入容器
docker exec -it id /bin/bash 参数说明: –interactiv -i即使没有连接,也要保持标准输入保持打开状态,一般与 -t 连用。 –tty -t分配一个伪tty,一般与 -i 连用。
6.4 再次测试
6.4.1 进入容器测试web服务
进入容器:docker exec –it id /bin/bash 如: curl -X GET “http://127.0.0.1:80/api/v1/items”
6.4.2 进入宿主机测试web服务
如: curl -X GET “http://127.0.0.1:8064/api/v1/items”
6.4.3 远程主机测试web访问
如: curl -X GET “http://10.67.43.10:8094/api/v1/items”
|