任务需求

  • 总体项目的运行环境在windows下
  • 但某功能使用python在linux下实现,用到了第三方库netzob,其依赖目前只能在linux上安装
  • 且python版本是3.6的!3.8、2.7都不行
  • 因此,需要尝试在windows下执行这部分的代码
  • 故,采用docker配置linux项目需要的环境,执行项目

实现步骤记录(尝试的过程)

1. 安装Docker桌面版

  • 安装地址:https://www.docker.com/

2. 配置环境

  • 控制面板->程序和功能->启用或关闭windows功能:勾选windows虚拟机监控程序平台适用于Linux的Windows子系统
  • 根据链接安装WSL:https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-4—download-the-linux-kernel-update-package
  • 指令:dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
  • 指令:dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
  • 重启电脑
  • 下载Linux内核更新包
  • 将WSL2设置为默认版本

3. 添加镜像加速源

  • 设置-Docker Engine-增加"registry-mirrors": ["https://registry.docker-cn.com"]
  • 没有成功,点击后一直为灰色图标,没有反应;再次进入或重启也没有保存修改的内容

4. 创建Linux容器

- pull一个Ubuntu镜像
	- 	`docker pull ubuntu`下载的是最新版本的Ubuntu,目前已经是22.04

docker linux执行 shell window执行 linux docker运行windows程序_python


- pull指定版本的镜像

- 在https://hub.docker.com上检索ubuntu,点击tags进行查看

- 20.04版本对应的指令为:docker pull ubuntu:focaldocker pull ubuntu:20.04 - 对应创建容器的指令:docker run --name ubuntu -ti ubuntu:20.04 bash

  • 用镜像创建容器
    docker run -it --name=testUbuntu ubuntu
  • docker linux执行 shell window执行 linux docker运行windows程序_docker_02


5. 备注:

(1)删除容器和镜像的方法

  • 查看运行的容器,要删除的容器不能处于运行状态
  • docker ps
  • 备注:查看Docker所有容器的状态:docker ps -a
  • docker linux执行 shell window执行 linux docker运行windows程序_docker_03


  • 停止运行容器
  • docker stop CONTAINER ID
  • CONTAINER ID可以只输入ID的前3位
    - 删除容器
  • docker rm CONTAINER ID
  • 查看镜像
  • docker images
  • 删除镜像
  • docker rmi IMAGE ID
  • IMAGE ID可以只取前3位

(2)终端启动docker容器且进入docker容器

  • 启动docker容器
  • docker ps -a
  • docker start CONTAINER ID
  • 进入docker容器
  • docker attach CONTAINER ID

(3)将文件从本地上传到docker容器

  • docker cp /本地路径地址 容器ID:/上传路径

(4)创建容器,且关联文件夹

  • docker run -it -p 8090:22 --name=test1 -v F:\本地文件夹:/home/code netzob_py36
  • 8090端口号自己指定
  • 本地文件夹路径:容器文件夹路径
  • 最后是镜像的名称

6. 配置镜像

  • 查看ubuntu版本
  • cat /etc/issue
  • 配置镜像源
  • 这步没做
  • 备注:后来又补上了,直接写在了dockerfile文件中

7. 更新apt-get并安装一些基础工具

  • 更新apt-get
  • apt-get update
  • 安装常用工具
apt-get install -y vim
apt-get install -y tree
apt-get install -y net-tools
  • 安装python3.6
  • 备注:ubuntu20.04好像装不上python3.6,或者是需要设置软连接,后续没有继续使用ubuntun20.04了
  • apt-get install -y python3.6
  • 安装pip3
  • apt-get install python3-pip
  • 安装pip
  • apt-get install -y python-pip python-dev build-essential

8. 用Dockerfile创建镜像、容器

  • docker build -t netp18:v1 .
  • 注意空格+点

最后的一版本的成功过程

0. 环境备注

  • 基础镜像:ubuntu18.04
  • python版本:3.6.10
  • 目标:运行netzob 1.0.2

1. 手动配置过程

  • (1)拉取ubuntu18.04镜像,创建容器
  • (2)apt-get update
  • (3)安装python3.6 apt-get install -y python3.6
  • (4)安装pip3 apt-get install python3-pip
  • y
  • (5)安装依赖 apt-get install
  • python3
  • python3-dev
  • python3-setuptools
  • virtualenv
  • y
  • build-essential
  • libpcap-dev
  • y
  • libgraph-easy-perl
  • y
  • libffi-dev
  • (6)解决pip安装时报错问题
  • export LC_ALL=C.UTF-8
  • SOURCE ~/.bashrc
  • 备注:
  • 遇到的问题是,在使用pip install下载netzob时,报错 UnicodeDecodeError:'ascii' code can't decode byte 0xc3 in position 469:ordinal not in range(128)
  • ubuntu系统
  • export LC_ALL=C.UTF-8
  • source ~/.bashrc
  • 其他
  • export LC_CTYPE=en_US.UTF-8
  • source ~/.bashrc
  • (7)安装所需要的第三方库
  • pip3 install numpy==1.19.5
  • pip3 install netzob==1.0.2

2. 将手动配置过程转换为Dockerfile文件

  • (1)Dockerfile内容
FROM ubuntu:18.04
RUN yes y | apt-get update && yes y | apt upgrade
RUN yes y | apt-get install -y python3.6
RUN yes y | apt-get install python3-pip
RUN yes y | apt-get install virtualenv libpcap-dev
RUN yes y | apt-get install libgraph-easy-perl libffi-dev
ADD sources.list /etc/apt/
RUN LC_ALL=C.UTF-8 pip3 install numpy==1.19.5
RUN LC_ALL=C.UTF-8 pip3 install netzob==1.0.2
RUN pip3 install lxml==4.9.2
RUN mkdir /home/code
  • (2)准备换镜像源的文档sources.list
  • deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
  • (3)需要注意的地方
  • 注意记录过程中要输入y的步骤,补充到dockerfile里面,不过好像RUN yes y都写上也没关系?
  • 注意RUN LC_ALL=C.UTF-8 pip3 install numpy==1.19.5,解决安装时的编码问题的命令格式
  • 之前版本是将这个命令拆开写,而且其要求在bash?(记不清了)下输入
  • 但是那样的话,运行不报错,但是似乎不起作用,因为在pip3 install的时候仍然有错误
  • 之后改为这样,就没错了~

项目反思

1. 先明确怎么做,再动手,而不是尝试

  • 首先就要明确,自己需要什么样的环境,比如操作系统、python版本、第三方库的依赖等等
  • 然后再去调研有什么方法或版本能实现需求
  • 而不是通篇尝试,看看谁能符合自己的需求,这在项目中比较浪费时间,领导不允许
  • 比如这次,尝试了ubuntu18.04、ubuntu20.04、debian、centos7等都没成,最后发现要py3.6环境,且也成功检索到当时遇到的问题的解决方案
  • 但是就是在不断尝试、不成功、重新来的过程中耗费了大量的时间和精力

2. 注意记录

  • 本次流程还好有草稿、typora的过程记录,有的有效指令不用再记忆或者查找,流程也逐渐清晰
  • 之后应该总结一下linux、docker、android工具等的常用命令,便于自己查找