好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

docker(3)快速搭建centos7-python3.6环境

前言

当我们在一台电脑上搭建了python3.6的环境,下次换台电脑,又得重新搭建一次,设置环境变量等操作。 好不容易安装好,一会提示pip不是内部或外部命令,一会又提示pip: command not found,想死的心都有了。 搭建环境是真的麻烦,不弄好又不行,从今天开始学好docker,环境问题从此和你说再见 ?

docker search搜索镜像

docker search : 从Docker Hub(https://hub.docker测试数据)中搜索指定的镜像 比如我这里搜索一个基于centos7环境安装的python3.6版本

[root@jkc?~]#?docker?search?python
NAME?????????????????????????????DESCRIPTION?????????????????????????????????????STARS???????????????OFFICIAL????????????AUTOMATED
python???????????????????????????Python?is?an?interpreted,?interactive,?objec…???5776????????????????[OK]????????????????
django???????????????????????????Django?is?a?free?web?application?framework,?…???1040????????????????[OK]????????????????
pypy?????????????????????????????PyPy?is?a?fast,?compliant?alternative?implem…???262?????????????????[OK]????????????????
nikolaik/python-nodejs???????????Python?with?Node.js?????????????????????????????57??????????????????????????????????????[OK]
joyzoursky/python-chromedriver???Python?with?Chromedriver,?for?running?automa…???57??????????????????????????????????????[OK]
arm32v7/python???????????????????Python?is?an?interpreted,?interactive,?objec…???54??????????????????????????????????????
circleci/python??????????????????Python?is?an?interpreted,?interactive,?objec…???42??????????????????????????????????????
centos/python-35-centos7?????????Platform?for?building?and?running?Python?3.5…???39??????????????????????????????????????
centos/python-36-centos7?????????Platform?for?building?and?running?Python?3.6…???30??????????????????????????????????????
hylang???????????????????????????Hy?is?a?Lisp?dialect?that?translates?express…???29??????????????????[OK]????????????????
arm64v8/python???????????????????Python?is?an?interpreted,?interactive,?objec…???24??????????????????????????????????????
revolutionsystems/python?????????Optimized?Python?Images?????????????????????????18??????????????????????????????????????
centos/python-27-centos7?????????Platform?for?building?and?running?Python?2.7…???17??????????????????????????????????????
bitnami/python???????????????????Bitnami?Python?Docker?Image?????????????????????10??????????????????????????????????????[OK]
publicisworldwide/python-conda???Basic?Python?environments?with?Conda.???????????6???????????????????????????????????????[OK]
d3fk/python_in_bottle????????????Simple?python:alpine?completed?by?Bottle+Req…???5???????????????????????????????????????[OK]
dockershelf/python???????????????Repository?for?docker?images?of?Python.?Test…???5???????????????????????????????????????[OK]
clear Linux /python????????????????Python?programming?interpreted?language?with…???4???????????????????????????????????????
i386/python??????????????????????Python?is?an?interpreted,?interactive,?objec…???3???????????????????????????????????????
centos/python-34-centos7?????????Platform?for?building?and?running?Python?3.4…???2???????????????????????????????????????
ppc64le/python???????????????????Python?is?an?interpreted,?interactive,?objec…???2???????????????????????????????????????
amd64/python?????????????????????Python?is?an?interpreted,?interactive,?objec…???1???????????????????????????????????????
s390x/python?????????????????????Python?is?an?interpreted,?interactive,?objec…???0???????????????????????????????????????
ccitest/python???????????????????CircleCI?test?images?for?Python?????????????????0???????????????????????????????????????[OK]
saagie/python????????????????????Repo?for?python?jobs????????????????????????????0
NAME 镜像仓库名称 DESCRIPTION 镜像描述信息 STARS 镜像收藏数 OFFICIAL 是否为docker官方发布的镜像 AUTOMATED 是否为自动化构建的镜像 关于自动化构建,可以查看官方文档:https://docs.docker测试数据/docker-hub/builds/#how-automated-builds-work ?

下载pull镜像

上面找的想要下载的镜像centos/python-36-centos7,接下来下载到自己本地 如果下载速度缓慢,可以参考这篇博客https://HdhCmsTestcnblogs测试数据/jiakecong/p/14308660.html

docker?pull?centos/python-36-centos7
[root@jkc?docker]#?docker?pull?centos/python-36-centos7
Using?default?tag:?latest
latest:?Pulling?from?centos/python-36-centos7
75f829a71a1c:?Pull?complete?
e2c4942f4189:?Pull?complete?
f1498894b11c:?Pull?complete?
da56c9694723:?Pull?complete?
07fa76fc639e:?Pull?complete?
abab42dfb7f7:?Pull?complete?
dd73d54fbd62:?Pull?complete?
25966a5cbd52:?Pull?complete?
b947aec7d116:?Pull?complete?
Digest:?sha256:ac50754646f0d37616515fb30467d8743fb12954260ec36c9ecb5a94499447e0
Status:?Downloaded?newer?image?for?centos/python-36-centos7:latest
docker.io/centos/python-36-centos7:latest
[root@jkc?docker]#

?

安装其他python版本

如果有小伙伴想安装其他python版本,比如3.7或者3.8,去https://hub.docker测试数据搜索即可

进入后选择tags标签,进入找到想要的版本复制命令即可

?

docker images

使用docker images查看本地已经下载好的镜像

[root@jkc?docker]#?docker?images
REPOSITORY?????????????????TAG?????????????????IMAGE?ID????????????CREATED?????????????SIZE
mysql??????????????????????5.7?????????????????ae0658fdbad5????????2?months?ago????????449MB
centos/python-36-centos7???latest??????????????602660fa9b4e????????4?months?ago????????650MB
[root@jkc?docker]#

?

运行交互式的容器

Docker会在隔离的容器中运行进程。当运行docker run命令时,Docker会启动一个进程,并为这个进程分配其独占的文件系统、网络资源和以此进程为根进程的进程组。 在容器启动时,镜像可能已经定义了要运行的二进制文件、暴露的网络端口等,但是用户可以通过docker run命令重新定义 最基本的docker run命令的格式如下:

$?sudo?docker?run?[OPTIONS]?IMAGE[:TAG]?[COMMAND]?[ARG...]

比如我这里要启动centos7,进入交互模式,通过docker的两个参数 -i -t,让docker运行的容器实现"对话"的能力

-t: 在新容器内指定一个伪终端或终端。 -i: 允许你对容器内的标准输入 (STDIN) 进行交互 centos/python-36-centos7:镜像名称 /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
docker?run?-i?-t?centos/python-36-centos7?/bin/bash

进入centos终端后,进python交互环境打印"hello",最后用exit退出

[root@jkc?docker]#?docker?run?-i?-t?centos/python-36-centos7?/bin/bash
(app-root)?python
Python?3.6.9?(default,?Nov?11?2019,?11:24:16)?
[GCC?4.8.5?20150623?(Red?Hat?4.8.5-39)]?on? Linux 
Type?"help",?"copyright",?"credits"?or?"license"?for?more?information.
>>>?print("hello")
hello
>>>?exit()
(app-root)

?

后台模式启动

run加上-i -t是进交互模式,如果不想进交互模式直接执行脚本,可以直接使用run,比如echo "hello world",屏幕会输出"hello world"

docker?run?centos/python-36-centos7?/bin/echo?"hello?world"

如果不想在前台执行,一般我们运行环境会选择挂后台,加个-d 参数即可

[root@jkc?docker]#?docker?run?centos/python-36-centos7?/bin/echo?"hello?world"
hello?world
[root@jkc?docker]#?docker?run?-d?centos/python-36-centos7?/bin/echo?"hello?world"
8c7c7449d8596d0d2b7c6d5672ec68d9da73733984232377fb35b30b876faaf5

使用-d后台执行后,会发现下面多了一长串,这个就是容器的唯一id,可以通过这个id找到容器 ?

docker ps查看容器

先run下 training/webapp

docker?run?-d?-p?5000:5000?training/webapp?python?app.py

使用docker ps查看正在运行的容器

[root@jkc?docker]#?docker?ps
CONTAINER?ID????????IMAGE???????????????COMMAND?????????????CREATED?????????????STATUS??????????????PORTS????????????????????NAMES
a67640969dd9????????training/webapp?????"python?app.py"?????31?seconds?ago??????Up?31?seconds???????0.0.0.0:5000->5000/tcp???admiring_mahavira
[root@jkc?docker]#

上面的echo "hello world"只是一个很简单的输出指令,执行完就关闭了,所以ps查找正在运行的查不到,可以加个-a参数,显示所有的容器,包括未运行的 ps 查找参数相关语法

-a :显示所有的容器,包括未运行的。 -f :根据条件过滤显示的内容。 --format :指定返回值的模板文件。 -l :显示最近创建的容器。 -n :列出最近创建的n个容器。 --no-trunc :不截断输出。 -q :静默模式,只显示容器编号。 -s :显示总的文件大小。
docker?ps?-a
[root@jkc?docker]#?docker?ps?-a
CONTAINER?ID????????IMAGE??????????????????????COMMAND??????????????????CREATED?????????????STATUS??????????????????????PORTS????????????????????NAMES
a67640969dd9????????training/webapp????????????"python?app.py"??????????2?minutes?ago???????Up?2?minutes????????????????0.0.0.0:5000->5000/tcp???admiring_mahavira
8c7c7449d859????????centos/python-36-centos7???"container-entrypoin…"???4?minutes?ago???????Exited?(0)?4?minutes?ago?????????????????????????????nostalgic_mccarthy
9df0d290b4e6????????centos/python-36-centos7???"container-entrypoin…"???5?minutes?ago???????Exited?(0)?5?minutes?ago?????????????????????????????wonderful_cohen
c01f59e13a3a????????centos/python-36-centos7???"container-entrypoin…"???5?minutes?ago???????Exited?(0)?5?minutes?ago?????????????????????????????wonderful_hamilton
3c2d40166a8f????????centos/python-36-centos7???"container-entrypoin…"???12?minutes?ago??????Exited?(0)?5?minutes?ago?????????????????????????????pedantic_engelbart
713e29359fcd????????centos/python-36-centos7???"container-entrypoin…"???14?minutes?ago??????Exited?(0)?12?minutes?ago????????????????????????????priceless_allen
29980b073576????????mysql:5.7??????????????????"docker-entrypoint.s…"???7?weeks?ago?????????Exited?(0)?2?hours?ago???????????????????????????????jkcmysql
[root@jkc?docker]#

这样就能找到上面的容器id 8c7c7449d859 ,不过没那么长 ?

docker logs查看日志

可以通过容器id去查运行的日志

docker?logs?[容器id]
[root@jkc?docker]#?docker?logs?8c7c7449d859
hello?world
[root@jkc?docker]#

也可以通过容器的名称去查看,注意这里是容器的名称,不是镜像名称。容器名称是系统自动分配的,如上面的最后一项NAMES 值hopeful_poincare

[root@jkc?docker]#?docker?logs?nostalgic_mccarthy
hello?world

-f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。

[root@jkc?docker]#?docker?logs?-f?8c7c7449d859
hello?world

?

停止容器

可以用ps查看正在运行的容器

docker?ps
[root@jkc?docker]#?docker?ps
CONTAINER?ID????????IMAGE???????????????COMMAND?????????????CREATED?????????????STATUS??????????????PORTS????????????????????NAMES
a67640969dd9????????training/webapp?????"python?app.py"?????9?minutes?ago???????Up?9?minutes????????0.0.0.0:5000->5000/tcp???admiring_mahavira

停止容器的话,可以用docker stop容器的id或者容器NAME名称

docker?stop?a67640969dd9

或者提供容器名称admiring_mahavira来停止

docker?stop?admiring_mahavira

?

启动容器

docker start 容器id

[root@jkc?docker]#?docker?start??a67640969dd9
a67640969dd9
[root@jkc?docker]#?docker?ps
CONTAINER?ID????????IMAGE???????????????COMMAND?????????????CREATED?????????????STATUS??????????????PORTS????????????????????NAMES
a67640969dd9????????training/webapp?????"python?app.py"?????13?minutes?ago??????Up?6?seconds????????0.0.0.0:5000->5000/tcp???admiring_mahavira

正在运行的容器,可以使用 docker restart 命令来重启

[root@jkc?docker]#?docker?restart??a67640969dd9
a67640969dd9

?

进入容器

在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:

docker attach docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。 ?

attach 命令

下面演示了使用 docker attach 命令。

docker?attach?1e560fca3906

注意: 如果从这个容器退出,会导致容器的停止。 ?

exec 命令

下面演示了使用 docker exec 命令。

[root@jkc?easymock]#?docker?exec?-it?25743368a66d?/bin/bash
[root@jkc?easymock]#?docker?exec?-it?25743368a66d?/bin/bash
root@25743368a66d:/opt/webapp#?exit
exit
[root@jkc?easymock]#?docker?ps
CONTAINER?ID????????IMAGE?????????????????????COMMAND??????????????????CREATED?????????????STATUS??????????????PORTS????????????????????NAMES
25743368a66d????????training/webapp???????????"python?app.py"??????????4?minutes?ago???????Up?4?minutes????????5000/tcp?????????????????keen_aryabhata

注意: 如果从这个容器退出,容器不会停止,这就是为什么推荐大家使用 docker exec 的原因。

更多参数说明请使用 docker exec --help 命令查看。 ?

删除容器

使用 docker rm 命令来删除不需要的容器

[root@jkc?docker]#?docker?ps?-a
CONTAINER?ID????????IMAGE??????????????????????COMMAND??????????????????CREATED?????????????STATUS??????????????????????PORTS????????????????????NAMES
a67640969dd9????????training/webapp????????????"python?app.py"??????????14?minutes?ago??????Up?About?a?minute???????????0.0.0.0:5000->5000/tcp???admiring_mahavira
8c7c7449d859????????centos/python-36-centos7???"container-entrypoin…"???17?minutes?ago??????Exited?(0)?17?minutes?ago????????????????????????????nostalgic_mccarthy
9df0d290b4e6????????centos/python-36-centos7???"container-entrypoin…"???18?minutes?ago??????Exited?(0)?18?minutes?ago????????????????????????????wonderful_cohen
c01f59e13a3a????????centos/python-36-centos7???"container-entrypoin…"???18?minutes?ago??????Exited?(0)?18?minutes?ago????????????????????????????wonderful_hamilton
3c2d40166a8f????????centos/python-36-centos7???"container-entrypoin…"???25?minutes?ago??????Exited?(0)?18?minutes?ago????????????????????????????pedantic_engelbart
713e29359fcd????????centos/python-36-centos7???"container-entrypoin…"???26?minutes?ago??????Exited?(0)?25?minutes?ago????????????????????????????priceless_allen
29980b073576????????mysql:5.7??????????????????"docker-entrypoint.s…"???7?weeks?ago?????????Exited?(0)?3?hours?ago???????????????????????????????jkcmysql
[root@jkc?docker]#?docker?rm?8c7c7449d859
8c7c7449d859
[root@jkc?docker]#?docker?rm?9df0d290b4e6
9df0d290b4e6
[root@jkc?docker]#?docker?rm?admiring_mahavira
Error?response?from?daemon:?You?cannot?remove?a?running?container?a67640969dd99d6f26810857d29dd47a43088ea927c03b36dd04dddaf18a4dcf.?Stop?the?container?before?attempting?removal?or?force?remove
[root@jkc?docker]#

但是rm 正在运行的容器时候,它会报错,需先stop,才能rm

[root@jkc?docker]#?docker?stop?admiring_mahavira
admiring_mahavira
[root@jkc?docker]#?docker?rm?admiring_mahavira
admiring_mahavira
[root@jkc?docker]#?docker?ps
CONTAINER?ID????????IMAGE???????????????COMMAND?????????????CREATED?????????????STATUS??????????????PORTS???????????????NAMES
[root@jkc?docker]#

?

删除已经停止运行的容器

如果你跟博主一样有强迫症,在使用docker ps -a发现里面有许多状态为停止的容器,那么可以用下面的命令,将其全部删除

docker?container?prune
[root@jkc?easymock]#?docker?ps?-a
CONTAINER?ID????????IMAGE??????????????????????COMMAND??????????????????CREATED??????????????STATUS??????????????????????????PORTS????????????????????NAMES
9e610e19c9c0????????training/webapp????????????"/bin/bash"??????????????About?a?minute?ago???Exited?(0)?16?seconds?ago????????????????????????????????nervous_robinson
9b977a64610b????????training/webapp????????????"/bin/bash"??????????????About?a?minute?ago???Exited?(0)?About?a?minute?ago????????????????????????????jovial_almeida
becfbf291128????????training/webapp????????????"/bin/bash"??????????????2?minutes?ago????????Exited?(0)?2?minutes?ago?????????????????????????????????compassionate_germain
25743368a66d????????training/webapp????????????"python?app.py"??????????46?minutes?ago???????Exited?(137)?40?minutes?ago??????????????????????????????keen_aryabhata
4d7286571786????????redis:4.0.6????????????????"docker-entrypoint.s…"???48?minutes?ago???????Up?48?minutes???????????????????6379/tcp?????????????????easymock_redis_1
4dc2b090da1b????????easymock/easymock:1.6.0????"/bin/bash?-c?'npm?s…"???48?minutes?ago???????Up?48?minutes???????????????????0.0.0.0:7300->7300/tcp???easymock_web_1
64cfd7181b19????????mongo:3.4.1????????????????"/entrypoint.sh?mong…"???48?minutes?ago???????Up?48?minutes???????????????????27017/tcp????????????????easymock_mongodb_1
713e29359fcd????????centos/python-36-centos7???"container-entrypoin…"???24?hours?ago?????????Exited?(0)?24?hours?ago??????????????????????????????????priceless_allen
29980b073576????????mysql:5.7??????????????????"docker-entrypoint.s…"???8?weeks?ago??????????Exited?(0)?26?hours?ago??????????????????????????????????jkcmysql
[root@jkc?easymock]#?docker?container?prune
WARNING!?This?will?remove?all?stopped?containers.
Are?you?sure?you?want?to?continue??[y/N]?y
Deleted?Containers:
9e610e19c9c0389b23b3d4e1bc35023483d8e88ec4733b6f0e639596f02cd246
9b977a64610bf22f051d4bc14c08c430b3508a630cd5d3f69cb228fe368b80a0
becfbf29112833f627e7d1751ef08184ffa5a7f51f38a810281f110813935588
25743368a66d395c2a1204d798ac0e53297ad1d25c13aa5ce0ff409daf62d2bd
713e29359fcd4b2f089df0246b17b24ae0f20a315c81ccbe285e207ff920f8d2
29980b0735760a3c0a878c500b85e91f1d4e804c13d87073e07ace27bdcda7ce

Total?reclaimed?space:?85B
[root@jkc?easymock]#?docker?ps?-a
CONTAINER?ID????????IMAGE?????????????????????COMMAND??????????????????CREATED?????????????STATUS??????????????PORTS????????????????????NAMES
4d7286571786????????redis:4.0.6???????????????"docker-entrypoint.s…"???51?minutes?ago??????Up?51?minutes???????6379/tcp?????????????????easymock_redis_1
4dc2b090da1b????????easymock/easymock:1.6.0???"/bin/bash?-c?'npm?s…"???51?minutes?ago??????Up?51?minutes???????0.0.0.0:7300->7300/tcp???easymock_web_1
64cfd7181b19????????mongo:3.4.1???????????????"/entrypoint.sh?mong…"???51?minutes?ago??????Up?51?minutes???????27017/tcp????????????????easymock_mongodb_1
[root@jkc?easymock]#

上面留下的都是正在运行的容器状态为up ?

查看更多关于docker(3)快速搭建centos7-python3.6环境的详细内容...

  阅读:34次