前言

模型推理服务需要用Docker进行部署,所以记录了Docker学习过程中的八大问题。
项目需求:将Flask服务用Docker打包成镜像。
个人环境:Python 3.8(in WSL2)、VSCode(Docker插件)、Docker Desktop。
概念理解:Docker的Image相当于一个装好运行环境和代码的虚拟机镜像,Container相当于基于镜像实例化运行的容器。

一、Docker如何安装和启动?

参考:Ubuntu Docker 安装 | 菜鸟教程
需要把自己加入sudoers,获取sudo权限,如果不想每次输入命令都加sudo,那就新建一个用户组docker,把自己放进去,方法如下。(On Linux, you should enable rootless Docker (more secure) or enable Docker CLI for the non-root user account (less secure) that will be used to run VS Code)。
第一步,创建docker组:

 sudo groupadd docker

第二步,把自个儿加进去($USER可换成自己用户名):

 sudo usermod -aG docker $USER

第三步,使分组生效:

 newgrp docker

第四步,在.bashrc加入:

# Switch groups, but only if necessary
if [[ `id -gn` != "mygroup" ]]
thennewgrp mygroupexit
fi

或在.bash_profile加入:newgrp docker
使得登录/开终端时自动切到docker用户组。source一下。

从此,往下的代码前面就都不用带sudo了。

接下来执行安装命令:

curl -sSL https://get.daocloud.io/docker | sh

重新加载配置文件(每次有修改docker.service文件时都要重新加载下)

systemctl daemon-reload

启动docker

systemctl start docker

设置开机启动

systemctl enable docker.service

二、Docker有哪些常用命令?

(1)docker logs [container_id]:查看某容器的log;
(2)docker ps -a:列出本地所有的容器;
(3)docker images: 列出本地所有的镜像;
(4)docker rm -f [container_id]:删除容器
(5)docker rmi [image_id]:删除镜像
(6)docker info:看docker信息(比如存储路径)
(7)systemctl status docker:查看docker服务状态
(8)docker start [containerID]:启动一个已经创建的容器
(9)docker attach [containerID]:进入这个容器(得启动起来)
(10)docker cp xxx.sh [containerID]:/myCodePath/:修改容器中的代码(本机修改 覆盖进去)

三、Dockerfile的规则有哪些?

生成镜像需要在项目路径下放个Dockerfile文件,规则如下:

# 指定python基础镜像版本
FROM python:3.8-slim-buster
# 在我们的镜像里创建docker_test文件夹
RUN mkdir /code
# app文件夹、requirements.txt、run.sh 拷到docker_test下
# !!! 注意:【COPY 文件夹】仅拷贝文件夹内容,不拷贝文件夹本身
COPY app /code
COPY requirements.txt /code
COPY run.sh /code
# 安装依赖(-m是将模块当做脚本去启动)
RUN python -m pip install -r /code/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
# 程序对外暴露的接口(不是镜像暴露的接口)
EXPOSE 5086
# 使用 WORKDIR 指令可以来指定工作目录(或者称为当前目录)
# 以后代码里各层的当前目录就被改为指定的目录(run.py所在的目录)
# 如该目录不存在,WORKDIR 会帮你建立目录
WORKDIR /code
# entrypoint是容器入口
ENTRYPOINT  ["/bin/bash", "/code/run.sh"]

备注1:生成requirements.txt:pip list --format=freeze > requirements.txt
备注2:最后是ENTRYPOINT ,开始写成了CMD导致找了半天原因

四、镜像、容器如何构建和运行?

用命令 / 插件 / Desktop 均可,以下用命令方式。
创建镜像(最后 . 是Dockerfile存放的文件夹) :

–tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签

docker build -t flask_docker:v1.210809 .

基于刚才的镜像创建container并运行:

-i: 以交互模式运行容器,通常与 -t 同时使用;
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-d: 后台运行容器,并返回容器ID;

docker run -d -p(指定端口映射) 主机(宿主)端口:容器(Flask)端口 --name flask_docker_container(容器名) [image_id](镜像id)
docker run -it -p(指定端口映射) 主机(宿主)端口:容器(Flask)端口 --name flask_docker_container(容器名) [image_id](镜像id)
[示例] docker run -d -p 6666:5086 --name flask_docker_container 4ef8fd5235ff

输出容器id:537de0b02b5253fb7e358f67246e1787500ff5b250847e733b0ac4c16650ce92
参考:Docker run 命令 | 菜鸟教程 (runoob.com)

以命令行方式进入这个容器:

docker exec -it [container_id] /bin/bash

执行报错:

“docker exec” requires at least 2 arguments.
See ‘docker exec --help’.
Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG…]
Run a command in a running container

解决方案:把 /bin/bash 换成 bash

如图,根目录下/code就是执行Dockerfile后构建的项目路径!

五、容器内Flask程序的运行:如何进行端口映射?

docker run执行完,其实就成功映射端口,访问一下,发现并不能访问
解决:首先看了看ip,用telnet命令通信测试一下,发现无法通信

Docker速成过程中遇到的八个问题相关推荐

  1. docker使用过程中遇到的Linux中的su命令

    遇到的Linux中的su命令 linux环境下,常常需要我们切换用户,通过不同的权限,可以控制系统的安全性.所以例如ES会明确要求不能用root用户进行开发. 于是我们需要使用su命令切换用户. 然而 ...

  2. docker build过程中出错 no such host

    在pycharm 中安装了阿里云的插件,但是在run的时候,报错 dial tcp: lookup registroy.cn-shanghai.aliyuncs.com: no such host 找 ...

  3. 解决Docker安装过程中yum源错误的“UnicodeEncodeError: ‘ascii‘ codec can‘t encode charact u‘\ufffd‘ in position“问题

    背景 在安装Docker时,使用yum包管理器可能会遇到以下类似的错误信息: Traceback (most recent call last): File "/usr/bin/yum&qu ...

  4. docker push 过程 distribution源码 分析

    docker push 过程 distribution源码分析 承接上一篇"distribution structure and start up 分析"本文分析一下distrib ...

  5. 活动目录在构建核心过程中的八个关键点(下)

    活动目录是一个面向Windows Server级别的目录服务.在之前的博客文章中介绍了活动目录设计中需要遵循的七个原则,今天在这里讲解有关<活动目录构建核心关键点>. 全文请见专题:htt ...

  6. linux脚本执行过程中被挂起,Linux学习笔记(八)——脚本执行的过程控制

    一.脚本执行过程中的控制 之前的内容中,运行编写好的脚本时都是在命令行上直接确定运行的,并且运行的脚本是实时的,这并不是脚本唯一的运行方式,下面的内容是脚本的其他运行方式.例如在Linux系统中如何控 ...

  7. 学习Mysql过程中拓展的其他技术栈:Docker入门介绍

    一.Docker的介绍和安装 1. Docker是什么 百度百科的介绍: Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linu ...

  8. 红队笔记之反溯源技术在攻防过程中的应用

    反溯源是攻防过程中的重要一环,其主要目的为防止防守方快速找出屏幕后,正在抠脚的你.渗透过程中有没有"事了拂衣去"的洒脱,很大程度在于过程中反溯源技术的应用程度.下文为笔者对于溯源技 ...

  9. kubernetes-二进制安装,亲测无坑,在参考安装过程中如果有什么问题欢迎交流,超级详细的文档

    Kubernetes环境搭建(手动K8s集群安装配置.服务部署和管理使用详细步骤,入门K8s容器云平台架构) 前言 说明: 本博客是教大家如何手动搭建kubernetes集群(业内简称K8s),包括集 ...

最新文章

  1. 大数据领域75个核心术语讲解!
  2. 【Spark亚太研究院系列丛书】Spark实战高手之路-第3章Spark架构设计与编程模型第2节②...
  3. java oracle行锁,Oracle 出现行锁 错误代码 ora-02049
  4. $().each()和$.each()
  5. html图片往左,如何用js把一张图片由右向左展开?
  6. SQL语句增加字段、修改字段、修改类型、修改默认值
  7. 去除aspx生成的页面最开始的空行
  8. Mongodb 账户权限配置
  9. 【STM32】【STM32CubeMX】STM32CubeMX的使用之九:ADC
  10. 整站数据下载工具:SiteSucker for mac
  11. 测试面试题+测试面试宝典(分类版)
  12. 这就是艺术「GitHub 热点速览 v.22.25」
  13. 普元的ajax,普元EOS平台介绍
  14. 大唐杯题库(300道)(一)
  15. yzj学长的即兴发挥
  16. Java 学习 for循环小题目 天朝有一个乞丐姓洪,去天桥要钱第一天要了1块钱第二天要了2块钱第三天要了4块钱第四天要了8块钱以此类推 2n问题: 洪乞丐干10天,收入是多少?
  17. Unity直线轨迹导弹预判
  18. “和合信诺”获启赋资本数千万元Pre-A轮融资-专注监管科技、助力金融业落地监管合规最后一公里
  19. centos安装中文字体
  20. 联通项目中的常见术语(BTS、BSC、MSC、VLR、HLR)

热门文章

  1. PyCharm2019 激活方式
  2. AltiumDesigner快捷键——通用AltiumDesigner环境快捷键和常用编辑快捷键
  3. 查询课程名称为“数学“,且分数低于60的学生姓名和分数
  4. Hive sql 常用命令总结
  5. 剑指Offer——联通研究院笔、面试题 (Offer-1已收割)
  6. NOI2018金色记
  7. Sqoop分批导入Mysql上亿条数据的表到HDFS
  8. vc webbrowser请求页面
  9. 手把手教你开发Pro/TOOLKIT应用程序(一)
  10. Android高效旋转图片的方式