笺注: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/
注释:此时,外面的客户端访问宿主机的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/
注释:此时,外面的客户端访问宿主机的TCP 82端口时,等于访问容器“Flash_2”的TCP 83端口。
此时,客户端依然可以访问第一个Flask网站:
http://192.168.168.154:80/
######
更改脚本“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/
注释:此时,外面的客户端访问宿主机的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 |