menu Chancel's blog
rss_feed
Chancel's blog
有善始者实繁,能克终者盖寡。

Docker入门使用指南

作者:Chancel Yang, 创建:2019-03-01, 字数:2615, 已阅:38, 最后更新:2024-06-14

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

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

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

当然,也有不足之处

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

1. 基础

1.1. 基础概念

Docker的核心概念

  • 仓库: 类似于github一样,docker也有提供大量的基础镜像,如ubuntu2204/Cent7等基础镜像,像dockerhubdocker-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,输入如下内容

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

Bash
pip3 install flask
python3 app.py

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

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

2.2. Docker部署

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

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

目录的形式如下

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

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

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

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

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

2.3. Docker运行

我们运行这个镜像

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

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

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

[[replyMessage== null?"发表评论":"发表评论 @ " + replyMessage.m_author]]

account_circle
email
web_asset
textsms

评论列表([[messageResponse.total]])

还没有可以显示的留言...
gravatar
[[messageItem.m_author]] [[messageItem.m_author]]
[[messageItem.create_time]]
[[getEnviron(messageItem.m_environ)]]
[[subMessage.m_author]] [[subMessage.m_author]] @ [[subMessage.parent_message.m_author]] [[subMessage.parent_message.m_author]]
[[subMessage.create_time]]
[[getEnviron(messageItem.m_environ)]]