Docker入门使用指南

Docker是一个容器化平台,通过将应用程序及其依赖项打包为容器,实现了快速部署、可移植和环境一致性的优势。它简化了应用程序的构建、管理和部署过程,提高了开发和部署的效率。

与虚拟机类似,但Docker是一种轻量化虚拟的丝路,与传统服务器部署相比

部署方便,减少环境搭建步骤 提高安全,高度统一的环境 隔离性强,多个应用环境相互隔壁 快速回滚,提供版本管理

当然,也有不足之处

隔离性的稳定问题 存储的复杂性提高 学习成本高

1. 基础

1.1. 基础概念

Docker的核心概念

仓库: 类似于github一样,docker也有提供大量的基础镜像,如ubuntu2204/Cent7等基础镜像,像dockerhub、docker-cn 镜像: 相当于一个虚拟机模板,引入一个基础镜像后,再加上部分工具链安装,就可以构成一个应用 容器: 基于镜像创建一个实例运行

Docker非常适合于持续交付的服务,常规的web服务、多服务协同、微服务架构等使用场景

1.2. 基础操作

对于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

1.3. Dockerfile

Dockerfile是用于定义Docker镜像构建过程的文本文件。包含一系列指令,用于指导Docker引擎在构建镜像时执行的操作

用Dockerfile执行构建,则可以得到镜像,类似于传统项目的打包

FROM:指定基础镜像,即构建新镜像所依赖的基础环境。 RUN:在镜像中运行命令,用于安装软件包、执行脚本等操作。 COPY:将文件从主机复制到镜像中的指定目录。 ADD:类似于COPY指令,但还支持URL和解压缩功能。 WORKDIR:设置工作目录,即在镜像中运行命令时的默认目录。 ENV:设置环境变量。 EXPOSE:声明容器运行时所监听的端口。 CMD:指定容器启动时要运行的命令,可以有多个CMD指令,但只有最后一个生效。

常见指令有如上几个

2. 实践

实践出真知,以包装一个python的flask应用为例吧,我们首先写一个简易的flask应用

2.1. Flask应用

编辑 app.py,输入如下内容

Pythoncontent_copy
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并运行这个应用

Bashcontent_copy
pip3 install flask
python3 app.py

访问http://localhost:5000/,可以看到返回hello-world

Bashcontent_copy
$ curl http://localhost:5000
Hello, World!

2.2. Docker部署

将上面的Flask包装成一个Docker镜像,我们需要写一个Dockerfile,如下

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

目录的形式如下

Bashcontent_copy
tree                                 
.
├── app.py
└── Dockerfile

现在我们可以打包这个应用

Bashcontent_copy
# 镜像名称flask-hello-world,标签是latest,不使用构建缓存
sudo docker build -t flask-hello-world:latest . --no-cache

打印本地所有镜像列表,可以看到我们的镜像顺利打包了

Bashcontent_copy
$ sudo docker images                   
REPOSITORY                     TAG         IMAGE ID       CREATED         SIZE
flask-hello-world              latest      d0bede20d8e9   7 seconds ago   59.2MB
...

2.3. Docker运行

我们运行这个镜像

Bashcontent_copy
# -d表示后台运行,-p表示端口映射
sudo docker run -d -p 5000:5000 flask-hello-world

访问http://localhost:5000/,可以看到返回hello-world

Bashcontent_copy
$ curl http://localhost:5000
Hello, World!

文章来源:

Author:chancel
link:http://www.chancel.me/markdown/docker-getting-started-guide