Docker入门程序
在Ubuntu系统中安装完Docker后,就可以通过一个入门程序来学习Docker的基本使用。在此程序中,我们首先需要编写Dockerfile及其相关文件,然后构建镜像,创建并启动容器,最后查看运行结果。程序实现的具体步骤如下。
(1)编写Dockerfile文件。创建一个空的Docker工作目录dockerspace,进入该目录,并使用sudo vim Dockerfile指令新建并打开一个Dockerfile文件(当文件不存在时,vim会新建并打开文件,当文件存在时直接打开文件),然后向该文件中编辑内容,如文件1所示。
文件1 Dockerfile
1 # 使用Docker官方的Python作为一个基础镜像
2 FROM python:2.7-slim
3 # 设置工作目录/app
4 WORKDIR /app
5 # 复制当前目录下的所有内容到容器内的/app目录下
6 ADD . /app
7 # 安装在requirements.txt文件中声明的文件包
8 RUN pip install -r requirements.txt
9 # 设置容器暴露的端口为80
10 EXPOSE 80
11 # 定义环境变量
12 ENV NAME World
13 # 当容器启动后立即运行app.py
14 CMD ["python", "app.py"]
文件1的主要作用就是在一个基础镜像上安装其他程序来构建一个新的镜像,这个过程中,主要涉及到了两个外部文件requirements.txt和app.py。其中requirements.txt是一个普通txt文本,声明了需要安装的两个工具,而app.py是一个简单的Python小程序。
下面针对文件1中Dockerfile文件构建镜像的过程进行梳理。首先Docker会从Docker远程仓库拉取Python作为一个基础镜像(如果本地已有Python镜像,则无需拉取);然后在Docker容器内创建一个目录为app的工作空间,并通过ADD指令将当前目录中的所有文件复制到app目录下;接下来使用pip指令安装requirements.txt文件内指定的工具,指定容器创建后暴露的端口为80,以及定义内部环境变量NAME并赋值为World(app.py 文件中的name变量就可以引用);最后在容器启动后运行app.py 文件。
(2)编写外部文件。在当前目录(dockerspace)下分别创建requirements.txt和app.py,编辑后如文件2和3所示。
文件2 requirements.txt
1 Flask
2 Redis
在文件2中,Flask和Redis就是我们使用pip指令安装的工具。
文件3 app.py
1 from flask import Flask
2 from redis import Redis, RedisError
3 import os
4 import socket
5 redis = Redis(host="redis", \
6 db=0, socket_connect_timeout=2, socket_timeout=2)
7 app = Flask(__name__)
8 @app.route("/")
9 def hello():
10 try:
11 visits = redis.incr("counter")
12 except RedisError:
13 visits = "<i>cannot connect to Redis, counter disabled</i>"
14 html = "<h3>Hello {name}!</h3>" \
15 "<b>Hostname:</b> { hostname }<br/>" \
16 "<b>Visits:</b> {visits}"
17 return html.format(name=os.getenv("NAME", "world"), \
18 hostname=socket.gethostname(),
19 visits=visits)
20 if __name__ == "__main__":
21 app.run(host='0.0.0.0', port=80)
文件3中app.py就是一个简单的Python应用,Docker容器启动后就会运行该应用,访问该应用则会返回一些字符串信息。
至此,Docker入门程序中需要的文件已经准备完成。
(3)创建镜像。在Dockerfile文件所在目录下使用docker build指令运行Dockerfile文件生成一个Docker镜像,具体指令如下。
$ docker build -t hellodocker .
上述指令中,docker build是Docker构建镜像的指令,-t参数指定了生成的镜像名称为hellodocker,指令最后的点“.”代表的是当前目录下的应用上下文(即Dockerfile所在目录,如果Dockerfile文件不在当前目录下,则需要将点号替换成Dockerfile所在的地址)。
使用上述指令构建镜像具体效果,如图1所示。
图1 Docker构建镜像过程
(4)查看镜像。构建镜像完成后,可以使用docker images指令查看本地镜像列表中是否有名为hellodocker的镜像,具体指令如下。
$ docker images
查看本地镜像列表的具体效果,如图2所示。
图2 镜像列表
从图2可以看出,本地镜像列表中不仅包含hellodocker镜像,同时还包含Dockerfile文件中依赖的基础镜像Python(该镜像会自动从官网注册中心拉取到本地),因此,可以说明镜像构建成功。
(5)创建并启动容器。通过docker run指令会创建并启动一个具体的容器实例(镜像就类似一个Java类,必须有具体的实例才能使用),具体指令如下。
$ docker run -d -p 5000:80 hellodocker
上述指令中,docker run是Docker创建并启动容器的指令;-d参数表示在后台运行容器,容器创建成功后会自动返回一个64位的容器ID;-p参数将容器暴露的80端口映射到宿主机的5000端口。
(6)查看运行容器。使用docker ps指令查看当前运行的容器,具体指令如下。
$ docker ps
查看Docker运行中的容器效果,如图3所示。
图3 Docker运行容器展示
从图3可以看出,Docker容器已按照指令映射到了一个5000的端口(可以通过PORTS列信息看出),并且生成了容器ID和随机的容器名等信息。
(7)访问程序,查看结果。使用宿主机的浏览器通过地址http://localhost:5000
来访问容器中运行的程序,其执行效果如图4所示。
图4 容器程序访问效果图
从图4可以看出,浏览器中已显示出了“Hello World”等信息,这说明Docker容器实例已正常启动,并且通过宿主机正确的访问到了容器中的Python程序。
(8)停止容器。当容器不再使用时,可以通过docker stop指令停止当前运行的容器,具体指令如下。
$ docker stop 653347ecc6df
需要注意的是,上述指令中“653347ecc6df”代表的是生成的容器ID,读者自行演示时需要替换成自己容器的ID。
至此,一个完整的Docker入门程序已经讲解完成,关于其中涉及到的相关文件和指令,将在接下来的几个小节中具体说明。
多学一招:配置Docker加速器
使用 Docker的时候,需要经常从官网获取镜像,但是由于网络或网速等原因,拉取官网镜像的过程可能会非常缓慢,从而严重影响 Docker的使用体验,因此我们可以通过国内一些网站提供的加速器工具来解决这个难题。这些加速器通过智能路由和缓存机制,极大的提升了国内网络访问DockerHub的速度。Linux系统中,配置Docker加速器的具体指令如下。
$ curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://27e6d45b.m.daocloud.io
该指令可以将Registry远程注册中心的--registry-mirror配置信息加入到Docker本地配置文件 /etc/docker/daemon.json 中。
当配置好Docker加速器后,需要根据提示信息重启Docker服务才可生效。