从无到有入门Docker,创建一个可以运行Flask项目的Docker容器
  • 分类:后端开发
  • 发表:2020-01-23
  • 围观(315)
  • 评论(1)

最近在入门Docker,作为新一代的容器技术Docker已经被广泛的运用到服务部署等一系列场景中。比起之前的虚拟机解决方案,Docker方案有着无可比拟的优势,不管是在运行速度方面还是在平台兼容性上,都比虚拟机强大上许多。对于Flask项目的部署,使用Docker来管理Python稍显复杂的虚拟环境,可以帮助节省很多的步骤。实现类似Java一样的"一处编译,到处运行"。同时能够解决一个亘古难题—“在我电脑运行的好好的,怎么到你那里就不行了😲😲?


特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为 MB 一般为 GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个

Docker包括有三个基本概念

  • 镜像(Image):Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。

——上述定义转载自:Docker从入门到实践

Docker虽然和虚拟机的实现方式完全不同,但是从我这个菜鸟的角度来看,我就把Docker理解成轻量级的虚拟机服务。我们可以自由的创建属于自己的容器,使用容器管理我们的开发环境,方便的在不同平台上部署我们的项目。这就和我们的Python的虚拟环境十分类似,只不过Python的虚拟环境工具仅仅针对Python,而Docker是把整个系统环境当成一个虚拟环境来管理。

Docker初体验

因为现在手上的项目都是基于Python的,所以使用Docker部署我的Flask项目是我最迫切的需要。所以这篇文章从零开始创建一个可以运行Flask项目的Docker容器。因为新手入门所以本教程是从原生Ubuntu镜像开始安装Python和Flask,同样本教程也设计了很多无关Docker方面的内容,不喜可以自行跳过。

  • 安装好Docker后,使用docker images查看已存在镜像:
root@raspberrypi:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
python              3.8.1               0d390ba83104        9 hours ago         743MB
ubuntu              latest              240a3b1be63a        6 days ago          46.7MB
  • 从Docker Hub下载指定版本的Ubuntu镜像,本教程使用Tag版本为18.10作为演示。
docker pull [OPTIONS] NAME[:TAG|@DIGEST] // 指令调用格式

root@raspberrypi:~# docker pull ubuntu:18.10
18.10: Pulling from library/ubuntu
fc310c4956f8: Pull complete
152af87872d2: Pull complete
268f170c20eb: Pull complete
916e7fd3f8bb: Pull complete
Digest: sha256:7d657275047118bb77b052c4c0ae43e8a289ca2879ebfa78a703c93aa8fd686c
Status: Downloaded newer image for ubuntu:18.10
docker.io/library/ubuntu:18.10

PS:Docker镜像使用tag区分不同的版本号,如果不加tag参数默认为latest。令人难过的是很多情况下我们并不想要获取最新的镜像,而且Docker没有提供相应的指令供我们查询tags。所以需要每次都从https://hub.docker.com/查询,可以通过以下sh脚本实现命令行方式查询,使用方式filename.sh image

#!/bin/bash
function usage() {
cat << HELP

dockertags  --  list all tags for a Docker image on a remote registry.

EXAMPLE: 
    - list all tags for ubuntu:
       dockertags ubuntu

    - list all php tags containing apache:
       dockertags php apache

HELP
}



if [ $# -lt 1 ]; then
  usage
  exit
fi

image="$1"
tags=`wget -q https://registry.hub.docker.com/v1/repositories/${image}/tags -O -  | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr '}' '\n'  | awk -F: '{print $3}'`

if [ -n "$2" ]; then
  tags=` echo "${tags}" | grep "$2" `
fi
echo "${tags}"

具体使用方法请访问链接:https://juejin.im/post/5c39a6846fb9a049a57120d1

  • 使用刚刚下载的镜像创建容器:
// 方法一,使用docker create创建镜像
root@raspberrypi:~# docker create -it --name="flask" ubuntu:18.10
63f403737cf0fdd974713567e908aae3f3c76025602a3ec2afbd3cc0b39e5b89

// 方法二:使用docker run创建镜像
docker run -it --name="flask" ubuntu:18.10

root@raspberrypi:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
63f403737cf0        ubuntu:18.10        "/bin/bash"         38 seconds ago      Created                                 flask
88551c964e9d        ubuntu:latest       "/bin/bash"         2 days ago          Up 2 hours                              python
  • 启动刚刚创建好的容器,并且进入容器:
root@raspberrypi:~# docker start flask // 启动容器

root@raspberrypi:~# docker exec -it flask /bin/bash // 进入容器

至此本文关于Docker的内容就到此结束了,可以简单的理解为我们使用Docker创建了一个系统版本为18.10的Ubuntu虚拟机。可以在这个虚拟机中进行一系列的操作,和普通的Linux系统并无二异。只是因为都是精简版的系统,所以很多常用的默认安装的包都没有安装,需要我们自己手动安装。

总结一下学习到这里常用到的几个Docker命令:

  • docker images:查看系统中所有镜像,等价命令docker image ls
  • docker pull:从远程仓库下载镜像
  • docker image remove:删除存在的镜像
  • docker start/pause/stop/restart:启动/暂停/停止/重启容器
  • docker create:创建Docker容器
  • docker rm:删除Docker容器
  • docker rmi:删除Docker镜像
  • docker exec -it [container] /bin/bash:进入指定的容器
  • docker ps -a:输出系统存在的容器信息
  • docker update;更新容器信息
  • docker search:从Docker Hub搜索相关的镜像信息
  • ......

更多的指令使用帮助可以使用命令docker --help查询,上面只是罗列了一些常用的或者是目前我学到的,但是Docker明显没有这么简单,后续高级使用技巧还需要等我慢慢挖掘。


环境搭建

因为想在容器中安装最新版本的Python,虽然可以通过apt-get可以成功安装,但是后续的pip无法正确的安装。从apt-get安装的pip3默认是依赖python3.6的,所以安装成功后并没有与Python3.8产生关联。所以我想到了用源码编译安装Python,这样装出来的Python自带pip。但是编译安装耗时较长,对于不懂Linux的小伙伴或许有些麻烦。我想的是既然是学习就不在乎多走些弯路,索性尝试一下如何安装。

安装教程:https://blog.csdn.net/xietansheng/article/details/84791703

这个博主给的教程十分详细,跟着一步一步做就能成功。但是值得注意的是像许多常用的包类似nanowgetcurl都没有安装,所以执行安装步骤之前需要使用apt-get把需要使用到的数据包安装一下。安装好Python之后通过pip安装Flask之后就大功告成了。

总结

入门Docker的原动力是方便部署Flask项目,但是Docker的应用场景远不止Python,Docker可以说是当代程序员的一项必备技能。为了能够更快乐的进行项目开发,快把Docker学起来已经是大势所趋。

现在会想起自己的学习历程:从最简单virtualenv管理虚拟环境,然后是使用Anaconda管理,后来在服务器上用上了PyEnv,再到现在的Docker。工具的更替也是自己技术提升的证明,努力坚持学习才会有收获。


共有 1 条评论

  1. 666

    收藏了

Top