文章目录
本文将详细讲述 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 !