返回列表 发帖

CentOS8_在Docker中安装Flask

笺注:Docker的安装可参考 CentOS8_使用Docker安装Python3


查看宿主机的所有镜像:( Docker安装完毕后,默认是没有任何镜像 )
[root@centos8 ~]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
[root@centos8 ~]#


从公网下载镜像:( 以下是下载Python3.8的镜像 )
[root@centos8 ~]# docker pull python:3.8
3.8: Pulling from library/python
32de3c850997: Pull complete
fa1d4c8d85a4: Pull complete
c796299bbbdd: Pull complete
81283a9569ad: Pull complete
60b38700e7fb: Pull complete
0f67f32c26d3: Pull complete
e04be0d92e59: Pull complete
b5052f164cdb: Pull complete
e9c72aa5d062: Pull complete
Digest: sha256:c2e327c1f8243d58c3138826ae2b20bdc7ba16c52b9dbf0cf0492b0817d9e3f2
Status: Downloaded newer image for python:3.8
docker.io/library/python:3.8
[root@centos8 ~]#


再次,查看宿主机的所有镜像:
[root@centos8 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
python       3.8       51a078947558   14 hours ago   913MB
[root@centos8 ~]#



在宿主机查看正在运行的容器:( 默认是没有任何容器 )
[root@centos8 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@centos8 ~]#


使用镜像“python:3.8”创建并启动容器“Flash_1”:
[root@centos8 ~]# docker run -itd --name Flash_1 -p 80:81 -v /opt/python_home:/home/python python:3.8
c8d8c038b1bd723693adacf57dd07e4fdd53c8e7e725f514fd971f7bcb2555cc
[root@centos8 ~]#

注释:
-itd : 以交互模式情况下后台运行。
--name : 指定容器名称。
-p 端口映射 : 80是宿主机的端口,暴露给外部直接访问;81是容器的端口。
-v 挂载目录 : 这里是把宿主机的目录/opt/python_home挂载到容器的目录/home/python;假如目录不存在,就会自动创建。
python:3.8 : 镜像名称:版本号


再次,在宿主机查看正在运行的容器:
[root@centos8 ~]# docker ps
CONTAINER ID   IMAGE        COMMAND     CREATED              STATUS              PORTS                               NAMES
c8d8c038b1bd   python:3.8   "python3"   About a minute ago   Up About a minute   0.0.0.0:80->81/tcp, :::80->81/tcp   Flash_1
[root@centos8 ~]#

注释:宿主机的TCP 80端口,映射到容器“Flash_1”的TCP 81端口。



###

进入容器“Flash_1”:
[root@centos8 ~]# docker exec -it Flash_1 /bin/bash
root@c8d8c038b1bd:/#

查看容器“Flash_1”的系统版本信息:
root@c8d8c038b1bd:/# cat /etc/issue
Debian GNU/Linux 11 \n \l

root@c8d8c038b1bd:/# more /etc/debian_version
11.6
root@c8d8c038b1bd:/# uname -r
4.18.0-193.el8.x86_64
root@c8d8c038b1bd:/#



容器“Flash_1”已经安装好Python3:
root@c8d8c038b1bd:/# python3
Python 3.8.16 (default, Dec 21 2022, 19:32:01)
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print('Welcome to zhuohua.')
Welcome to zhuohua.
>>>


在容器“Flash_1”中安装第三方库(Flask):
root@c8d8c038b1bd:/# pip3 freeze
root@c8d8c038b1bd:/#

root@c8d8c038b1bd:/# pip3 install flask -i http://mirrors.aliyun.com/pypi/simple --trusted-host=mirrors.aliyun.com

安装成功后,列出当前环境中所有已经安装的第三方库的名称和其版本号:
root@c8d8c038b1bd:/# pip3 freeze
click==8.1.3
Flask==2.2.2
importlib-metadata==5.2.0
itsdangerous==2.1.2
Jinja2==3.1.2
MarkupSafe==2.1.1
Werkzeug==2.2.2
zipp==3.11.0
root@c8d8c038b1bd:/#

注释:会附带安装一些其他的依赖软件包。



######

在宿主机的目录/opt/python_home里创建一个脚本“index_1.py”:
[root@centos8 ~]# cd /opt/python_home
[root@centos8 python_home]# vi index_1.py

写入:
#coding=utf-8
from flask import Flask

app = Flask(__name__)

@app.route("/")
def func1():
        return "Welcome to zhuohua! 这是第一个Flask网站。"
               
if __name__ == '__main__':
        app.run(host='0.0.0.0',port=81,debug=True)

注释:此时,第一个Flask网站的访问端口设置为81,即TCP 81端口,也可以自定义为别的数字。



因为在创建容器“Flash_1”的时候,把宿主机的目录/opt/python_home挂载到容器的目录/home/python,所以这两个目录里的数据是双向同步的:
root@c8d8c038b1bd:~# cd /home/python/
root@c8d8c038b1bd:/home/python# ls
index_1.py

在容器“Flash_1”中运行脚本“index_1.py”:
root@c8d8c038b1bd:/home/python# python3 index_1.py



###

在宿主机的防火墙firewalld打开TCP 80端口:
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload

查看防火墙所有打开的端口:
[root@centos8 ~]# firewall-cmd --zone=public --list-ports
80/tcp


客户端访问第一个Flask网站:
http://192.168.168.154/
图片1.png
注释:此时,外面的客户端访问宿主机的TCP 80端口时,等于访问容器“Flash_1”的TCP 81端口。



######

容器“Flash_1”在宿主机的存放目录:
[root@centos8 ~]# cd /var/lib/docker/containers/
[root@centos8 containers]# ls
c8d8c038b1bd723693adacf57dd07e4fdd53c8e7e725f514fd971f7bcb2555cc
[root@centos8 containers]#

[root@centos8 containers]# cd c8d8c038b1bd723693adacf57dd07e4fdd53c8e7e725f514fd971f7bcb2555cc/
[root@centos8 c8d8c038b1bd723693adacf57dd07e4fdd53c8e7e725f514fd971f7bcb2555cc]# ls
c8d8c038b1bd723693adacf57dd07e4fdd53c8e7e725f514fd971f7bcb2555cc-json.log  hostconfig.json  mounts
checkpoints                                                                hostname         resolv.conf
config.v2.json                                                             hosts            resolv.conf.hash
[root@centos8 c8d8c038b1bd723693adacf57dd07e4fdd53c8e7e725f514fd971f7bcb2555cc]#

容器“Flash_1”的文件config.v2.json中的一些信息:

容器ID : "Config":{"Hostname":"c8d8c038b1bd",

Python相关软件的版本:
"PYTHON_VERSION=3.8.16","PYTHON_PIP_VERSION=22.0.4","PYTHON_SETUPTOOLS_VERSION=57.5.0",

端口映射 : ( 把宿主机的TCP 80端口,映射到容器的TCP 81端口 )
"Ports":{"81/tcp":[{"HostIp":"0.0.0.0","HostPort":"80"},{"HostIp":"::","HostPort":"80"}]},

挂载目录的信息:( 把宿主机的目录/opt/python_home挂载到容器的目录/home/python
"MountPoints":{"/home/python":{"Source":"/opt/python_home","Destination":"/home/python","RW":true,"Name":"","Driver":"","Type":"bind","Propagation":"rprivate","Spec":{"Type":"bind","Source":"/opt/python_home","Target":"/home/python"},














############
############

把容器“Flash_1”创建成一个新镜像:
[root@centos8 ~]# docker commit Flash_1 newimage_1:3.88
sha256:e76fd1ba917c04bad4fc1deee5d0a448e079363f1d45933833abd7e55c613556
[root@centos8 ~]#


新镜像“newimage_1:3.88”创建成功:
[root@centos8 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
newimage_1   3.88      e76fd1ba917c   54 seconds ago   924MB
python       3.8       51a078947558   15 hours ago     913MB
[root@centos8 ~]#


使用镜像“newimage_1:3.88”创建并启动容器“Flash_2”:
[root@centos8 ~]# docker run -itd --name Flash_2 -p 82:83 -p 84:85 -v /opt/python_home:/home/python -v /mnt:/home/dir_2 newimage_1:3.88
ea193840db2b760196974c0a7ebf171cf267d8ff7b98d9e2c675bbfe73c4b3f0
[root@centos8 ~]#

注释:
-itd : 以交互模式情况下后台运行。
--name : 指定容器名称。
-p 端口映射 : 82、84是宿主机的端口,暴露给外部直接访问;83、85是容器的端口。
newimage_1:3.88 : 镜像名称:版本号。

-v 挂载目录 :
把宿主机的目录/opt/python_home挂载到容器的目录/home/python
把宿主机的目录/mnt挂载到容器的目录/home/dir_2



再次,在宿主机查看正在运行的容器:
[root@centos8 ~]# docker ps
CONTAINER ID   IMAGE             COMMAND     CREATED         STATUS         PORTS                                                                          NAMES
ea193840db2b   newimage_1:3.88   "python3"   3 minutes ago   Up 3 minutes   81/tcp, 0.0.0.0:82->83/tcp, :::82->83/tcp, 0.0.0.0:84->85/tcp, :::84->85/tcp   Flash_2
c8d8c038b1bd   python:3.8        "python3"   2 hours ago     Up 2 hours     0.0.0.0:80->81/tcp, :::80->81/tcp                                              Flash_1
[root@centos8 ~]#

注释:
宿主机的TCP 82端口,映射到容器“Flash_2”的TCP 83端口。
宿主机的TCP 84端口,映射到容器“Flash_2”的TCP 85端口。



###

进入容器“Flash_2”:
[root@centos8 ~]# docker exec -it Flash_2 /bin/bash
root@ea193840db2b:/#

在容器“Flash_2”中已经安装好第三方库(Flask):
root@ea193840db2b:/# pip3 freeze
click==8.1.3
Flask==2.2.2
importlib-metadata==5.2.0
itsdangerous==2.1.2
Jinja2==3.1.2
MarkupSafe==2.1.1
Werkzeug==2.2.2
zipp==3.11.0
root@ea193840db2b:/#


因为在创建容器“Flash_2”的时候,也把宿主机的目录/opt/python_home挂载到自己的目录/home/python,所以宿主机的目录/opt/python_home、容器“Flash_1”的目录/home/python、容器“Flash_2”的目录/home/python的数据是共享的:
root@ea193840db2b:/# cd /home/python
root@ea193840db2b:/home/python# ls
index_1.py



######

在宿主机的目录/mnt里创建一个脚本“index_2.py”:
[root@centos8 ~]# cd /mnt
[root@centos8 mnt]# vi index_2.py

写入:
#coding=utf-8
from flask import Flask

app = Flask(__name__)

@app.route("/")
def func1():
        return "Welcome to zhuohua! 这是第二个Flask网站。"
               
if __name__ == '__main__':
        app.run(host='0.0.0.0',port=83,debug=True)

注释:此时,第二个Flask网站的访问端口设置为83,即TCP 83端口。



因为在创建容器“Flash_2”的时候,把宿主机的目录/mnt挂载到容器的目录/home/dir_2,所以这两个目录里的数据是双向同步的:
root@ea193840db2b:/# cd /home/dir_2/
root@ea193840db2b:/home/dir_2# ls
hgfs  index_2.py

在容器“Flash_2”中运行脚本“index_2.py”:
root@ea193840db2b:~# python3 /home/dir_2/index_2.py



###

在宿主机的防火墙firewalld打开TCP 82端口:
firewall-cmd --zone=public --add-port=82/tcp --permanent
firewall-cmd --reload

查看防火墙所有打开的端口:
[root@centos8 ~]# firewall-cmd --zone=public --list-ports
80/tcp 82/tcp


客户端访问第二个Flask网站:
http://192.168.168.154:82/
图片2.png
注释:此时,外面的客户端访问宿主机的TCP 82端口时,等于访问容器“Flash_2”的TCP 83端口。


此时,客户端依然可以访问第一个Flask网站:
http://192.168.168.154:80/
图片3.png





######

更改脚本“index_2.py”中的端口:
root@ea193840db2b:~# cat /home/dir_2/index_2.py
#coding=utf-8
from flask import Flask

app = Flask(__name__)

@app.route("/")
def func1():
        return "Welcome to zhuohua! 这是第二个Flask网站。"
               
if __name__ == '__main__':
        app.run(host='0.0.0.0',port=85,debug=True)

注释:此时,第二个Flask网站的访问端口设置为85,即TCP 85端口。


重新在容器“Flash_2”中运行脚本“index_2.py”:
root@ea193840db2b:~# python3 /home/dir_2/index_2.py



###

在宿主机的防火墙firewalld打开TCP 84端口:
firewall-cmd --zone=public --add-port=84/tcp --permanent
firewall-cmd --reload

查看防火墙所有打开的端口:
[root@centos8 ~]# firewall-cmd --zone=public --list-ports
80/tcp 82/tcp 84/tcp


客户端重新访问第二个Flask网站:
http://192.168.168.154:84/
图片4.png
注释:此时,外面的客户端访问宿主机的TCP 84端口时,等于访问容器“Flash_2”的TCP 85端口。



######

容器“Flash_2”在宿主机的存放目录:
[root@centos8 ~]# cd /var/lib/docker/containers/
[root@centos8 containers]# ls
c8d8c038b1bd723693adacf57dd07e4fdd53c8e7e725f514fd971f7bcb2555cc
ea193840db2b760196974c0a7ebf171cf267d8ff7b98d9e2c675bbfe73c4b3f0
[root@centos8 containers]#

[root@centos8 containers]# cd ea193840db2b760196974c0a7ebf171cf267d8ff7b98d9e2c675bbfe73c4b3f0/
[root@centos8 ea193840db2b760196974c0a7ebf171cf267d8ff7b98d9e2c675bbfe73c4b3f0]# ls
checkpoints                                                                hostconfig.json  mounts
config.v2.json                                                             hostname         resolv.conf
ea193840db2b760196974c0a7ebf171cf267d8ff7b98d9e2c675bbfe73c4b3f0-json.log  hosts            resolv.conf.hash
[root@centos8 ea193840db2b760196974c0a7ebf171cf267d8ff7b98d9e2c675bbfe73c4b3f0]#

容器“Flash_2”的文件config.v2.json中的一些信息:

容器ID : "Config":{"Hostname":"ea193840db2b",

端口映射 :
"Ports":{"81/tcp":null,"83/tcp":[{"HostIp":"0.0.0.0","HostPort":"82"},{"HostIp":"::","HostPort":"82"}],"85/tcp":[{"HostIp":"0.0.0.0","HostPort":"84"},{"HostIp":"::","HostPort":"84"}]},

注释:
宿主机的TCP 82端口,映射到容器的TCP 83端口。
宿主机的TCP 84端口,映射到容器的TCP 85端口。



挂载目录的信息:
"MountPoints":{"/home/dir_2":{"Source":"/mnt","Destination":"/home/dir_2","RW":true,"Name":"","Driver":"","Type":"bind","Propagation":"rprivate","Spec":{"Type":"bind","Source":"/mnt","Target":"/home/dir_2"},"SkipMountpointCreation":false},"/home/python":{"Source":"/opt/python_home","Destination":"/home/python","RW":true,"Name":"","Driver":"","Type":"bind","Propagation":"rprivate","Spec":{"Type":"bind","Source":"/opt/python_home","Target":"/home/python"},





######

在宿主机查看所有的容器:(无论是否正在运行)
[root@centos8 ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND     CREATED          STATUS          PORTS                                                                          NAMES
ea193840db2b   newimage_1:3.88   "python3"   42 minutes ago   Up 42 minutes   81/tcp, 0.0.0.0:82->83/tcp, :::82->83/tcp, 0.0.0.0:84->85/tcp, :::84->85/tcp   Flash_2
c8d8c038b1bd   python:3.8        "python3"   3 hours ago      Up 3 hours      0.0.0.0:80->81/tcp, :::80->81/tcp                                              Flash_1
[root@centos8 ~]#


停止容器“Flash_2”:
[root@centos8 ~]# docker stop Flash_2
Flash_2
[root@centos8 ~]#


再次,在宿主机查看所有的容器:
[root@centos8 ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND     CREATED          STATUS                            PORTS                               NAMES
ea193840db2b   newimage_1:3.88   "python3"   45 minutes ago   Exited (137) About a minute ago                                       Flash_2
c8d8c038b1bd   python:3.8        "python3"   3 hours ago      Up 3 hours                        0.0.0.0:80->81/tcp, :::80->81/tcp   Flash_1
[root@centos8 ~]#


启动容器“Flash_2”:(启动已经存在的容器,要用这个方式)
[root@centos8 ~]# docker start Flash_2
Flash_2
[root@centos8 ~]#


再次,在宿主机查看所有的容器:
[root@centos8 ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND     CREATED          STATUS          PORTS                                                                          NAMES
ea193840db2b   newimage_1:3.88   "python3"   47 minutes ago   Up 29 seconds   81/tcp, 0.0.0.0:82->83/tcp, :::82->83/tcp, 0.0.0.0:84->85/tcp, :::84->85/tcp   Flash_2
c8d8c038b1bd   python:3.8        "python3"   3 hours ago      Up 3 hours      0.0.0.0:80->81/tcp, :::80->81/tcp                                              Flash_1
[root@centos8 ~]#





相关文章:
CentOS8安装Flask+Apache2.4反向代理

CentOS8_在Docker的容器内自动启动服务
CentOS8_在Docker中安装Oracle19c

返回列表