1. 程式人生 > 實用技巧 >docker(3)快速搭建centos7-python3.6環境

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

前言

當我們在一臺電腦上搭建了python3.6的環境,下次換臺電腦,又得重新搭建一次,設定環境變數等操作。
好不容易安裝好,一會提示pip不是內部或外部命令,一會又提示pip: command not found,想死的心都有了。
搭建環境是真的麻煩,不弄好又不行,從今天開始學好docker,環境問題從此和你說再見

docker search搜尋映象

docker search : 從Docker Hub(https://hub.docker.com)中搜索指定的映象
比如我這裡搜尋一個基於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]
clearlinux/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   

下載pull映象

上面找的想要下載的映象centos/python-36-centos7,接下來下載到自己本地

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.com搜尋即可

點選選中的標籤,進入複製命令即可

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) 進行互動
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

停止容器的話,可以用stop容器的id或者容器NAME名稱

docker stop a67640969dd9

或者提供容器名稱admiring_mahavira來停止

docker stop admiring_mahavira

啟動容器

提供start啟動容器

[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

刪除容器

使用 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]#