IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Docker入门使用指南

    chancel发表于 2024-06-14 00:00:00
    love 0
    <![CDATA[

    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,输入如下内容

    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!
    



沪ICP备19023445号-2号
友情链接