Docker教程2

来源:互联网 发布:数据二级有效性使用 编辑:程序博客网 时间:2024/06/07 03:00

容器(Container)的使用

本篇会介绍如何使用容器,创建一个的容器(Container),并生成,发布和浏览
官方文档

1. 基本配置,创建和浏览

首先,先创建三个文件,分别是:Dockerfile,requirements.txt,app.py

1.1 Dockerfile文件是当前指定的容器(Container)的配置,内容如下:
# 使用官方Python运行时 - 作为当前的镜像 FROM python:2.7-slim# 设置工作目录 /appWORKDIR /app# 拷贝当前目录内容到容器目录/appADD . /app# 安装需要的安装包从requirements.txt获取RUN pip install -r requirements.txt# 在容器(Container)外,使用80端口作为外界访问 EXPOSE 80# 定义环境变量 ENV NAME World# 当容器(Container)启动时运行app.pyCMD ["python", "app.py"]
1.2 requirements.txt文件是依赖的库和引用,其中flask是python的一个web框架,内容如下:
FlaskRedis
1.3 app.py文件是flask配置一个网站的最基本代码,内容如下:
from flask import Flaskfrom redis import Redis, RedisErrorimport osimport socket# Connect to Redisredis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)app = Flask(__name__)@app.route("/")def hello():    try:        visits = redis.incr("counter")    except RedisError:        visits = "<i>cannot connect to Redis, counter disabled</i>"    html = "<h3>Hello {name}!</h3>" \           "<b>Hostname:</b> {hostname}<br/>" \           "<b>Visits:</b> {visits}"    return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)if __name__ == "__main__":    app.run(host='0.0.0.0', port=80)

在命令行(Terminal)下,运行ls你会看到如下三个文件

$ lsDockerfile      app.py          requirements.txt
1.4 生成Docker镜像

运行以下命令,创建一个Docker镜像(Docker image),并且加一个 -t 参数用于设置一个友好的命名

docker build -t friendlyhello .

那你上面创建的镜像在哪里了?答案是:在你的电脑的本地的Docker image registry里,通过以下命令可以查看

$ docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED            friendlyhello       latest              7554c6a24c1f        About an minute ago  
1.5 运行应用

运行你的应用,映射你电脑机器的4000端口到容器(Container)的80端口,使用参数 -p

docker run -p 4000:80 friendlyhello

然后在你的浏览器上就可以运行 http://localhost:4000 的网站,效果如下图显示:
这里写图片描述

当然,你也可以使用 curl 来访问了,获取的是页面源码

$ curl http://localhost:4000<h3>Hello World!</h3><b>Hostname:</b> 8fc990912a14<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>

我们还有更好的方式,在后台进程中运行容器(Container),只需要添加一个 -d 参数,d表示detached

docker run -d -p 4000:80 friendlyhello

在后进程中运行容器会产生一个很长的Container ID(容器ID),但是通过以下命令时,只显示缩写版的Container ID,
通过命令行查看,

$ docker psCONTAINER ID        IMAGE               COMMAND             CREATED1fa4ab2cf395        friendlyhello       "python app.py"     28 seconds ago
1.6 停止容器

Ok,相当到这里,大家明白了,使用是超级简单,没有复杂的配置,你就可以创建一个Container(容器),而且运行的很好,
那现在,我们停掉这个容器吧

docker stop 1fa4ab2cf395


2. 分享你创建的Docker镜像

为了证明Docker的可移植性,我们现在就上传刚才创建的镜像,并且让它可以在任何地方运行。
归根究底,你的最终目的是要发布到生产环境的。

这里有几点你必须要知道的知识,分别是:

a. 一个registry是一个多个repository(仓库)的集合
b. 一个repository是多个images(镜像)的集合
c. 默认情况下,registry是public的,如果想要private的registry,请看 这里Docker Trusted Registry

2.1 登录Docker

如果你还没有Docker账号,请注册一个,cloud.docker.com

如果你已经注册完了,现在就开始登录

docker login

然后,我们给刚才创建的镜像(image)打一个tag,tag虽然是可选的,但是我们建议,你给镜像创建一个tag,
因为大部分的时候,我们使用git开发项目,在某一个阶段都做了一个tag,有意义的tag名称,便于标识该版本号。
Docker的镜像的tag也是一样的,它的格式是:repository:tag,创建tag使用命令 docker tag imageName
例如,命令如下

docker tag friendlyhello victor/first-repo:firsttag1

然后运行 docker images 查看所有的镜像,也包括tag在里面

$ docker imagesREPOSITORY                TAG                 IMAGE ID           friendlyhello             latest              7554c6a24c1fvictor/first-repo         firsttag1           7554c6a24c1fpython                    2.7-slim            451c85955bc2......

除了使用 docker images 也可以使用 docker image ls

2.2 发布镜像

上传你打完tag的镜像(image)到remote库

docker push victor/first-repo:firsttag1

这个过程第一次有点慢,以后会好些,取决于你的网速。
一旦上传完毕,你就可以登录 Docker Hub 如果你当前浏览器已经登录了Docker账号,
它会自动跳转到你的Docker仓库面板,反之,你需要登录。

从现在开始,你就可以在任何机器上运行你的应用,通过docker fun 命令, 如下:

docker run -p 4000:80 victor/first-repo:firsttag1

如果这个镜像不存在本机上,Docker会自己pull这个库下来

请注意:

   如果你没有在这些命令中指定 ``` :tag ``` 部分,在你生成和运行镜像时,最新的tag ``` :latest ``` 会被默认使用。   如果没有指定tag,Docker会使用最新的镜像版本

注意这里总结了一些本篇文章提到的命令,也有一些是额外增加的

docker build -t friendlyname .                  # 使用仓库的Dockerfile文件,创建一个镜像(image)docker run -p 4000:80 friendlyname              # 运行 "friendlyname" 镜像,并且映射主机端口4000 到容器端口 80docker run -d -p 4000:80 friendlyname           # 跟上一条一样,但是,此条命令是把friendlyname镜像运行在分离进程中docker ps                                       # 查看正在运行的所有的容器的列表docker stop <hash>                              # 优雅的停止运行指定的容器 docker ps -a                                    # 查看所有的容器列表,包括没有在运行的docker kill <hash>                              # 强行关闭指定的容器 docker rm <hash>                                # 从这台机器上移除指定的容器 docker rm $(docker ps -a -q)                    # 从这台机器上移除所有的容器 docker images -a                                # 显示这台机器上的所有镜像 docker rmi <imagename>                          # 从本机移除指定的镜像docker rmi $(docker images -q)                  # 从本机移除所有的镜像 docker login                                    # 使用Docker credentials 登录到CLI会话docker tag <image> username/repository:tag      # 给镜像打一个tag,为了可以上传到remote的registrydocker push username/repository:tag             # 上传打完tag的镜像到remote的registrydocker run username/repository:tag              # 从registry运行指定的镜像
原创粉丝点击