前言
Ciscn真是个坑爹比赛。各种无聊要求最多,承办方通过Build环节收题,还一大堆无理要求(比如在提供docker镜像的情况下要求压缩包小于150M),但是没办法人家是国字头,惹不起嘛。(x
笔记
1.相关docker命令笔记
-
从指定的Dockerfile构建docker image:
docker build -f Dockerfile .
-
查看当前的docker image列表:
docker image ls
-
查看当前的docker container列表:
docker container ls
-
查看当前的docker 运行情况:
docker ps
-
删除一个docker镜像:
docker rmi -f <docker image id>
注意如果该镜像已经被某些container使用,则需要加入-f
指令强制全部删除。 -
从某一个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服务。 -
直接获得一个启动了的docker container 的shell:
docker exec -it <docker container id> /bin/bash
-
启动/关闭一个docker 容器:
docker start <docker container id>
docker stop <docker container id>
-
docker容器和宿主机文件拷贝传输:
docker cp PATH_outside <docker container id>:PATH_inside
2.相关dockerfile中的指令
-
FROM
:指以某个docker镜像为基础构建自己的docker镜像。如果该基础镜像已经存在本地,则直接使用,否则会从网上去Pull。在本次Build环节中我使用的镜像是python:2-slim
。这个docker基础只有150M大小,除了提供一个基础的Python环境服务以外什么都不能做。 -
RUN
:指运行某些指定的bash命令。 -
COPY
:类似于docker cp
命令,从外部环境中拷贝文件到docker中去。 -
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')