本文的主要目的是帮助零基础的读者快速上手docker,并掌握一些相关的常见命令。同时,本文也是作者对学习docker的一个笔记记录。本文主要是从实例出发,讲解一些docker的基本操作,若有不妥或错误之处,烦请指出,不胜感激!
PS:关于docker的原理性的介绍不在本文范围内,只要记住一点:docker是一个独立的小型操作系统,可配置各种环境以满足你的代码需求。
操作系统:Centos7.2
1.docker安装
docker的安装比较简单,具体安装方式可参考https://blog.csdn.net/ywd1992/article/details/82897394。
2.docker单文档实例
网上介绍docker的操作都是从单个文档开始的,也即只有一个代码文件,本实例实现一个python的对外api接口。
2.1.新建目录
新建文件主要是为了将一个项目放到一起
mkdir docker_test
2.2.编写项目代码文件
新建app.py文件,主要功能是对外输出"hello world"
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return 'hello world.'
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
2.3.编写python依赖包文件
新建requirements.txt文件
Flask
2.4.编写Dockerfile文件
FROM python:3.6.5
WORKDIR /app
ADD . /app
RUN python -m pip install --upgrade pip
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
CMD ["python3", "app.py"]
下面分别简要介绍上三个文件(app.py、requirements.txt和Dockerfile)的作用:
app.py:python代码文件,用以对外提供api服务
requirements.txt:python代码文件所依赖的python包
Dockerfile:将项目编译成镜像(images)所需的文件
2.5.生成镜像
docker build -t hello .
PS:最后一个点(.)不要掉了,其中hello是编译后的镜像名,.表示当前目录(也即Dockerfile所在的目录)
2.6.运行镜像
运行刚才生成的镜像,创建容器,完成接口的运行与部署。
docker run -itd -p 4000:80 hello
-it 表示交互的方式运行,一般api接口都是这种方式,d表示后台运行,
-p 4000:80 表示将容器(container)中的80端口映射到本机的4000端口
hello 表示待运行的镜像
docker ps 表示列出已创建的容器
2.7.测试api服务
利用浏览器或者postman访问 ip:4000
浏览器测试结果
postman访问结果
2.8.导出/导入镜像
如果需要docker镜像打包放到另外的机器(已安装docker)上运行,则需要将镜像导出
docker save hello -o hello.tar
其中,hello为镜像名,hello.tar为保存的文件名
将hello.tar拷贝到目标机器上后,需要将其加载到docker镜像中
docker load -i hello.tar
3、docker多文档实例
多文档与单文档的区别就在于Dockerfile文件,下面就以一个时间识别的常规算法接口来说明多文档的Dockerfile文件。
3.1.新建目录
mkdir many_file
项目文件如下
其中,jieba分词通过源码安装
3.2.编写Dockerfiile文件
# 基于镜像基础
FROM python:3.6.5
# 设置代码文件夹工作目录 /app
WORKDIR /app/jieba
# 复制当前代码文件到容器中 /app
ADD ./jieba /app/jieba
ADD ./recognize_time /app/recognize_time
# 安装所需的包
RUN python3 setup.py install
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple Flask==1.0.2
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple Flask-Cors==3.0.7
# WORKDIR可以多次设置不同的值,主要是跳转到指定的目录下,但是此处不可以用RUN cd /app/recognize_time/demo_http,因为RUN只在当前一条语句起作用,后面的语句执行时的当前目录还是WORKDIR所指向的目录
WORKDIR /app/recognize_time/demo_http
# Run app.py when the container launches
CMD ["python3", "demo_http.py"]
3.3.生成镜像
将项目编译成docker镜像
docker build -t recognize_time:v1
其中recognize_time是镜像名,v1指的是tag值,可以当作版本号。镜像名相同,但tag值不同,也是不同的镜像,相当于不同的版本。
编译完成后,生成镜像recognize_time
3.4.运行镜像
运行刚才生成的镜像,创建容器,完成接口的运行与部署。
docker run -itd -p 4001:4001 recognize_time:v1
3.5.测试api服务
利用postman测试结果
4、修改docker容器内的代码
有时候代码编译成docker镜像,并创建容器运行后发现测试结果有问题需要修改docker容器内的代码,此时需要将容器内的代码文件替换掉(容器内没有安装vim编辑器),然后重新编译成镜像,从而运行新镜像,即可达到预期效果。
下面通过修改api接口的输出来演示实际操作步骤:
4.1.文件修改
准备修改之后的文件demo_http2.py
4.2.拷贝文件到容器
将修改后的文件拷贝到运行中的容器
docker cp ./demo_http2.py 5aa17b21bb88:/app/recognize_time/demo_http
5aa17b21bb88 表示容器id,可通过docker ps 命令查看
4.3.替换文件
进入容器,替换文件
docker exec -it 5aa17b21bb88 /bin/bash
PS:也可以直接在步骤2中将源文件覆盖(文件名一样就行)。
可以看到容器内已经有demo_http2.py文件了,现在需要将demo_http2.py更名为demo_http.py
可通过Ctrl+c退出容器
4.4.重新生成镜像
提交修改后的信息,重新生成镜像
docker commit -m "update code in container" -a "tianyunzqs" 5aa17b21bb88 recognize_time:v2
-m 表示更新说明
-a 代表修改人信息
v2 表示第二版
可以看到,我们已成功生成了新的镜像
4.5.停止旧容器
在运行新镜像之前,需要将之前旧的接口服务停止,也即停止旧的容器。
docker stop 5aa17b21bb88
4.6.运行新镜像
运行新镜像,创建容器
docker run -itd -p 4001:4001 recognize_time:v2
此处一定要注意是v2,v1是修改之前的版本
4.7.测试api服务
利用postman测试结果可以看到,我们之前的修改已经起作用了