Task01:天池Docker使用笔记
容器的基本概念
什么是容器?
容器就是一个视图隔离、资源可限制、独立文件系统的进程集合。所谓“视图隔离”就是能够看到部分进程以及具有独立的主机名等;控制资源使用率则是可以对于内存大小以及 CPU 使用个数等进行限制。容器就是一个进程集合,它将系统的其他资源隔离开来,具有自己独立的资源视图。
容器具有一个独立的文件系统,因为使用的是系统的资源,所以在独立的文件系统内不需要具备内核相关的代码或者工具,我们只需要提供容器所需的二进制文件、配置文件以及依赖即可。只要容器运行时所需的文件集合都能够具备,那么这个容器就能够运行起来。
如何为进程提供一个独立的运行环境呢?
- 针对不同进程使用同一个文件系统所造成的问题而言,Linux 和 Unix 操作系统可以通过 chroot 系统调用将子目录变成根目录,达到视图级别的隔离;进程在 chroot 的帮助下可以具有独立的文件系统,对于这样的文件系统进行增删改查不会影响到其他进程;
- 因为进程之间相互可见并且可以相互通信,使用 Namespace 技术来实现进程在资源的视图上进行隔离。在 chroot 和 Namespace 的帮助下,进程就能够运行在一个独立的环境下了;
- 但在独立的环境下,进程所使用的还是同一个操作系统的资源,一些进程可能会侵蚀掉整个系统的资源。为了减少进程彼此之间的影响,可以通过 Cgroup 来限制其资源使用率,设置其能够使用的 CPU 以及内存量。
什么是镜像?
我们将容器运行时所需要的所有的文件集合称之为容器镜像。
docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
image 是二进制文件。实际开发中,一个 image 文件往往通过继承另一个 image 文件,加上一些个性化设置而生成。举例来说,你可以在 Ubuntu 的 image 基础上,往里面加入 Apache 服务器,形成你的 image。
那么,一般都是通过什么样的方式来构建镜像的呢?通常情况下,我们会采用 Dockerfile 来构建镜像,这是因为 Dockerfile 提供了非常便利的语法糖,能够帮助我们很好地描述构建的每个步骤。当然,每个构建步骤都会对已有的文件系统进行操作,这样就会带来文件系统内容的变化,我们将这些变化称之为 changeset。当我们把构建步骤所产生的变化依次作用到一个空文件夹上,就能够得到一个完整的镜像。
1. 解题
新建文件夹,如:docker_submit_demo(名字可自拟),并在此文件夹下,新建 tcdata 文件夹。
利用 python 在 docker_submit_demo 文件夹下编写文件(也可用其他工具):
#!/usr/bin/env python
# coding: utf-8
import pandas as pd
import numpy as np
import json
#data=np.random.randint(1,100,200)
#data=pd.DataFrame(data)
#data.to_csv("./tcdata/num_list.csv",index=False,header=False)
data=pd.read_csv("/tcdata/num_list.csv",header=None)#天池python镜像默认包含此文件,自己测试用如下指令
#data=pd.read_csv("./tcdata/num_list.csv",header=None)
#第一题
result_1="Hello world"
#第二题
result_2=0
for i,num in enumerate(data[0]):
result_2+=num
#第三题
data.sort_values(by=0,ascending=False,inplace=True)
result_3=data[0][:10]
result_3=list(result_3)
result={"Q1":result_1,
"Q2":result_2,
"Q3":result_3
}
with open('result.json', 'w', encoding='utf-8') as f:
json.dump(result, f)
2. 制作 requirements 文件
安装 pip install pipreqs
在当前目录生成 pipreqs . --encoding=utf8 --force
3. 编写 run.sh 文件
#!/bin/sh
CURDIR="`dirname $0`" #获取此脚本所在目录
echo $CURDIR
cd $CURDIR #切换到该脚本所在目录
python hello_world.py
- 如果直接在 hello_world.py 文件所在位置运行指令
sh run.sh
,上述代码可以简化为python hello_world.py
- 如果系统装了 python2 和 python3,那么要改为
python3 hello_world.py
- 运行
sh run.sh
4. 编写 Dockerfile 文件
# Base Images
## 从天池基础镜像构建
FROM registry.cn-shanghai.aliyuncs.com/tcc-public/python:3
## 把当前文件夹里的文件构建到镜像的根目录下(.后面有空格,不能直接跟/)
ADD . /
## 指定默认工作目录为根目录(需要把run.sh和生成的结果文件都放在该文件夹下,提交后才能运行)
WORKDIR /
## Install Requirements(requirements.txt包含python包的版本)
## 这里使用清华镜像加速安装
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
## 镜像启动后统一执行 sh run.sh
CMD ["sh", "run.sh"]
5. 制作推送镜像
在 docker_submit_demo 文件夹下,地址栏内输入powershell
,打开 powershell,进行指令输入:
## docker登陆(push镜像需要登陆,服务器地址为赛事要求的,这里以上海为例):
docker login --username=你自己的用户名 registry.cn-shanghai.aliyuncs.com
## 不要忘记加.
## 公网地址上述已经提到过
docker build -t 公网地址/版本号 .
## 构建完成后可先验证是否正常运行,正常运行后再进行推送。
CPU镜像:docker run 公网地址/版本号 sh run.sh
GPU镜像:nvidia-docker run 公网地址/版本号 sh run.sh
## 推送到镜像仓库,如果出错,可能没登录
docker push 公网地址/版本号