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

Docker入门使用指南

作者:E4b9a6, 创建:2021-07-21, 字数:3375, 已阅:103, 最后更新:2021-07-21

这篇文章更新于 1219 天前,文中部分信息可能失效,请自行甄别无效内容。

Docker是一个容器化平台,通过将应用程序及其依赖项打包为容器,实现了快速部署、可移植和环境一致性的优势

与虚拟机类似,但Docker是一种 轻量化虚拟 的思路,与传统服务器部署相比,有如下优点:

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

学习 Docker 需要掌握一定的虚拟化技术,掌握了一定的虚拟化概念后学习曲线较为平缓

1. 入门

1.1. 基础

Docker的核心概念:

  • 仓库hub.docker.com 是 Docker 的官方仓库,提供了大量的基础镜像仓库
  • 镜像: 镜像是一个只读的模板,其中包含创建Docker容器所需的所有内容,它包括了操作系统、应用程序、依赖库以及配置文件等
  • 容器: 容器是镜像运行时的一个实例,它是一个轻量级、独立的可执行软件包,它包含了运行应用程序所需的所有内容

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

1.2. 指令

hub.docker.com/r/nicolargo/glances 为例,运行一个性能监控页面的 Docker 实例

首先是拉取镜像,并实例化运行成容器

Bash
# 拉取镜像
sudo docker pull nicolargo/glances

# 运行镜像
sudo docker run --name glances -p 61208-61209:61208-61209 -e GLANCES_OPT="-w" -v /var/run/docker.sock:/var/run/docker.sock:ro -name glances --pid host nicolargo/glances:latest-full

关键参数说明:

  • --name:容器名称
  • -p:表明映射端口,将宿主机的61208、61209端口映射到容器内部的62108、62109上
  • -e:设置容器内系统环境变量
  • -v:表明映射文件,将宿主机内的文件映射到宿主机内的文件

随后访问 http://localhost:62108 ,看到如下效果:

说明容器运行成功,此外常用的一些操作还包括:

Bash
# 停止容器
sudo docker stop glances

# 启动容器
sudo docker start glances

# 重启容器
sudo docker restart glances

# 进入容器内部
sudo docker exec -it glances /bin/bash

# 查看容器列表
sudo docker ps

# 查看容器资源消耗
sudo docker stats

以上已满足开发的日常指令

1.3. Dockerfile

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

用Dockerfile执行构建,则可以得到一个镜像,如下:

Docker
# 指定基础镜像
FROM ubuntu:20.04

# 设置环境变量
ENV DEBIAN_FRONTEND=noninteractive

# 设置工作目录
WORKDIR /app

# 运行命令安装必要的软件包
RUN apt-get update && apt-get install -y \
    python3 \
    python3-pip \
    && apt-get clean

# 复制文件到镜像中
COPY requirements.txt /app/

# 使用ADD指令解压并添加文件
ADD https://example.com/some-archive.tar.gz /app/

# 安装Python依赖
RUN pip3 install -r requirements.txt

# 暴露容器端口
EXPOSE 8080

# 复制应用程序代码到镜像中
COPY . /app

# 指定容器启动时要运行的命令
CMD ["python3", "app.py"]

参数说明:

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

2. 实践

实践出真知,以包装一个python的flask应用为例

2.1. Flask应用

先创建一个文件夹 flaskr 并进入这个文件夹

编辑: 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')

编辑: 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)]]