天池 Docker 练习场比赛详细攻略+代码

本文将详细讲述 Docker 入门知识以及天池 Docker 练习场的比赛流程,并贴出代码以供参考

1. Docker 基础知识

Build, Ship and Run Any App, Anywhere.

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux 或 Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口

Docker 的三个重要概念:

  • Image(镜像)
  • Container(容器)
  • Repository(仓库)

其中,Image 是 Docker 的核心,它可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变

Container,顾名思义,它就是一个容器,其中装的就是 Image 镜像,它与 Image 的关系就好比是面向对象中的实例和类,Image 是静态的定义,Container 是 Image 运行时的实例。Image 说白了只是一个文件系统,而装载 Image 的 Container 可以被创建、启动、停止、删除、暂停等

Repository 是一个代码控制中心,用来保存镜像。每个仓库可以包含多个 Tag(标签),每个 Tag 对应一个镜像。通常,一个 Repository 会包含同一个软件不同版本的 Image,而 Tag 就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的 Image。如果不给出 Tag,将以 latest 作为默认标签

2. Docker 基本命令

2.1 容器管理

docker run :通过镜像创建一个新的容器并运行一个命令

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

常用 OPTIONS:

  • -d :后台运行 Container
  • -i :以交互模式运行 Container,通常与 -t 同时使用
  • -t :为 Container 重新分配一个伪输入终端,通常与 -i 同时使用(即 -it)
  • -p :指定 Container 与主机的端口映射,格式为:主机(宿主)端口:容器端口
  • –name=“container-name”: 为容器指定一个名称

docker start :启动一个或多个已经被停止的容器

docker start CONTAINER

docker stop :停止一个运行中的容器

docker stop CONTAINER

docker restart :重启一个运行中的容器

docker restart CONTAINER

docker rm :删除一个或多个容器

常用 OPTIONS:

  • -f :强制删除 Container

删除所有已停止的 Container

docker rm $(docker ps -a -q)

docker exec :在指定运行的容器中执行操作,exit 后容器不会停止运行

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

常用 -it 进入容器并执行命令(在伪终端中输入 exit 退出

docker exec -it CONTAINER /bin/bash

2.2 容器操作

docker ps :查看正在运行的容器

常用 OPTIONS:

  • -a :列出所有 Container,包括未运行的
  • -q :只列出 Container ID
  • -s :显示总的文件大小

docker inspect :获取指定容器/镜像的元数据,返回内容格式默认为 json

docker inspect CONTAINER

docker port :列出指定容器的端口映射

docker port CONTAINER

docker top :查看指定运行容器中的进程信息,支持 ps 命令参数

docker top [OPTIONS] CONTAINER [ps OPTIONS]

2.3 镜像管理

docker images :列出本地镜像

常用 OPTIONS:

  • -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层)
  • -q :列出本地镜像 ID

docker rmi :删除本地一个或多个镜像

docker rmi [OPTIONS] IMAGE [IMAGE...]

常用 OPTIONS:

  • -f :强制删除 Image

docker tag :标记本地镜像,将其归入某一仓库

docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

docker build :使用 Dockerfile 创建镜像

docker build [OPTIONS] PATH | URL | -

常用 OPTIONS:

  • -t :镜像的名字及标签,通常 name:tag 或者 name 格式,可以在一次构建中为一个镜像设置多个标签
  • -f :指定要使用的 Dockerfile 路径

2.4 仓库操作

docker pull :从镜像仓库中拉取或者更新指定镜像

docker pull ubuntu

docker search :从 Docker Hub 中查找镜像

docker search [OPTIONS] TERM

常用 OPTIONS:

  • –automated :只列出 automated build类型的镜像
  • –no-trunc :显示完整的镜像描述
  • -s :列出 star 数不小于指定值的镜像

3. 天池 Docker 练习场

3.1 比赛内容

题目:

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

输出结果格式:

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

注意事项

  • 输出 Hello world 就是将 Hello world 直接写入 result.json 中就行
  • /tcdata/num_list.csv :提交镜像后评分系统中会有这个文件,所以在编程时直接引用就好

3.2 编写代码

下面以阿里云 Centos 7 为例

创建文件夹

mkdir -p /data/tianchi_docker_test && cd /data/tianchi_docker_test

tianchi_docker_test 文件夹中创建文件

touch Dockerfile hello_world.py result.json run.sh

赋予权限

chmod 755 *

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

# coding:utf-8

import json
import csv

file_name = '/tcdata/num_list.csv'
data = []

# 第一题,直接写入 Hello world
result = {
    "Q1": "Hello world",
    "Q2": 0,
    "Q3": []
}

# 第二题,求和
with open(file_name, 'r', encoding='utf-8') as f:
    reader = csv.reader(f)
    for row in reader:
        data.append(int(row[0]))

sum = sum(data)
result['Q2'] = sum

# 第三题
result['Q3'] = sorted(data, reverse=True)[0:10]

# 保存到 result.json
with open('result.json', 'w', encoding='utf-8') as f:
    json.dump(result, f)

run.sh

python hello-world.py

3.3 构建镜像并推送

登录阿里云容器镜像服务

docker login --username=用户名@aliyun.com registry.cn-shanghai.aliyuncs.com

构建镜像(注意:后面有个 .

docker build -t registry.cn-shanghai.aliyuncs.com/命名空间/镜像名称:版本号 .

推送镜像

docker push registry.cn-shanghai.aliyuncs.com/命名空间/镜像名称:版本号

提交结果,镜像路径中填写:

registry.cn-shanghai.aliyuncs.com/命名空间/镜像名称:版本号

OK,good luck !

发布了17 篇原创文章 · 获赞 32 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sculpta/article/details/104408733
今日推荐