前言

Ciscn真是个坑爹比赛。各种无聊要求最多,承办方通过Build环节收题,还一大堆无理要求(比如在提供docker镜像的情况下要求压缩包小于150M),但是没办法人家是国字头,惹不起嘛。(x

笔记

1.相关docker命令笔记

  1. 从指定的Dockerfile构建docker image:
    docker build -f Dockerfile .

  2. 查看当前的docker image列表:
    docker image ls

  3. 查看当前的docker container列表:
    docker container ls

  4. 查看当前的docker 运行情况:
    docker ps

  5. 删除一个docker镜像:
    docker rmi -f <docker image id>
    注意如果该镜像已经被某些container使用,则需要加入-f指令强制全部删除。

  6. 从某一个docker镜像启动docker服务:
    docker run -it -d -p 50002:22 -p 8888:8888 <docker image id>
    注意这里的-p指令是将docker中的端口映射到宿主机端口上,如50002:22就是将docker内部的22端口映射到宿主机的50002端口上,这样连接宿主机的50002端口即相当于是使用了docker内部的SSH服务。

  7. 直接获得一个启动了的docker container 的shell:
    docker exec -it <docker container id> /bin/bash

  8. 启动/关闭一个docker 容器:
    docker start <docker container id>
    docker stop <docker container id>

  9. docker容器和宿主机文件拷贝传输:
    docker cp PATH_outside <docker container id>:PATH_inside

2.相关dockerfile中的指令

  1. FROM :指以某个docker镜像为基础构建自己的docker镜像。如果该基础镜像已经存在本地,则直接使用,否则会从网上去Pull。在本次Build环节中我使用的镜像是python:2-slim。这个docker基础只有150M大小,除了提供一个基础的Python环境服务以外什么都不能做。

  2. RUN:指运行某些指定的bash命令。

  3. COPY:类似于docker cp命令,从外部环境中拷贝文件到docker中去。

  4. EXPOSE:暴露某些端口,如22。

3.踩坑日记

说实话我一开始不知道500多M的docker镜像居然能被7z压缩成150M,真的一直在试图在那个slim的150M什么都没有的docker里面配环境,结果最终是没有成功,不过我还是打算在这里记录一些经验。

由于该环境没有编译器,apt-get功能也几乎报废,因此在安装pycrypto库时候,需要复制编译好的所有文件,包括动态链接库到docker 中Python的site-package中。但是这样还不行。发现from Crypto.Cipher import AES的时候报错from _AES import *错误,原因是动态链接库名字不对,需要将文件夹中所有的动态链接库名字都改成_AES.so,_DES.so之类。

装Open-SSH环境时候:需要先下载所有的deb包然后手动安装。命令如下:
apt-get download $(apt-rdepends openssh-server | grep -v "^ " | sed 's/debconf-2.0/debconf/g')