第一次构建、运行、发布、获取docker镜像的步骤详解

 更新时间:2019年03月07日 15:32:30   作者:shuzhou12  
今天小编就为大家分享一篇关于第一次构建、运行、发布、获取docker镜像的步骤详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

1、前言

过去,如果您要开始编写Python应用程序,第一步就是把Python的运行环境安装到您的机器上,而且安装的环境还要和线上的一致,比较麻烦。

使用Docker,您可以从docker的官方registry或者其他仓库,获取一个可移植的Python运行环境镜像,无需安装。然后,你可以基于这个镜像开发你的应用程序,这样可以确保您的应用程序,依赖项和运行时都一起运行。

2、构建一个python镜像

2.1、为了构建您自己的镜像,首先需要创建一个名称为Dockerfile的文件,用于定义创建镜像并运行container所需的步骤。 Dockerfile中的每条指令都会在镜像中创建一个层级。当您更改Dockerfile并重新build镜像时,只重建那些更改的层级。与其他虚拟化技术相比,这是使镜像轻量,小巧,快速的一个原因。

创建一个空目录,创建一个名为Dockerfile的文件,将以下内容复制并粘贴到该文件中并保存。

# Use an official Python runtime as a parent image
FROM python:2.7-slim
# Set the working directory to /app
WORKDIR /app
# Copy the current directory contents into the container at /app
ADD . /app
# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# Make port 80 available to the world outside this container
EXPOSE 80
# Define environment variable
ENV NAME World
# Run app.py when the container launches
CMD ["python", "app.py"]

2.2 在与Dockerfile文件同一个目录下,创建requirements.txt和app.py文件。因为Dockerfile文件的ADD命令,上面的两个文件会被加到最终的镜像中;因为EXPOSE命令,访问容器的80端口,才可以访问到app.py的内容,注意:这里的80端口指的是容器暴露的端口,并不是实际机器的端口。
requirements.txt

Flask
Redis

app.py

from flask import Flask
from redis import Redis, RedisError
import os
import socket
# Connect to Redis
redis = 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)

2.3 把我们的应用打包为镜像,要在DockerFile目录下执行。这会创建一个Docker镜像,我们将使用-t标记它,以使镜像有一个友好的名称。

docker build -t friendlyhello

3 、运行镜像

运行应用程序,使用-p将机器的端口4000映射到容器暴露的端口80:

docker run -p 4000:80 friendlyhello

您也可以在shell中使用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>

按crtl+c结束应用

现在让我们在后台运行应用程序:

docker run -d -p 4000:80 friendlyhello

查看所有的container信息

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED
1fa4ab2cf395        friendlyhello       "python app.py"     28 seconds ago

现在使用docker container stop来结束进程,使用CONTAINER ID,如下所示:

docker container stop 1fa4ab2cf395

4、发布镜像

4.1、我使用的是阿里云的docker registry,感觉应该会比较快。首先你要有一个阿里云的账号。然后登陆进去新建一个仓库,设置命名空间等信息。

4.2 登陆阿里云的docker registry,后续操作都需要登陆才可以执行。

sudo docker login --username=admin registry.cn-hangzhou.aliyuncs.com

4.3 为镜像打标,tag为可选的,如果没有,默认为latest

格式:

docker tag image_name registry_url/namespace/repository_name:[tag]

例如

docker tag friendlyhello registry.cn-hangzhou.aliyuncs.com/shuzhou/demo1:latest

查看本地的镜像列表

docker image ls

4.4 发布镜像

docker push registry.cn-hangzhou.aliyuncs.com/shuzhou/demo1:latest

4.5 现在你可以在任何一台机器上执行下面的命令,运行镜像

docker run -p 4000:80 registry.cn-hangzhou.aliyuncs.com/shuzhou/demo1:latest

4.6 拉取镜像

docker pull registry.cn-hangzhou.aliyuncs.com/shuzhou/demo1:latest

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • Docker安装Nginx并部署及MySQL容器构建全过程

    Docker安装Nginx并部署及MySQL容器构建全过程

    众所周知Docker是一种容器化技术,可以用来快速部署和管理应用程序,这篇文章主要给大家介绍了关于Docker安装Nginx并部署及MySQL容器构建的相关资料,需要的朋友可以参考下
    2024-02-02
  • docker容器日志时间不一致问题

    docker容器日志时间不一致问题

    这篇文章主要介绍了docker容器日志时间不一致问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Linux下使用Docker部署MinIO存储服务实现远程上传的方法

    Linux下使用Docker部署MinIO存储服务实现远程上传的方法

    MinIO是一个开源的对象存储服务器,可以在各种环境中运行,例如本地、Docker容器、Kubernetes集群等,本文主要是Linux下通过Docker部署MinIO存储服务实现远程上传的文章,感兴趣的朋友一起看看吧
    2023-11-11
  • 详解如何修改 Docker 默认网桥地址

    详解如何修改 Docker 默认网桥地址

    这篇文章主要介绍了详解如何修改 Docker 默认网桥地址,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • docker run启动的容器挂掉了数据怎么办

    docker run启动的容器挂掉了数据怎么办

    这篇文章主要介绍了docker run启动的容器挂掉了,数据怎么办,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • 基于alpine用dockerfile创建的爬虫Scrapy镜像的实现

    基于alpine用dockerfile创建的爬虫Scrapy镜像的实现

    这篇文章主要介绍了基于alpine用dockerfile创建的爬虫Scrapy镜像的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • 在IntelliJ IDEA中使用Docker的开发指南

    在IntelliJ IDEA中使用Docker的开发指南

    这篇文章主要给大家介绍了在IntelliJ IDEA中使用Docker开发指南,文中通过图文介绍的非常详细,对我们的使用Docker有一定的帮助,需要的朋友可以参考下
    2023-09-09
  • Docker利用busybox创建基础镜像(base image)

    Docker利用busybox创建基础镜像(base image)

    今天小编就为大家分享一篇关于Docker利用busybox创建基础镜像(base image),小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • docker部署LNMP架构的方法

    docker部署LNMP架构的方法

    这篇文章主要介绍了docker部署LNMP架构的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 浅析docker-compose部署mysql无法访问的问题

    浅析docker-compose部署mysql无法访问的问题

    Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器,使用Docker Compose不再需要使用shell脚本来启动容器。接下来通过本文给大家分享docker-compose部署mysql无法访问的问题,需要的朋友参考下吧
    2018-10-10

最新评论