Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、 bare metal、OpenStack 集群和其他的基础应用平台。
Docker通常用于如下场景:
web应用的自动化打包和发布;
自动化测试和持续集成、发布;
在服务型环境中部署和调整数据库或其他的后台应用;
从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
正因为Docker强大的功能,越来越多的场景下,需要我们使用Docker部署和发布我们的代码。这篇学习笔记是参考相关教程,以天池大赛-Docker练习场进行实践的经验总结,供小伙伴们参考。
一、本地安装docker
ubutun安装
这里以阿里云ECS(ubutun)下安装docker为例。命令行安装:
sudo apt install docker.io
验证:
docker info
Mac安装
下载MAC版本的docker:
https://hub.docker.com/editions/community/docker-ce-desktop-mac/
Windows安装
下载Windows版本的docker:
https://hub.docker.com/editions/community/docker-ce-desktop-windows/
注意:下载成功后,直接install就可以了,一路Next即可安装完成。申请自己的docker id,登陆。
二、创建镜像仓库
这里以申请阿里云容器镜像服务(免费),并创建仓库为例,其他仓库如dockerhub、谷歌、亚马逊、腾讯等详见对应产品说明书。
阿里云容器服务地址为:https://cr.console.aliyun.com
注册开通后产品页面如下
- 创建命名空间
第一步切换标签页到命名空间,创建地址唯一的命名空间
- 创建镜像仓库
根据大赛要求选择对应的地域,其他的按照自己需求选择或填写
下一步,选择本地仓库,不建议其他选项,完成创建。
- 完成本地登录
按照页面的指令在本地完成登陆:
登录命令如下,注意更改成自己的信息:
your_registry_url E.g registry.cn-shanghai.aliyuncs.com/xxxx/xxxx
sudo docker login --username your_username --password your_password your_registry_url
**P.S:**如果登录成功,则跳过当前环节;
如果提示如下错误:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
#说明docker程序没有启动
可通过以下方式启动docker:
#方法一:直接在应用程序中点击Docker图标启动程序(启动需要几秒钟)
#方法二:通过命令行启动
open /Applications/Docker.app
#命令行查看docker服务状态
launchctl list|grep docker
#输出如下:
- 0 com.docker.helper
23217 0 application.com.docker.docker.27923258.27923746
#命令行关闭docker程序
launchctl stop application.com.docker.docker.27923258.27923746
三、构建镜像并推送
在安装好Docker环境的本机/服务器构建并推送容器镜像。过程中可能会使用docker命令,如拉取docker pull,推送docker push,构建docker build等等。
为简化构建镜像的难度,天池已准备了常用的Python基础镜像,可直接拉取使用,自行构建镜像请确保安装curl.更多基础镜像说明可参考:https://tianchi.aliyun.com/forum/postDetail?postId=67720。
docker pull registry.cn-shanghai.aliyuncs.com/tcc-public/python:3
- 编写文件
1.1读题
参与者可分阶段提交容器镜像完成以下3个任务(分数依次占 30/30/40),根据评分系统的分数返回验证任务的完成情况。
输出Hello world
计算 /tcdata/num_list.csv中一列数字的总和
在/tcdata/num_list.csv文件中寻找最大的10个数,从大到小生成一个List
num_list.csv文件中只有一列不为负的整数,其中存在重复值,示例如下:
生成入口脚本 run.sh,放置于镜像工作目录。运行后生成结果result.json放置于工作目录(与run.sh同目录),评分系统将根据result.json进行打分。json文件如下所示:
{
“Q1”:“Hello world”,
“Q2”:sum值,
“Q3”:[top10_list]
}
1.2操作
新建一个文件夹(例如tianchi_submit)用于存放这次任务镜像所需的文件,文件夹中内容示例如下:
enter image description here
其中hello_world.py中是各位自己的代码部分:
#!/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)
requirements.txt为使用python的时候用到的一些第三方库:
pandas0.25.1
numpy1.19.4
Dockerfile配置文件参考,Dockerfile是固定名称,注意首字母大写。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"]
run.sh参考:
python3 hello_world.py
tcdata是一个文件夹
- 构建镜像并推送(2.1及2.2皆可)
2.1 IDE + Cloud Toolkit
推荐使用 Alibaba Cloud Toolkit:https://cn.aliyun.com/product/cloudtoolkit 进行操作。
Cloud Toolkit 与主流 IDE 及阿里云容器镜像服务无缝集成,可以简化操作。这里以在 IntelliJ IDEA 中使用 Alibaba Cloud Toolkit 为例。只需配置一次,之后都可一键推送~
2.1.1. 安装及配置
在本地 IDE 中安装 Alibaba Cloud Toolkit 并进行阿里云账户配置。
参见:在 IntelliJ IDEA 中安装和配置 Cloud Toolkit:https://help.aliyun.com/document_detail/98762.html
2.1.2. 设置环境
设置用于打包本地镜像的 Docker 环境。
在 IntelliJ IDEA 工具栏单击 IntellJ IDEA> Preferences > Alibaba Cloud Toolkit… 。
在 Settings 对话框的左侧导航栏中单击 Docker。
在 Docker 界面中设置 Cloud Toolkit 需要连接的 Docker 环境。
本地为 Mac 或 Linux 操作系统,勾选 Unix Socket(注:默认勾选Unix Socket之后Location是有内容的,如果没有则单击 Browse,输入unix:///var/run/docker.sock )。
本地为 Windows 操作系统,勾选 TCP Connection,然后在 URI 右侧文档框输入本地 Docker 的 URI,如 http://127.0.0.1:2375。
远程 Docker 环境:勾选 Tcp Connection,在 URI 右侧的文本框里输入远端的 Docker 环境的 URI(包括 IP 地址和端口),如 http://x.x.x.x:2375,并确保远程主机的 HTTP 服务开启。
单击 Test Connection 进行连接测试,正常连接会弹出sucess弹窗。
2.1.3. 构建并上传应用
在 IntelliJ IDEA 的菜单栏中选择 File > Open… ,选择参赛的工程目录,即tianchi_submit。
在 IntelliJ IDEA 界面左侧的 Project 中右键单击您的 Docker 应用工程名tianchi_submit,在弹出的下拉菜单中选择 Alibaba Cloud > Deploy to Registry/Kubernetes > Deploy to Registry。
在 Deploy to Registry 对话框中进行以下配置。
Context Directory:参赛的工程文件所在的目录,例如上文中的 tianchi_submit 。
Dockerfile:选择上文中创建的 Dockerfile。
Version:对上传的工程文件做版本标记。例如 0.0.1
在 Image 页签中选择Context Directory和Dockerfile。
在 Image Repositories 区域选择上文中创建的容器镜像服务的地域、命名空间和镜像仓库。
2.1.4. 单击 Run
下次就可以一键完成哦~
2.2 服务器上直接操作
在tianchi_submit目录下执行如下命令:
docker build -t registry.cn-shenzhen.aliyuncs.com/xxxxxx/submit_for_tianchi:0.0.3 .
注意:registry.~~~是上面创建仓库的公网地址,用自己仓库地址替换。地址后面的:0.0.3为自己指定的版本号,用于区分每次build的镜像。最后的.是构建镜像的路径,不可以省掉。
构建完成后可先验证是否正常运行,正常运行后再进行推送。
CPU镜像:
docker run registry.cn-shenzhen.aliyuncs.com/xxxxxx/submit_for_tianchi:0.0.3 sh run.sh
GPU镜像:
nvidia-docker run your_image sh run.sh
注意:这里使用CPU镜像的命令即可,可能会报这样的错误:
FileNotFoundError: [Errno 2] File b’/tcdata/num_list.csv’ does not exist: b’/tcdata/num_list.csv’
只是因为我们自己创建的tcdata文件夹里没有竞赛数据,num_list.csv文件在天池给的基础镜像中,已在tcdata文件夹中包含,所以可以忽略,直接进入下一步。
推送到镜像仓库
docker push registry.cn-shenzhen.aliyuncs.com/xxxxxx/submit_for_tianchi:0.0.3
如果这步出错,可能你没有登录,按照仓库里描述操作登录即可。
由于镜像有1个G,所以第一次推送会比较耗时。推送完成后,在阿里云账户的镜像版本中就可以看到该镜像。
四、提交验证运行结果
在【入门】Docker练习场页面的左侧【提交结果】中填写推送的镜像路径、用户名和密码,即可提交。根据【我的成绩】中的分数和日志可以查看运行情况。
注意:
(1)首先Docker练习场需要报名参赛;
(2)提交结果的时候需要等一定的时间才能出成绩,成绩出来之后会有邮件通知;
(3)如果有错误,可以在我的成绩里点查看日志浏览具体报错信息。