作者:Chancel Yang, 创建:2019-03-26, 字数:2615, 已阅:737, 最后更新:2019-03-26
Docker是一个容器化平台,通过将应用程序及其依赖项打包为容器,实现了快速部署、可移植和环境一致性的优势。它简化了应用程序的构建、管理和部署过程,提高了开发和部署的效率。
与虚拟机类似,但Docker是一种轻量化虚拟
的丝路,与传统服务器部署相比
当然,也有不足之处
Docker的核心概念
github
一样,docker也有提供大量的基础镜像,如ubuntu2204
/Cent7
等基础镜像,像dockerhub、docker-cnDocker非常适合于持续交付的服务,常规的web
服务、多服务协同、微服务架构等使用场景
对于docker而言,以下操作是比较常见的,以hello-world
为例
docker pull hello-world
docker run hello-world
docker ps
docker exec -it hello-world bash
docker start/stop/restart hello-world
docker rm hello-world
更多的docker可以直接参考docker --help
Dockerfile
是用于定义Docker镜像构建过程的文本文件。包含一系列指令,用于指导Docker引擎在构建镜像时执行的操作
用Dockerfile执行构建,则可以得到镜像
,类似于传统项目的打包
FROM
:指定基础镜像,即构建新镜像所依赖的基础环境。RUN
:在镜像中运行命令,用于安装软件包、执行脚本等操作。COPY
:将文件从主机复制到镜像中的指定目录。ADD
:类似于COPY指令,但还支持URL和解压缩功能。WORKDIR
:设置工作目录,即在镜像中运行命令时的默认目录。ENV
:设置环境变量。EXPOSE
:声明容器运行时所监听的端口。CMD
:指定容器启动时要运行的命令,可以有多个CMD指令,但只有最后一个生效。常见指令有如上几个
实践出真知,以包装一个python的flask应用为例吧,我们首先写一个简易的flask应用
编辑 app.py
,输入如下内容
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(host='0.0.0.0')
我们安装flask并运行这个应用
pip3 install flask
python3 app.py
访问http://localhost:5000/
,可以看到返回hello-world
$ curl http://localhost:5000
Hello, World!
将上面的Flask包装成一个Docker镜像,我们需要写一个Dockerfile
,如下
# 使用Python 3.9作为基础镜像
FROM python:3.9-alpine
# 设置工作目录为/app
WORKDIR /app
# 安装依赖包
RUN pip install flask
# 将app.py复制到容器中
COPY app.py .
# 暴露容器的5000端口
EXPOSE 5000
# 容器启动时运行的命令
CMD ["python", "app.py"]
目录的形式如下
tree
.
├── app.py
└── Dockerfile
现在我们可以打包这个应用
# 镜像名称flask-hello-world,标签是latest,不使用构建缓存
sudo docker build -t flask-hello-world:latest . --no-cache
打印本地所有镜像列表,可以看到我们的镜像顺利打包了
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
flask-hello-world latest d0bede20d8e9 7 seconds ago 59.2MB
...
我们运行这个镜像
# -d表示后台运行,-p表示端口映射
sudo docker run -d -p 5000:5000 flask-hello-world
访问http://localhost:5000/
,可以看到返回hello-world
$ curl http://localhost:5000
Hello, World!