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运行指定的镜像
- Docker教程2
- docker教程(2)--Dockerfile
- DOCKER教程
- Docker教程
- Docker教程
- CentOS7.2 上安装 Docker 教程
- docker 使用教程(2)常用命令
- Docker教程(一) Docker入门教程
- docker中文 docker手册 docker教程
- docker中文 docker手册 docker教程
- Docker使用基本教程
- Docker简要教程
- docker简单教程
- Docker Swarm学习教程
- Docker Swarm学习教程
- 一小时Docker教程
- Docker简明教程
- Docker Swarm学习教程
- noip2013 火柴排队
- (2016美团牛客网编程测试题)大富翁
- 1770 数数字
- 与序列相关的几个内建函数
- http缓存机制
- Docker教程2
- 循环比赛日程表
- java语言基础——搜索算法
- Unity3D
- 大暴搜 [BZOJ3303] 太鼓达人
- BP神经网络代码示例
- SQL注入之堆叠注入
- swing初始化一个JFrame实现点击A界面的一个按钮,显示B界面,无论点击多少次,都只显示一个B界面
- 黑白棋子移动