Python项目中配置Docker

博客简介:

Docker

我对Docker的理解是,不依赖于任何系统(可跨平台使用)的项目可执行环境。具体地来说就是,由于不同设备存在的差异可能会导致A电脑上能运行的项目,到B电脑上就不能运行了。为了解决这个问题,就必须提供第三方平台,将A电脑上的项目部署到独立的第三方平台上(Docker),然后B电脑想用的时候,直接从第三方平台上拉取这个项目,就可以运行了。

一、下载和安装

安装过程中会提示要先安装wsl2,按要求去微软的官网下载并安装就行了。

配置Docker加速

我用的是Docker v1.22.4版本,参考这篇博客,将加速源配置到Docker Engine中,配置完成后,点击Apply & Restart保存后Docker就会重启并应用配置的镜像地址了。

{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com",
    "https://itljlss8.mirror.aliyuncs.com"
  ]
}

Docker Engine的位置如下图所示

image-20211208205516946

前提概要

两种生成requirements.txt的方法

第一种

pip freeze > requirements.txt

这种方法会导出整个虚拟环境下的包

第二种

安装包pip install pipreqs
在项目目录下使用命令pipreqs .

但是使用pipreqs .命令时会报错误

Traceback (most recent call last):
  File "e:\software\anaconda3\envs\ml\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "e:\software\anaconda3\envs\ml\lib\runpy.py", line 85, in _run_code      
    exec(code, run_globals)
  File "E:\software\Anaconda3\envs\ml\Scripts\pipreqs.exe\__main__.py", line 7, 
in <module>
  File "e:\software\anaconda3\envs\ml\lib\site-packages\pipreqs\pipreqs.py", line 488, in main
    init(args)
  File "e:\software\anaconda3\envs\ml\lib\site-packages\pipreqs\pipreqs.py", line 418, in init
    follow_links=follow_links)
  File "e:\software\anaconda3\envs\ml\lib\site-packages\pipreqs\pipreqs.py", line 115, in get_all_imports
    contents = f.read()
UnicodeDecodeError: 'gbk' codec can't decode byte 0x81 in position 248: illegal multibyte sequence

这时,使用以下的命令,即可解决问题

pipreqs ./ --encoding=utf8

二、Docker使用–example

三、制作Docker 镜像

代码基于老版的第八次作业。

目的是编写dockerfile文件,然后使用docker打包并上传到docker hub中。

1、Dockerfile文件的编写

# 这一步是指定基础的python环境,要与你项目所用python相同
FROM python:3.6.13

# 讲当前目录下所有的文件添加到 镜像中的/app下
COPY . /app

# 将/app设置为工作目录,这样以下的操作均会在该目录下执行
WORKDIR /app

# 首先更新pip
RUN pip install --no-cache-dir --upgrade pip
# 然后安装requirements.txt
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

# 安装完成后,打包
RUN python setup.py install

CMD [ "python" "simplelayout"]

这里需要注意几点:

2、Docker build

在根目录下,执行以下命令以生成镜像

docker build -t simplelayout:v1 .

不要忘记后面那个点 ., 安装完成后,使用docker images查看:

image-20211208202543407

3、Docker Run

最后实例化一个容器,并查看是否包含simplelayout

image-20211208202907018

从上图可以看出,容器被实例化,并且simplelayout也在容器中。

4、上传镜像至网上

  1. 注册Docker账号
  2. 在命令行中登录
docker login -u 用户名 -p 密码
  1. docker hub网站创建镜像信息(这一步省略也不影响下面的步骤)
  2. 本地tag关联
docker tag <existing-image> <hub-user>/<repo-name>[:<tag>]
# 具体命令
docker tag simplelayout:v1 用户名/simplelayout:v1
  1. push到docker官网
docker push <hub-user>/<repo-name>:<tag>
# 具体命令
docker push 用户名/simplelayout:v1

下面是仔细的流程

image-20211208205223912

在docker官网上也可以看到

image-20211208205301269

四、在Docker的ubuntu中安装文件

目的:在docker中拉取ubuntu镜像,然后实例化一个ubuntu容器,并在容器中安装fenics

以下是具体步骤:

  1. 拉取ubuntu镜像
docker pull ubuntu:latest 
  1. 实例化容器
docker run -t ubuntu:latest bash

参数说明:

注意,如果在使用以下命令,那么容器运行完后将会被删除

docker run -t rm -f ubuntu:latest bash
  1. 生成系统文件

  2. It is because there is no package cache in the image, you need to run

apt-get update
  1. before installing packages, and if your command is in a Dockerfile, you’ll then need:
apt-get -y install curl
  1. To suppress the standard output from a command use -qq. E.g.(使用-qq后,不会有输出)
apt-get -qq -y install curl
  1. 完事后,使用命令安装fenics
apt-get --y install fenics

安装成功

image-20211206194519979

  1. 退出容器
exit
  1. 容器打包成镜像,需要用到容器ID(即ubuntu的 CONTAINER ID)
docker commit -a "eric" -m "ubuntu fenics images" 17bab7644e7b fenics_freeneuro:v1

参数说明:

得到输出

image-20211206203948029

注意红色框,第一个红色框是我们操作的容器,里面安装了fenics。因此将其打包成镜像,这时候查看镜像有

image-20211206204207159

  1. 容器/镜像删除
docker rm [CONTAINER ID]
docker rmi IMAGE-ID
  1. 如何在运行现有的容器(即docker ps -a查询出的容器)
docker attach [CONTAINER ID] # 注意container ID可以是容器ID的前4位

更高级的用法参考这里,或者参考以另外一个命令

# 运行一个容器
$ docker run -dit ubuntu
69d137adef7a8a689cbcb059e94da5489d3cddd240ff675c640c8d96e84fe1f6

# 查看现有容器
$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
69d137adef7a        ubuntu:latest       "/bin/bash"         18 seconds ago      Up 17 seconds                           zealous_swirles
# 进入容器
$ docker exec -it 69d1 bash
root@69d137adef7a:/#

一些命令

参考资料

  1. https://zhuanlan.zhihu.com/p/137895577

  2. https://blog.csdn.net/gf19960103/article/details/109489632

  3. https://www.ruanyifeng.com/blog/2018/02/docker-tutorial.htm

  4. https://scipy.github.io/devdocs/building/linux.html

  5. https://zhuanlan.zhihu.com/p/137895577

Table of Contents