本文共 4063 字,大约阅读时间需要 13 分钟。
目录
这是一篇制作docker镜像的blog。镜像里安装Python3和pip工具。下面分步介绍制作方法,仅供参考。如果有出错的地方欢迎留言讨论。
选择一个合适的镜像去安装python3等工具至关重要。在这里我选择了CentOS7镜像作为基础镜像。喜欢Ubuntu或者其他镜像的小伙伴可以自己下载尝试。下面的命令将CentOS7镜像下载到本地:
docker pull centos:7.4.1708
📚提示:如果下载centos镜像速度过慢,可以尝试更换镜像源。更换镜像源的方法这里不再介绍,需要的小伙伴可以自己搜索。
下载完毕,我们使用docker images可以看到刚刚下载的镜像:
$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEcentos 7.4.1708 9f266d35e02c 21 months ago 197MB
为了在容器内部安装Python3,我们首先需要运行容器:
$ docker run -itd centos:7.4.17085fec2f8eaf3b1d000548c5ddb8c259e21fe03ac9e086fcf7f9b1e1945f2bbcf0$ docker exec -it 5fec2f8eaf3b1d000548c5d /bin/bash[root@5fec2f8eaf3b /]#
📚提示:
docker run -itd centos:7.4.1708 命令将启动一个容器。这条命令会回显出启动容器的id(即上面的5fec2f8eaf3b1d000548c5ddb8c259e21fe03ac9e086fcf7f9b1e1945f2bbcf0)。
docker exec -it 5fec2f8eaf3b1d000548c5d /bin/bash 命令会进入到容器内部。容器id只需要从开头写出一部分即可,不需要全部写全。
看到 命令提示符变为[root@28bfc117484b /]# 后,我们就进入到了容器内部中。可以使用hostname命令测试验证一下是不是在容器内部:
[root@5fec2f8eaf3b /]# hostname5fec2f8eaf3b
主机名变成了容器id开头的部分子字符串。说明我们已经处于容器中了。接下来的流程就好比在一台CentOS7服务器上安装Python3一样简单。
我们下载的镜像是一个纯净的CentOS,很多基础的工具需要我们手动安装。
首先需要更新下yum:
yum update -y
接下来安装我们需要的工具:
yum install -y zlib-devel
yum install -y bzip2-devel
yum install -y openssl-devel
yum install -y ncurses-devel
yum install -y sqlite-devel
yum install -y readline-devel
yum install -y tk-devel
yum install -y libffi-devel
yum install -y wget
yum install -y gcc
yum install -y make
我在这里演示使用的是python3.9.0,大家根据自己的需求安装对应的版本。
首先创建安装路径:
mkdir -p /usr/local/python/python3
进入到/usr/local目录中,下载python源码。
cd /usr/localwget https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tgz
下载成功后解压:
tar -zxvf Python-3.9.0.tgz
进入到解压后的目录,编译安装环境,安装Python。
cd Python-3.9.0/./configure --prefix=/usr/local/python/python3make && make install
创建软链接
ln -s /usr/local/python/python3/bin/python3.9 /usr/bin/python3ln -s /usr/local/python/python3/bin/pip3 /usr/bin/pip3
升级pip3
pip3 install --upgrade pip
[root@5fec2f8eaf3b bin]# pip3 --versionpip 20.3.1 from /usr/local/python/python3/lib/python3.9/site-packages/pip (python 3.9)[root@5fec2f8eaf3b bin]# python3 --versionPython 3.9.0
安装好Python以及所需的工具包后,我们可以把当前的容器制作成自己的镜像。我们在容器外部执行docker commit来制作镜像。我们将新的镜像命名为python3,标签定为3.9.0,表示该镜像安装的python版本是3.9.0。
$ docker commit 5fec2f8eaf3b python3:3.9.0sha256:fffdd8a20d2be7bb4c06130b41c000bdd1fc3cffb3f757c2ebd329d982bc2f95
📚提示:docker commit <container_id> <image_name>:<tag> 用来将正在运行的容器制作成镜像。镜像名字和标签可以按照自己的需求定义。
通过docker images命令,可以看到刚刚制作的镜像:
$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEpython3 3.9.0 fffdd8a20d2b 4 minutes ago 1.02GBcentos 7.4.1708 9f266d35e02c 21 months ago 197MB
至此,镜像的制作就基本完成了。
在CentOS服务器上,我们可以在 ~/.bash_profile中配置别名的方式将python3命令简化成python。但是通过配置别名的方式无法在容器内部良好的实现。因为服务器或安装CentOS镜像的虚拟机(注意虚拟机镜像不是Docker镜像)带有完整的操作系统,在操作系统启动的过程中,会执行 boot 的所有初始化操作。但 Docker 则不是, Docker 只运行我们设置需要启动运行的脚本,否则不会自己运行。因此每次使用/bin/bash进程进入container内部,不会自动的加载环境变量文件,也就无法使别名生效。除非docker容器自动后,手动source ~/.bash_profile,但这样无疑增加了使用复杂度,没有意义。
但并非无法使用python命令直接调用python3。我们可以在/usr/bin目录下将python3重命名为python即可。但是这个操作并不推荐大家使用,首先会覆盖原有的python文件(原有的python文件是python2版本)。不过这个问题倒容易解决,我们只需要在重命名前备份即可。其次,系统中的一些工具代码依赖python2,如果我们强行将python3重命名为python,会导致一些工具无法使用(比如yum)。以yum为例,解决这个问题需要在/usr/bin/yum文件中把第一行注释修改为 #!/usr/bin/python2 就可以规避。
镜像制作完成后,可以使用docker save命令将镜像打包为tar文件。
$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEpython3 3.9.0 fffdd8a20d2b 28 minutes ago 1.02GBcentos 7.4.1708 9f266d35e02c 21 months ago 197MB$ docker save -o python3.9.0_image.tar python3:3.9.0$ lltotal 1026592drwxr-xr-x 3 root root 4096 Dec 10 06:33 ./drwxr-xr-x 9 root root 4096 Dec 10 05:46 ../-rw------- 1 root root 1049639424 Dec 10 06:33 python3.9.0_image.tar
上面的操作将我们制作的python3:3.9.0镜像打包为python3.9.0_image.tar文件。
转载地址:http://mcsoi.baihongyu.com/