基于Python的Web服务器系列相关文章编写如下:
官网地址:
https://hub.docker.com/
https://docs.docker.com/get-started/
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 包括三个基本概念:
新建测试文件夹:
mkdir mytest
cd mytest
python3 -m venv myvenv
source myvenv/bin/activate
在文件夹mytest下,创建一个demo.py启动文件,代码如下:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'hello docker & flask & 爱看书的小沐.'
if __name__ == '__main__':
app.run(host="0.0.0.0", debug=True)
from flask import Flask, render_template
import os
app = Flask(__name__)
@app.route('/')
def home():
return render_template('index.html')
if __name__ == "__main__":
port = int(os.environ.get('PORT', 5000))
app.run(debug=True, host='0.0.0.0', port=port)
输入下面命令可以测试一下是否能正常跑起来:
python demo.py
pip install flask
再执行python demo.py命令,如下:
flask服务器启动成功,浏览器访问如下:
guincorn是支持wsgi协议的http server,gevent只是它支持的模式之一 ,是为了解决django、flask这些web框架自带wsgi server性能低下的问题。
安装相关库如下:
pip install gunicorn gevent flask
同时在mytest目录下新建配置文件gunicorn.conf.py
workers = 5 # 定义同时开启的处理请求的进程数量,根据网站流量适当调整
worker_class = "gevent" # 采用gevent库,支持异步处理请求,提高吞吐量
bind = "0.0.0.0:5000" #端口随便写,但是注意是否已经被占用。netstap -lntp
gunicorn demo:app -c gunicorn.conf.py
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# or
curl -sSL https://get.daocloud.io/docker | sh
sudo apt-get remove docker docker-engine docker.io containerd runc
当前称为 Docker Engine-Community 软件包 docker-ce 。
安装 Docker Engine-Community,以下介绍两种方式。
在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker 。
# 更新 apt 包索引
sudo apt-get update
# 添加 Docker 的官方 GPG 密钥
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 验证您现在是否拥有带有指纹的密钥
sudo apt-key fingerprint 0EBFCD88
# 使用以下指令设置稳定版仓库
sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/ \
$(lsb_release -cs) \
stable"
sudo apt-get install docker-ce docker-ce-cli containerd.io
apt-cache madison docker-ce
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
卸载 docker:
# 删除安装包:
sudo apt-get purge docker-ce
# 删除镜像、容器、配置文件等内容:
sudo rm -rf /var/lib/docker
# 查看Docker服务状态
sudo systemctl status docker
# 停止Docker服务
sudo systemctl stop docker
# 启动Docker服务
sudo systemctl start docker
# 重启Docker服务
sudo systemctl restart docker
# 搜索Docker镜像hello-world
sudo docker search hello-world
# 拉取Docker镜像(Images)
sudo docker image pull docker.io/hello-world
# 查看Docker镜像(Images)
sudo docker image ls
# 启动Docker镜像(Images)
sudo docker run hello-world
用来构建项目所需要的运行环境依赖:
通过命令pip freeze生成依赖文件:
pip freeze > requirements.txt
gunicorn
gevent
flask
什么是Dockerfile?
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),有了 Dockerfile,就可以创建我们所需要的镜像
Dockerfile里面的组成部分如下:
新建一个文件dockerfile。
FROM python:3.8
WORKDIR /xiaomu/project/
COPY requirements.txt ./
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY . .
CMD ["gunicorn", "demo:app", "-c", "./gunicorn.conf.py"] #用于指定默认的容器主进程的启动命令
# start by pulling the python image
FROM python:3.8-alpine
# copy the requirements file into the image
COPY ./requirements.txt /app/requirements.txt
# switch working directory
WORKDIR /app
# install the dependencies and packages in the requirements file
RUN pip install -r requirements.txt
# copy every content from the local file to the image
COPY . /app
# configure the container to run in an executed manner
ENTRYPOINT [ "python" ]
CMD ["demo.py" ]
参数解释如下:
FROM python:3.8-alpine: Since Docker allows us to inherit existing images, we install a Python image and install it in our Docker image. Alpine is a lightweight Linux distro that will serve as the OS on which we install our image
COPY ./requirements.txt /app/requirements.txt: Here, we copy the requirements file and its content (the generated packages and dependencies) into the app folder of the image
WORKDIR /app: We proceed to set the working directory as /app, which will be the root directory of our application in the container
RUN pip install -r requirements.txt: This command installs all the dependencies defined in the requirements.txt file into our application within the container
COPY . /app: This copies every other file and its respective contents into the app folder that is the root directory of our application within the container
ENTRYPOINT [ "python" ]: This is the command that runs the application in the container
CMD [ "demo.py" ]: Finally, this appends the list of parameters to the EntryPoint parameter to perform the command that runs the application. This is similar to how you would run the Python app on your terminal using the python view.py command
docker拉取镜像过慢,Docker国内镜像加速地址,docker下载镜像太慢。
可以通过修改 daemon 配置文件 /etc/docker/daemon.json 来使用加速器。
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://o6ul5754.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
创建或修改/etc/docker/daemon.json文件
默认没有daemon文件,先创建。
sudo cd /etc
sudo mkdir docker
sudo cd docker
sudo vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://ung2thfc.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
另外vim的相关操作命令如下:
:w 保存文件但不退出vi
:w file 将修改另外保存到file中,不退出vi
:w! 强制保存,不推出vi
:wq 保存文件并退出vi
:wq! 强制保存文件,并退出vi
:q 不保存文件,退出vi
:q! 不保存文件,强制退出vi
:e! 放弃所有修改,从上次保存文件开始再编辑命令历史
加载重启docker:
systemctl daemon-reload
systemctl restart docker
验证是否成功:
docker info
测试发现拉取镜像,速度极快。
构建docker镜像(镜像它的名字随意取)。
sudo docker build -t 'xiaomu_docker' .
sudo docker images
Docker容器运行方式总结:
# Docker单次运行的语法为:
docker run IMAGE [COMMAND] [ARG]
# Docker交互式运行的语法为:
docker run -i -t IMAGE [COMMAND] [ARG]
# Docker后台运行的语法为:
docker run -d IMAGE [COMMAND] [ARG]
执行如下命令,启动一个容器。
# docker run --name flask_container -p 80:80 flask_image
# docker run -p 5000:5000 -d flask_docker
sudo docker run -it --rm -p 5000:5000 xiaomu_docker
--name gives the container a name that can be found in docker ps output
-p instructs to publish port 80. Second 80 after semicolons tells what port nginx inside the container listens on
-d runs container detached from terminal. Logs then can be viewed by issuing docker logs command
docker run 加上–rm退出容器以后,这个容器就被删除了,方便在临时测试使用。
不加–rm 退出容器后,容器只是停止运行,数据任然被保留。 不过容器内数据卷的内容不会被删除。
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--env-file=[]: 从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
--volume , -v: 绑定一个卷
# -it:表示交互式终端的容器,非启动后立刻结束的容器
# -p是端口映射,表示将docker的5000端口,映射到本机的5000端口
# --name 给容器起个名称,这里命名为xiaomu
sudo docker run -it -p 5000:5000 --name=xiaomu xiaomu_image
sudo docker run -d -p 8888:8888 --name test-flask-1 testflask
可以看到Docker镜像成功地运行起来了,并处于阻塞状态。Flask 项目已经成功部署。
sudo docker stop 830f852308af
列出本地实例: docker images
删除镜像 : docker image rm 镜像名:标签名
查看容器: docker container ls -a
查看当前运行容器: docker ps
显示出所有容器,包括没有启动的: docker ps -a
停止容器: docker stop $CONTAINER_ID
启动容器: docker start $CONTAINER_ID
用于查看 docker 容器的版本信息: docker version
用于查看 docker 容器的基本信息: docker info
删除本地一个或多个 Docker镜像: docker rmi
用于删除本地一个或多个Docker容器: docker rm
杀掉一个或者多个正在运行的 Docker容器: docker kill
用来重新启动一个或者多个 Docker容器: docker restart
暂停 Docker容器 中所有的进程: docker pause
用来恢复 Docker容器 中所有的进程: docker unpause
运行的 Docker容器 中执行命令: docker exec
创建一个新的 Docker容器,类似 docker run -d: docker create
docker run 只在第一次运行时使用,将镜像放到容器中,以后再次启动这个容器时,只需要使用命令docker start 即可。
Publish your image on Docker Hub。
Docker Hub is the world’s largest library and community for container images。
Docker Hub is the world’s easiest way to create, manage, and deliver your team’s container applications.
在docker中,tag是一个用于给镜像打标签的命令;tag命令可以标记本地镜像,并且将其归入某一仓库,语法为“docker tag [OPTIONS] IMAGE [:TAG] [REGISTRYHOST/] [USERNAME/]NAME [:TAG]”
sudo docker tag xiaomu_docker:latest hifisher/xiaomu_docker:latest
登录docker,输入账号密码:
sudo docker login
在docker hub网站上新建一个仓库xiaomu_docker。要创建存储库,请执行以下操作:
push上docker hub,成功之后可以登录docker网站查看是否已经存在。
将镜像推送到docker
# docker push hifisher/xiaomu_docker:tagname
sudo docker push hifisher/xiaomu_docker:latest
docker pull 账号名/线上名称:latest
如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;
╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地
//(ㄒoㄒ)//,就在评论处留言,作者继续改进;
o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;
(✿◡‿◡)
感谢各位大佬童鞋们的支持!
( ´ ▽´ )ノ ( ´ ▽´)っ!!!