优雅的使用Docker部署Restful Server
Use Docker Deploy WebServer
本文解决如下问题
- 问题1,如何通过docker启动命令直接运行容器里的webserver
- 问题2,对于问题1,如何后台运行
- 问题3,运行后如何查看终端输出的日志
通过docker启动命令直接运行容器里的webserver
首先看看docker run的帮助文档
$ docker run --help
Usage: docker run [OPTIONS] IMAGE COMMAND [ARG...]
这里有一个参数是COMMAND,是在启动容器的时候要执行的命令,这个命令是在容器里运行的
这个COMMAND参数也可以不在命令行里写,可以直接写在Dockerfile里
# 如下内容写到Dockerfile的最后一行
CMD ["sh", "/root/app/start.sh"]
使用如下docker命令直接运行容器里的webserver
$ docker run -it -name=CONTAINER_NAME -v /YOUR_DIR/:/root/app/ -p 8602:7602 IMAGE_NAME
实战示例
这里分别采用了Golang, Python, 实现一个简单的Webserver,并实现通过docker的run命令直接运行容器里的webserver。
Go 语言示例
由于Golang是编译型语言,运行环境无需安装Golang的开发环境,直接将交叉编译好的二进制文件挂载到容器运行就可以了,这里我们选择Docker镜像中较小的镜像Alpine Linux(中文名:阿尔卑斯Linux),Dockerfile 如下:
# 基于最新版的alpine
FROM alpine
# 设置工作目录
RUN mkdir -p /root/app
WORKDIR /root/app
# 生成默认start文件
RUN echo "echo \"please load you start script on /root/app/start.sh \n \
content example: \n \
python manager.py\"" > /root/app/start.sh
# 设置启动容器时启动的命令
CMD ["sh", "/root/app/start.sh"]
编译Dockerfile
-
创建工作目录及Dockerfile
$ mkdir -p $HOME/Desktop/golang_base $ cd $HOME/Desktop/golang_base $ vi Dockerfile
-
编写Dockerfile并保存
-
编译Dockerfile
$ docker build -t golang_base .
-
查看编译结果
$ docker images | grep golang_base golang_base latest 30a109c26c58 About an hour ago 3.97MB
可以看到我这里编译好的镜像仅有3.97MB
创建简单的Golang webserver
package main
import (
"fmt"
"net/http"
)
func main() {
//第一个参数是接口名,第二个参数 http handle func
http.HandleFunc("/", helloWorld)
fmt.Println("Server is Started, URL is http://127.0.0.1:8081")
//服务器要监听的主机地址和端口号
http.ListenAndServe("0.0.0.0:8081", nil)
}
// http handle func
func helloWorld(rw http.ResponseWriter, req *http.Request) {
// 返回字符串 "Hello world"
fmt.Fprint(rw, "Hello world\n")
fmt.Println(req)
}
交叉编译为linux-amd64
$ GOOS="linux" GOARCH="amd64" go build -x
其中GOOS="linux"
设置程序构建环境的目标操作系统为linux
, GOARCH="amd64"
设置程序构建环境的目标计算架构为amd64
,go build -x
为编译当前路径下的*.go
文件, -x
是显示编译过程。编译成功后就可以看到当前目录下多了一个helloGoServe
文件,约5MB左右。可以直接下载我编译好的helloGoServe。
编写start.sh文件
$ vi start.sh
输入如下内容:
sh -c /root/app/helloGoServe
启动docker容器
使用如下命令启动docker容器
$ docker run -it --name=golang_server_8081 -v $HOME/Desktop/golang_base/:/root/app/ -p 8081:8081 golang_base
Server is Started, URL is http://127.0.0.1:8081
出现Server is Started, URL is http://127.0.0.1:8081
证明容器已经启动成功,并可以在前台显示请求的logs
Python Flask 示例
docker命令后台运行webserver
上
docker 容器-d后台运行后日志文件查看
1 。docker logs 容器ID
2 。docker inspect 容器ID
找到logpath 可以看到log的位置
我的log位置命名如下:
/mnt/sda1/var/lib/docker/containers/容器完整64位ID/容器完整64位ID-json.log
docker run -d --name=auto_run -v /Users/itaa/Documents/MYCode/jarvis-data_svn/tags/DOCKER_TEST/:/jarvis/app/ -p 8602:7602 auto_run