社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

实践教程|Docker使用记录

极市平台 • 2 年前 • 182 次点击  
↑ 点击蓝字 关注极市平台

作者 | 小新 
来源 | https://lhyxx.top 
编辑 | 极市平台

极市导读

 

今天初次接触Docker的使用,记录一下自己的学习心得和理解,加深一下印象。 >>加入极市CV技术交流群,走在计算机视觉的最前沿

Dockder是啥?

首先需要理解几个概念:镜像,容器

什么是容器?

简单来说,操作系统在管理进程时,可以把整个操作系统看成一个大的容器,所有的进程在这一个容器中运行。因此这些进程之间有几个特点:

  1. 进程之间能够互相看见,能够通信。这会导致不同进程之间的相互影响。
  2. 所有进程都使用同一个文件系统。这会导致不同进程之间的数据能够被所有进程进行增删改查,可能会造成进程间数据的破坏,从而影响其他进程的正常运行。
  3. 所有进程使用相同的系统资源。(如CPU,内存等),这样导致进程之间存在抢占资源的问题。

所以为了解决上述这些问题,我们需要为某些进程的运行提供独立的运行环境,从而避免它影响其他正常的进程容器的本质目的就是如此。

引用一下对容器的解释:容器就是一个视图隔离、资源可限制、独立文件系统 的进程集合。所谓“视图隔离”就是能够看到部分进程以及具有独立的主机名等;控制资源使用率则是可以对于内存大小以及 CPU 使用个数等进行限制。容器就是一个进程集合,它将系统的其他资源隔离开来,具有自己独立的资源视图。
容器具有一个独立的文件系统,因为使用的是系统的资源,所以在独立的文件系统内不需要具备内核相关的代码或者工具,我们只需要提供容器所需的二进制文件、配置文件以及依赖即可。只要容器运行时所需的文件集合都能够具备,那么这个容器就能够运行起来。

什么是镜像?

我们将这些容器运行时所需要的所有的文件集合称之为容器镜像。(简单来说可以理解为容器运行所需要的所有的依赖文件构成的集合)

那么怎么构建镜像呢?
通常情况下,我们会采用 Dockerfile 来构建镜像,Dockerfile 可以看做是一系列的命令,这些命令都会对已有的文件系统进行操作,这样就会带来文件系统内容的变化,直到最终将容器运行所需的所有依赖文件都构建出来,就构造好了对应的镜像。

“容器”与“VM”

听起来容器和虚拟机(VM)作用非常像。但是想一想他们的差别还是比较明显的:

容器与VM的区别

VM是从操作系统级别上进行隔离,因此隔离程度要大于容器,但也因此需要耗费更多的资源。

容器则比较轻量级,但是隔离效果自然弱于VM。

Docker安装与配置

Windows的安装教程见 https://docs.docker.com/docker-for-windows/install/?spm=5176.12586973.0.0.573c2232pBtzGj,基本上下载安装就好了。

Ubuntu系统上可以直接输入如下命令:

$ sudo apt-get update
$ sudo apt install docker.io

我运行的时候提示缺少containerd,只需要提前运行sudo apt install containerd进行安装就好了。

一些常用的命令

  • 查看所有镜像:docker images
  • 查看当前正在运行的容器:docker ps
  • 查看所有容器(包含已退出的):docker ps \-a
  • 删除镜像:docker rmi 镜像id
  • 删除容器:docker rm 容器id
    (删除镜像时需要先删除使用该镜像的容器)
    (在删除时还可能遇到如下情况,多个镜像id相同,此时可以根据”REPOSITORY”和”TAR”进行删除)
  • 其他命令见"Docker命令大全" —— https://www.runoob.com/docker/docker-command-manual.html 进行查阅。

使用示例

这里以天池比赛的Docker入门赛为例,看一下Docker完整的使用过程。

任务描述

  • 输出Hello world
  • 计算 /tcdata/num_list.csv中一列数字的总和。
  • 在/tcdata/num_list.csv文件中寻找最大的10个数,从大到小生成一个ListList.

num_list.csv文件中只有一列不为负的整数,其中存在重复值。
生成入口脚本run.sh,放置于镜像工作目录。运行后生成结果result.json放置于工作目录(与run.sh同目录),评分系统将根据result.json进行打分。json文件如下所示:

{  
    "Q1":"Hello world"
    "Q2" :sum值, 
    "Q3":[top10_list] 
}

天池的比赛提交规则就是提交一个镜像,要求容器执行之后能够生成比赛要求的包含输出结果的文件,然后根据结果进行成绩判定。
在这里,要输出的结果就是result.json文件。

使用过程

整个过程主要包括:镜像的构建,镜像的推送,提交系统进行判定。

1. 镜像构建

天池已准备了常用的Python基础镜像,可直接拉取使用:docker pull registry.cn-shanghai.aliyuncs.com/tcc-public/python:3
这个过程类似于导入python包一样,在Dockerfile中就可以使用FROM命令来直接使用。

然后我们在一个新文件夹中需要准备的就是如下几个文件:

——
 |-Dockerfile
 |-hello_world.py
 |-run.sh

其中,Dockerfile文件用来构建镜像,示例如下:

# Base Images
## 从天池基础镜像构建
FROM registry.cn-shanghai.aliyuncs.com/tcc-public/python:3

## 把当前文件夹里的文件构建到镜像的根目录下
ADD . /

## 指定默认工作目录为根目录(需要把run.sh和生成的结果文件都放在该文件夹下,提交后才能运行)
WORKDIR /

## 镜像启动后统一执行 sh run.sh
CMD ["sh""run.sh"]

hello_world.py文件就是编写的要实现题目中要求的文件。这里示例如下:

import json
# 要求1的结果
r1 = "Hello world"

# 读取数据
data = []
with open('tcdata/num_list.csv''r', encoding='utf-8'as f:
 for i in f:
  data.append(int(i))

# 要求2的结果
r2 = sum(data)

# 要求3的结果
r3 = sorted(data, reverse=True)[:10]

# 输出结果文件
result = {"Q1": r1, "Q2": r2, "Q3": r3}
with open("result.json"'w', encoding='utf-8'as f:
 json.dump(result, f)

run.sh文件就是一个sh脚本文件,这里的作用就是执行该目录下的hello_world.py文件从而生成结果:

python hello_world.py

2.镜像的推送

天池比赛需要将镜像推送到阿里云镜像仓库进行提交,因此需要先注册一个阿里云的镜像服务(https://www.aliyun.com/product/acr?)免费开通镜像托管。建议设置私有仓库,并一定牢记仓库密码,后续提交需要使用。

开通后进入镜像仓库,创建命名空间以及镜像仓库,仓库类型设为私有,代码源设为本地仓库。

创建成功之后,可以看到详情页,仓库地址一般使用公网地址即可。

然后我们构建我们本地的镜像并推送到仓库中:

  1. 执行docker build -t 仓库地址:版本号 .命令构建镜像。仓库地址是刚刚创建的仓库地址的公网地址,版本号自己命名,用来区分每次构建的镜像。最后的.是构建镜像的路径,因为是当前目录,所以是.,不能省略。

这里参考官方教程 (https://tianchi.aliyun.com/competition/entrance/231759/tab/174?spm=5176.12281978.0.0.37724127ZpsgRZ),假设仓库地址是registry.cn-shenzhen.aliyuncs.com/test_for_tianchi/test_for_tianchi_submit,所以完整命令为:docker build \-t registry.cn-shenzhen.aliyuncs.com/test_for_tianchi/test_for_tianchi_submit

  1. 构建完成后可先验证是否正常运行,正常运行后再进行推送。
    CPU镜像:docker run your_image sh run.sh
    GPU镜像:nvidia-docker run your_image sh run.sh

  2. 推送到镜像仓库 docker push registry.cn-shenzhen.aliyuncs.com/test_for_tianchi/test_for_tianchi_submit:1.0

注意推送之前需要登录登录阿里云Docker Registry:

sudo docker login \--username=用户名 registry.cn-hangzhou.aliyuncs.com

用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。

3.天池系统提交

推送完之后,就可以去天池系统进行提交了。

镜像提交

根据【我的成绩】中的分数和日志可以查看运行情况。

如果觉得有用,就请分享到朋友圈吧!

△点击卡片关注极市平台,获取最新CV干货

公众号后台回复“transformer ”获取最新Transformer综述论文下载~


极市干货
课程/比赛:珠港澳人工智能算法大赛保姆级零基础人工智能教程
算法trick目标检测比赛中的tricks集锦从39个kaggle竞赛中总结出来的图像分割的Tips和Tricks
技术综述:一文弄懂各种loss function 工业图像异常检测最新研究总结(2019-2020)


CV技术社群邀请函 #

△长按添加极市小助手
添加极市小助手微信(ID : cvmart4)

备注:姓名-学校/公司-研究方向-城市(如:小极-北大-目标检测-深圳)


即可申请加入极市目标检测/图像分割/工业检测/人脸/医学影像/3D/SLAM/自动驾驶/超分辨率/姿态估计/ReID/GAN/图像增强/OCR/视频理解等技术交流群


每月大咖直播分享、真实项目需求对接、求职内推、算法竞赛、干货资讯汇总、与 10000+ 来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企视觉开发者互动交流~



觉得有用麻烦给个在看啦~  
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/125515
 
182 次点击