最近在入门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
这个博主给的教程十分详细,跟着一步一步做就能成功。但是值得注意的是像许多常用的包类似nano
、wget
、curl
都没有安装,所以执行安装步骤之前需要使用apt-get
把需要使用到的数据包安装一下。安装好Python之后通过pip安装Flask之后就大功告成了。
总结
入门Docker的原动力是方便部署Flask项目,但是Docker的应用场景远不止Python,Docker可以说是当代程序员的一项必备技能。为了能够更快乐的进行项目开发,快把Docker学起来已经是大势所趋。
现在会想起自己的学习历程:从最简单virtualenv管理虚拟环境,然后是使用Anaconda管理,后来在服务器上用上了PyEnv,再到现在的Docker。工具的更替也是自己技术提升的证明,努力坚持学习才会有收获。
666
收藏了