docker从入门到实践

2023-11-13

  本文的主要目的是帮助零基础的读者快速上手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所在的目录)
Alt

2.6.运行镜像

运行刚才生成的镜像,创建容器,完成接口的运行与部署。

docker run -itd -p 4000:80 hello

Alt
-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测试结果可以看到,我们之前的修改已经起作用了
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

docker从入门到实践 的相关文章

随机推荐

  • Linux: USB Gadget 驱动简介

    文章目录 1 前言 2 背景 3 USB Gadget 驱动 3 1 什么是 USB Gadget 驱动 3 2 USB Gadget 驱动框架 3 3 USB 设备控制器 UDC 驱动 3 3 1 USB 设备控制器 UDC 驱动 概述
  • Eggjs 从放弃到开始使用

    原文 codesky me archives eg 用掘金刊登虽然分流了但是主要是 现在分享的曝光率实在太低了 所以 支持的请点下原博收藏下关注下以及我的微博 咦 这篇文章标题为什么反了 实际上这是个人走过的心路历程 最初看到 eggjs
  • FastDFS的Tracker及Storage节点添加及删除

    1 增加Storage节点 通过配置 自动加入 1 安装Storage并配置mod fastdfs conf及storage conf 设置fdfs storaged及nginx自启动 2 启动新加的storage节点 会自动同步相同gro
  • openGL之API学习(四)纹理操作

    纹理操作代码流程 向着色器传递纹理单元 glUniform1i gSampler 0 向GPU上传纹理数据 GLuint m textureObj glGenTextures 1 m textureObj 生成一个纹理对象 一个纹理对象有多
  • 谁会嫌钱多啊,最适合打工人小白的Python兼职攻略以及接私活经验!

    这次小编想谈谈一个非常热门的话题 就是如何在学习python的同时去赚钱 在这篇文章中 你会学习到如何通过学习python来赚取副业收入 相信大家都对钱感兴趣吧 如果你和马云爸爸对钱不敢兴趣的话 那这篇文章就不适合你了 如果你想知道如何使用
  • 计算机英语-基础知识

    计算机专业英语基础知识 1 专业英语的专业性和客观性 科技文章属于严肃的书面语体 崇尚严谨周密 逻辑性强 要求层次分明 重点突出 各个领域的专业英语都以表达科技概念 理论和事实为主要目的 因此 它们很注重客观事实和真相 要求逻辑性强 条理规
  • APISIX源码解析-插件-客户端IP【real-ip】

    real ip 客户端IP插件 关键属性 源码解析 real ip 插件用于动态改变传递到 APISIX 的客户端的 IP 和端口 local function get addr conf ctx if conf source http x
  • 卷运维不如卷网络安全

    最近发现很多从事运维的选择了辞职 重新规划自己的职业发展方向 运维工程师这个岗位在IT行业里面确实是处于最底层的 不管什么环节出现问题 基本都是运维背锅 背锅也就罢了 薪资水平也比不上别的岗位 一般运维的薪资水平大多数都是6 9K 还要高频
  • 【Rust】用RefCell避开`&mut XX`导致的借用检查

    derive Debug struct WhatAboutThis lt a gt name String nickname Option lt a str gt impl lt a gt WhatAboutThis lt a gt fn
  • 什么是本地储存?

    本地储存的作用 把一些数据记录在浏览器中 是浏览器提供给我们的一些本地存储数据的机制 localStorage 永久缓存 除非手动删除 sessionStorage 会话缓存 关闭浏览器就没有了 共同点 只能存储字符串格式的数据 local
  • 爬虫最快框架collyx,今天开源了...

    作者 TheWeiJun 工欲善其事 必先利其器 大家好 我是TheWeiJun 之前接触colly时 写过一篇关于colly框架的文章 由于当时能力有限加上时间不够充足 一直没能够去研究这个框架 后来经过3个多月的不断尝试完善 基于col
  • int类型数据相乘,溢出问题,负号变正号

    int相乘 不做强转的话 结果为int 溢出会出现结果不正确的情况 下面方法是个坑儿 如果要使用 需加强转 获取和日期间隔一定时间的时期 适合计算短时间间隔的情况 长时间间隔会出现溢出问题 影响正负号 方法待删除 param d1 para
  • UE4和C++ 开发-新手常用C++API

    C 暴露给蓝图可编辑 UCLASS Blueprintable 创建FString FString Printf TEXT aa bb 蓝图调用变量 UCLASS ClassGroup Custom meta BlueprintSpawna
  • Android使用Direct Textures提高glReadPixels、glTexImage2D性能

    from https www jianshu com p 1fa36461fc6f Android使用Direct Textures提高glReadPixels glTexImage2D性能 熊皮皮 关注 2017 02 05 15 52
  • weblogic双机(多机)集群搭建

    进去正题 1 创建集群 点击 锁定并编辑 选择 环境 gt 群集 gt 新建 gt 集群 填写 名称 选择 单点传送 点击 确定 集群创建完成 建议名称为 CLuster 项目名 一个项目配置一个集群环境 2 创建计算机 Machine 选
  • windows下的C++ socket服务器(1)

    windows下的C socket服务器 1 windows下的一个C socket服务器 用到了C 11的相关内容 现在还不是很完善 以后会不断改进的 include
  • 【已解决】android7.0以上使用charles抓HTTPS包报错certificate_unknown

    手机上是否有装证书都可以使用下面的方法 在你的AndroidManifest xml文件中添加如下配置
  • java Swing 时间选择器控件

    效果图 简要说明 一个视图类 HongYeLingGuDate 一个抽象接口 SelectHYDateAbstract 需要导入的jar包 http download csdn net detail male09 9884835 中的 fl
  • keil5报错:* RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT; USED: 08B5H BYTE (108%) *保姆级教程

    项目场景 keil uVsion5的编译的时代码的字节过大出现 问题描述 RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT 原因分析 原因就是你的keil为2048字节代码限制的版本 而你
  • docker从入门到实践

    本文的主要目的是帮助零基础的读者快速上手docker 并掌握一些相关的常见命令 同时 本文也是作者对学习docker的一个笔记记录 本文主要是从实例出发 讲解一些docker的基本操作 若有不妥或错误之处 烦请指出 不胜感激 PS 关于do