Docker学习|通过天池赛事入门

    科技2026-08-04  1

    ↑↑↑关注后"星标"简说Python

    人人都可以简单入门Python、爬虫、数据分析

     简说Python严选 

    来源:简说Python    作者:老表

    One old watch, like brief python

    大家好,我是老表~

    Docker学习系列,学习了记得点赞、留言、转发,三连哦~

    本次入门学习我们通过阿里云天池Docker练习场赛事展开,边学边实战,赛事链接如下:

    https://tianchi.aliyun.com/s/60dc673cca889619ad9e6c8e9d7725db

    1、下载安装Docker

    初学者建议在本地系统安装Windows/Mac OS桌面版,比较简单。

    Mac:https://docs.docker.com/docker-for-mac/install/Windows:https://docs.docker.com/docker-for-windows/install/

    大家可以访问上方链接进行安装,或者直接扫下方二维码 回复:Docker获取安装包。

    添加老表微信,备注 "Docker" 获取

    下载成功后,直接点击安装包进行安装即可,基本就是一Next,然后OK,如果是Windows可以注意下安装路径,还挺大的,不怎么建议安装到C盘,大学修电脑遇到最多的问题就是C盘满了,电脑卡死。。。

    2、基本使用

    通过上面的基本步骤就算安装成功了,感觉比Java、Python这些编程语言安装环境舒服多了。

    安装成功后点击运行Docker桌面版软件,然后打开终端,利用简单的命令行查看Docker是否真的安装成功:

    docker --version Docker version 19.03.12, build 48a66213fe

    成功显示Docker版本就表示安装成功啦,是的后面如果执行相关命令一般使用docker作为关键字。

    查看容器

    # 查看正在运行的容器 docker ps # 查看全部的容器,包括已经停止运行的 docker ps -a

    暂停正在运行的容器

    docker stop 容器id

    删除容器

    docker rm 容器id

    查看镜像

    # 查看正在运行的镜像 docker iamges # 查看全部的镜像,包括已经停止运行的 docker images -a

    删除镜像

    # 通过镜像id删除 docker rmi IMAGE ID(镜像id) # 通过仓库名和标签删除 docker rmi REPOSITORY:TAG(仓库:标签) # 删除异常停止的docker容器 docker rm `docker ps -a | grep Exited | awk '{print $1}'`    # 删除名称或标签为none的镜像 docker rmi -f  `docker images | grep '<none>' | awk '{print $3}'`   ''' 注意,删除镜像前需要先暂停所有用了该镜像的容器 '''

    3、创建阿里云容器镜像服务(免费)

    大家可以跟着天池Docker入门赛事中手把手教程进行创建,过程非常详细,我就不赘述了。

    https://tianchi.aliyun.com/competition/entrance/231759/tab/174

    4、测试,输出你的Hello world

    通过上面步骤,我们安装好了Docker并且开通了阿里云容器镜像服务、创建了一个私有仓库。

    这个时候我们可以在Mac终端进行命令行操作,先拉取Python基础镜像:

    tianchi@xxxx ~ % docker pull registry.cn-shanghai.aliyuncs.com/tcc-public/python:3 3: Pulling from tcc-public/python c5e155d5a1d1: Pull complete 221d80d00ae9: Pull complete 4250b3117dca: Pull complete 3b7ca19181b2: Pull complete 425d7b2a5bcc: Pull complete dc3049ff3f44: Pull complete 472a6afc6332: Pull complete 5f79c90f8d7c: Pull complete 1051ee813012: Pull complete Digest: sha256:6268ecdce5f04d54bd411cba64e49c714589e53ae482a49c6c12eaf91a5d0425 Status: Downloaded newer image for registry.cn-shanghai.aliyuncs.com/tcc-public/python:3 registry.cn-shanghai.aliyuncs.com/tcc-public/python:3

    然后创建一个本地文件目录(名称自己取,比如tianchi_demo),用于存放这次任务镜像所需的文件,包含四个文件,结构如下:

    tianchi_demo ├── Dockerfile ├── hello_world.py ├── result.json └── 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 文件内容如下

    #!/usr/bin/env python # coding: utf-8 # In[ ]: print("hello world, 简说Python")

    result.json 暂时为空,用于存储赛事结果数据。

    run.sh 文件内容如下

    python hello_world.py

    再然后,在终端进入tianchi_demo目录,输入下面命令,创建一个镜像:

    tianchi@xxx tianchi_demo % docker build -t registry.你的仓库公网地址:1.0 . Sending build context to Docker daemon  14.85kB Step 1/4 : FROM registry.cn-shanghai.aliyuncs.com/tcc-public/python:3  ---> a4cc999cf2aa Step 2/4 : ADD . /  ---> 876b4cc17122 Step 3/4 : WORKDIR /  ---> Running in b9ae6055fdc7 Removing intermediate container b9ae6055fdc7  ---> 7dca7fe8bdd7 Step 4/4 : CMD ["sh", "run.sh"]  ---> Running in 7d3eb51f6767 Removing intermediate container 7d3eb51f6767  ---> 16de739132c7 Successfully built 16de739132c7 Successfully tagged registry.你的仓库公网地址:1.0

    注意,命令格式,首先是docker build -t表示构建中为一个镜像设置多个标签;registry.你的仓库公网地址是在哪里构建这个镜像;:1.0表示为自己当前创建的镜像指定版本号,用于区分每次build的镜像;.表示指定镜像构建过程中的上下文环境的目录,不可缺少.

    最后,按默认设置运行镜像,命令如下:

    tianchi@xxx tianchi_demo % docker run 16de739132c7 sh run.sh hello world, 简说Python

    上面操作没有错误的话,就会打印出你指定输入的内容。注意,命令格式,docker run表示运行指定镜像;16de739132c7是镜像id,在之前创建镜像的时候有出现过:Successfully built 16de739132c7;sh run.sh指运行该镜像下的run.sh文件,即运行python hello_world.py。

    5、推送你的仓库内容到镜像云端 首先需要登录阿里云容器镜像

    tianchi@xxx tianchi_demo % docker login --username=你的登录账号 registry.cn-shanghai.aliyuncs.com # 需要输入登录密码,自己之前设置的 Password:  Login Succeeded

    然后直接输入docker push命令即可:

    tianchi@xxx tianchi_demo % docker push registry.你的仓库公网地址:1.0 The push refers to repository [registry.你的仓库公网地址] 14e2a2d93485: Pushed  2633623f6cf4: Mounted from tcc-public/python  5194c23c2bc2: Mounted from tcc-public/python  69bbfe9f27d4: Mounted from tcc-public/python  2492a3be066b: Mounted from tcc-public/python  910d7fd9e23e: Mounted from tcc-public/python  4230ff7f2288: Mounted from tcc-public/python  2c719774c1e1: Mounted from tcc-public/python  ec62f19bb3aa: Mounted from tcc-public/python  f94641f1fe1f: Mounted from tcc-public/python  1.0: digest: sha256:xxxxxxxxxxxxxxxx size: 2426

    这样就推送成功了。

    6、正式开始实战练习

    1)赛事要求

    输出Hello world

    计算 /tcdata/num_list.csv中一列数字的总和。

    在/tcdata/num_list.csv文件中寻找最大的10个数,从大到小生成一个ListList. 结果形式:

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

    最后输出的结果是json格式的,存储在result.json里。

    2)首先在本地把Python代码写好

    输出Hello world

    # 1、输出Hello world print('Hello world')

    计算 /tcdata/num_list.csv中一列数字的总和

    # 假设数据读取后为列表 tc_list sum(tc_list)

    在/tcdata/num_list.csv文件中寻找最大的10个数,从大到小生成一个ListList

    # 假设数据读取后为列表 tc_list tc_list.sort(reverse=True) tc_list[:10]

    读取指定目录下文件数据转化为列表

    # 文件路径 filename = "/Users/tianchi/tianchi_demo/tcdata/num_list.csv" # 读取 with open(filename, 'r') as f:     tc_list = list(f.read().split("\n"))     tc_list = [int(i) for i in tc_list if i != '']

    合并修改hello_world.py文件

    # coding:utf-8 # Author:老表 # 微信公众号:简说Python import json # 文件路径 # filename = "/Users/tianchi/tianchi_demo/tcdata/num_list.csv" filename = "./tcdata/num_list.csv" # 读取 with open(filename, 'r') as f:     tc_list = list(f.read().split("\n"))     tc_list = [int(i) for i in tc_list if i != '']      result = {}  # 是个坑,提交到云端的代码必须先定义字典 # 1、输出Hello world,并存入结果 # print('Hello world') result['Q1']= "Hello world" # 2、计算数据和,并存入结果 tc_sum = sum(tc_list) result['Q2'] = tc_sum # print(tc_sum) # 3、找到最大的10个数,从大到小生成一个List,并存入结果 tc_list.sort(reverse=True) result['Q3'] = tc_list[:10] # print(tc_list)  # 4、存储结果到result.json with open("result.json", 'w') as f:     f.write(json.dumps(result))

    3)再次创建镜像,然后push到云端

    tianchi@xxx tianchi_demo % docker build -t registry.你的仓库公网地址:1.1 . Sending build context to Docker daemon   25.6kB Step 1/4 : FROM registry.cn-shanghai.aliyuncs.com/tcc-public/python:3  ---> a4cc999cf2aa Step 2/4 : ADD . /  ---> 0d5c1e8c8baf Step 3/4 : WORKDIR /  ---> Running in b6ca7d7bc0df Removing intermediate container b6ca7d7bc0df  ---> 5023088e827a Step 4/4 : CMD ["sh", "run.sh"]  ---> Running in b11967f76e31 Removing intermediate container b11967f76e31  ---> fa6485ee7dda Successfully built fa6485ee7dda Successfully tagged registry.你的仓库公网地址:1.1

    创建成功后再进行push

    tianchi@xxx tianchi_demo % docker push registry.你的仓库公网地址:1.1    The push refers to repository [registry.你的仓库公网地址] a9d89b627701: Pushed  2633623f6cf4: Layer already exists  5194c23c2bc2: Layer already exists  69bbfe9f27d4: Layer already exists  2492a3be066b: Layer already exists  910d7fd9e23e: Layer already exists  4230ff7f2288: Layer already exists  2c719774c1e1: Layer already exists  ec62f19bb3aa: Layer already exists  f94641f1fe1f: Layer already exists  1.1: digest: sha256:xxxxxxxx size: 2426

    7、提交仓库,完成比赛

    先分享几个大坑:

    我一共提交了4次,最后一次满分。

    先说一下提交过程:进入赛事页面->点击左边的菜单栏的提交结果->点击配置路径->输入镜像路径、用户名、密码->点击确定->点击提交,即可完成提交,然后等待出分即可,一般5分钟左右即可出分。

    第一次提交,只写了镜像路径,没有填用户名和密码,结果几个小时都没出结果,坑1。

    解决方法:输入用户名和密码即可,就是你开通阿里云镜像时的账号密码,用户名一般为手机号。

    第二次提交,报错说''字符串不能被转换成整形数据

    File "hello_world.py", line 14, in <listcomp> tc_list = [int(i) for i in tc_list] ValueError: invalid literal for int() with base 10: ''

    解决方法:

    # 代码修改下,去除'' tc_list = [int(i) for i in tc_list if i != '']

    第三次提交,报错说需要先定义result字典

    result['Q1']= "Hello world" NameError: name 'result' is not defined

    解决方法:

    # 使用前先定义字典 result = {}  # 太坑了 result['Q1']= "Hello world"

    第四次提交,完美,100分

    8、其他操作

    1)配置加速器,一般国外镜像下载安装包会比较慢,所以我们可以使用国内镜像,我是用阿里云的,点击下方链接登录阿里云即可获取到自己专属的镜像加速地址了

    https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

    也还有其他加速器可以用,比如:

    网易加速器:https://hub-mirror.c.163.com/ 阿里云加速器:https://mirror.baidubce.com 七牛云加速器:https://reg-mirror.qiniu.com

    由于单个加速器可能失效,所以我们可以多加几个,点击Docker应用图标-> Perferences...-> Docker Engine,配置加速器需要输入JSON格式代码,大家可以直接复制下面语句粘贴过去,注意格式:

    {   "registry-mirrors": [     "https://<用自己的替换下>.mirror.aliyuncs.com",     "https://hub-mirror.c.163.com",     "https://mirror.baidubce.com"   ] }

    然后点击Apply & Restart,即可。

    2)如果你在 docker build 时遇到这个问题,可以参考这个解决方法

    tianchi tianchi_demo % docker build -t registry.你的仓库地址:1.0. 错误: "docker build" requires exactly 1 argument. See 'docker build --help'. Usage: docker build [OPTIONS] PATH | URL | - Build an image from a Dockerfile

    原因是最后一个 . 表示的是构建镜像的路径,不可以省掉,但是加入的时候需要和前面的仓库路径加一个空格,如下即可运行成功:

    tianchi tianchi_demo % docker build -t registry.你的仓库地址:1.0 .

    简说Java

    长按扫码关注,一起学Java

    简说Python

    长按扫码关注,一起学Python ------------------ 如果觉得文章有点用的话,请毫不留情地素质三连吧,分享、点赞、在看、收藏,我不挑,因为这将是我写作更多优质文章的最强动力。
    Processed: 0.009, SQL: 9