升级docker并构建自己的app

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/70880786 现在docker已经升级了很多版本了,而我目前的docker版本仍然是1.12.5,比较老的版本,所以现在我们需要升级我们的docker版本,首先是如何查看我们系统中的docker版本呢?运行命令docker --version即可查看。
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/70880786

现在docker已经升级了很多版本了,而我目前的docker版本仍然是1.12.5,比较老的版本,所以现在我们需要升级我们的docker版本,首先是如何查看我们系统中的docker版本呢?

运行命令docker --version即可查看。

(一)、Docker新版本介绍及安装

目前,Docker分为了两个可用的版本,分别为Docker企业版Docker社区版,故名思议,Docker EE,即Docker企业版是专门为企业开发和IT团队构建,部署商业应用所设计的,而Docker CE,即Docker社区本是为开发者和刚开始使用Docker的小团队开发设计的。在这里我们使用Docker CE

卸载老版本

Docker的老版本被称为docker或者是docker engine,如果安装过,先把他们卸载掉。


 sudo apt-get remove docker docker-engine

如果卸载成功,apt-get将会报出没有安装包被安装。

位于目录/var/lib/docker/中的镜像,容器,卷和网络被保留。Docker CE包现在被称为docker-ce,Docker EE包现在被称为docker-ee

为Trusty 14.04推荐的额外的包

如果没有其他原因,推荐您安装linux-image-extra-*这些包,这些允许Docker使用aufs存储驱动。


$ sudo apt-get update

$ sudo apt-get install \
    linux-image-extra-$(uname -r) \
    linux-image-extra-virtual

安装Docker

有两种安装方式,一个是通过仓库安装,一个是通过包安装,在这里我们选择使用包安装。

我们需要下载.deb文件来安装docker。这里有一个麻烦的地方就是,每次我们想要更新docker的话,就需要下载一个新的文件,无所谓了,我们选择包安装。

Docker CEDocker EE的安装步骤也是不一样的,我们只关注Docker CE。进入下载地址

,选择我们的ubuntu版本,浏览pool/stable,选择amd64或者是armhf,然后下载相应你想要安装的的.deb文件。

下载完成之后,使用下面的命令来安装你所下载的安装包。


dpkg -i /path/to/package.deb

安装完成之后,我们通过运行hello-world镜像来验证Docker CE是否安装完成。

卸载Docker

我们可以使用下面的命令来卸载Docker包。


sudo apt-get purge docker-ce

但是镜像,容器,卷或者是定制的配置文件将不会自动被删除,我们可以通过下面的命令来移走:


sudo rm -rf /var/lib/docker

(二)、构建新的app

你的新的开发环境

在过去,如果你想要开始编写一个Python应用,第一步工作便是在你的机器上安装一个Python运行时环境,但是这样便会导致一个问题是,如果想要你的应用如期运行你的机器环境在哪里,还有运行你的应用的app在哪里。

使用Docker,你仅仅需要抓取一个轻便的Python运行时作为一个镜像,不必安装。然后,你的构建需要包括基本的Python镜像和你的app代码,确保你的app,他的依赖和运行时都在一块。

这些轻便的镜像被定义称为Dockerfile

使用Dockerfile定义一个容器

Dockerfile将会定义在你的容器环境中什么将会运行。访问的资源例如网络接口和磁盘驱动在环境中都被虚拟出来了,这个是和你系统中的其他事物隔离的,所以你必须映射端口到外面的世界,并且必须要指定那些文件你想要复制到那个环境中。然后,完成那些操作之后,你可能希望定义在这个Dockerfile中的app的构建在任何地方运行都一样的。

Dockerfile

创建一个空的目录然后把这个名称为Dockerfile的文件放进去。注意每一行的注释。


# 使用一个官方的Python运行时作为一个镜像
FROM python:2.7-slim

# 设置工作目录到/app
WORKDIR /app

# 复制当前目录内容到/app的容器中
ADD . /app

# 安装指定在requirements.txt文件中的所有的包
RUN pip install -r requirements.txt

# 使80端口在容器外能够被访问
EXPOSE 80

# 定义环境变量
ENV NAME World

# 当容器启动的时候运行app.py
CMD ["python", "app.py"]

这个Dockerfile引用了一些我们没有创建的文件,app.pyrequirements.txt。在下面我们获取这些文件。

app本身

获取这两个文件并放到和Dockerfile相同的目录中。这样就完成了我们的app,看上去是很简单的。当上述的Dockerfile被构建进入镜像的时候,app.pyrequirements.txt也将会存在,因为DockerfileADD命令,app.py的输出将通过HTTP被访问,因为EXPOSE命令。

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)

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)

现在我们可以看到pip install requirements.txt安装了Flask和Redis库,并且app打印出了环境变量NAME,和socker.gethoustname()调用后的输出是一样的。最后,因为Redis并没有运行(因为我们仅仅安装了Python库,而不是Redis本身),所以我们得到的结果将会是尝试使用它但是失败了,并且产生一个错误信息。

构建app

就是这样,在你的系统中,你不需要Python或者是requirements.txt文件中的任何东西,你也不需要构建或者是运行这个景象安装到你的系统中。看上去好像是你设置了Python或者是Flask的环境变量,实际上并没有。下面是ls应该显示的:


$ ls
Dockerfile      app.py          requirements.txt

现在运行build命令。这将会创建一个Docker镜像,该镜像我们使用-t选项来标记他,这样他就有了一个友好的名称。


docker build -t friendlyhello .

你构建的镜像在哪呢?他在你的机器的本地Docker镜像条目中。


$ docker images

REPOSITORY            TAG                 IMAGE ID
friendlyhello         latest              326387cea398

运行app

运行app,使用-p选项映射你的机器的端口4000到容器的EXPOSE的端口80。


docker run -p 4000:80 friendlyhello

你应该看到一个提醒,Python正在http://0.0.0.0:80服务你的app。但是那个信息是来自内部容器的,他并不知道你映射了端口80到4000了,使得当前的URL http://localhost:4000 。到这里,你将会看到Hello World文本,容器ID和Redis错误信息。

注意:这个端口映射`4000:80`是为了证明在`Dockerfile`中你的`EXPOSE`和你使用`docker run -p`发布的不同的。在后面的步骤中,我们仅仅映射端口80到端口80,这样就可以使用`http://localhost`。

在你的终端中使用CTRL+C来退出。

现在我们在后台运行该app,使用分离的模式:


docker run -d -p 4000:80 friendlyhello

你获取到了一个长得容器ID并且然后被踢回到你的终端中。你的容器正在后台运行。你可以使用docker ps来看到一个简便的容器ID.


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

你将看到CONTAINER IDhttp://localhost:4000中的是相匹配的。

现在使用docker stop来结束进程,使用CONTAINER ID,就像下面这样:


docker stop 1fa4ab2cf395

共享你的镜像

后面我们学习如何共享我们的镜像。


docker login
docker tag friendlyhello username/repository:tag
docker push username/repository:tag
docker run -p 4000:80 username/repository:tag
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
负载均衡 网络协议 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基本概念和类型,包括桥接网络、宿主网络、覆盖网络和 Macvlan 网络等,并提供了创建、管理和配置自定义网络的实用命令。通过掌握这些知识,开发者可以构建更健壮和灵活的容器化应用,提高应用的可扩展性和安全性。
|
4天前
|
存储 监控 Linux
docker构建镜像详解!!!
本文回顾了Docker的基本命令和管理技巧,包括容器和镜像的增删改查操作,容器的生命周期管理,以及如何通过端口映射和数据卷实现容器与宿主机之间的网络通信和数据持久化。文章还详细介绍了如何使用Docker部署一个简单的Web应用,并通过数据卷映射实现配置文件和日志的管理。最后,文章总结了如何制作自定义镜像,包括Nginx、Python3和CentOS镜像,以及如何制作私有云盘镜像。
49 2
|
13天前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
本文介绍了Docker和Kubernetes在构建高效微服务架构中的应用,涵盖基本概念、在微服务架构中的作用及其实现方法。通过具体实例,如用户服务、商品服务和订单服务,展示了如何利用Docker和Kubernetes实现服务的打包、部署、扩展及管理,确保微服务架构的稳定性和可靠性。
56 7
|
12天前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【10月更文挑战第22天】随着云计算和容器技术的快速发展,微服务架构逐渐成为现代企业级应用的首选架构。微服务架构将一个大型应用程序拆分为多个小型、独立的服务,每个服务负责完成一个特定的功能。这种架构具有灵活性、可扩展性和易于维护的特点。在构建微服务架构时,Docker和Kubernetes是两个不可或缺的工具,它们可以完美搭档,为微服务架构提供高效的支持。本文将从三个方面探讨Docker和Kubernetes在构建高效微服务架构中的应用:一是Docker和Kubernetes的基本概念;二是它们在微服务架构中的作用;三是通过实例讲解如何使用Docker和Kubernetes构建微服务架构。
48 6
|
11天前
|
负载均衡 应用服务中间件 nginx
基于Nginx和Consul构建自动发现的Docker服务架构——非常之详细
通过使用Nginx和Consul构建自动发现的Docker服务架构,可以显著提高服务的可用性、扩展性和管理效率。Consul实现了服务的自动注册与发现,而Nginx则通过动态配置实现了高效的反向代理与负载均衡。这种架构非常适合需要高可用性和弹性扩展的分布式系统。
18 4
|
12天前
|
负载均衡 应用服务中间件 nginx
基于Nginx和Consul构建自动发现的Docker服务架构——非常之详细
通过使用Nginx和Consul构建自动发现的Docker服务架构,可以显著提高服务的可用性、扩展性和管理效率。Consul实现了服务的自动注册与发现,而Nginx则通过动态配置实现了高效的反向代理与负载均衡。这种架构非常适合需要高可用性和弹性扩展的分布式系统。
27 3
|
17天前
|
jenkins 测试技术 持续交付
Docker最佳实践:构建高效的CI/CD流水线
【10月更文挑战第17天】在现代软件开发实践中,持续集成(Continuous Integration, CI)和持续部署(Continuous Deployment, CD)已成为提高开发效率和软件质量的重要手段。Docker作为一种容器技术,为构建一致且隔离的开发环境提供了强有力的支撑。本文将探讨如何利用Docker来优化CI/CD流程,包括构建环境的标准化、镜像管理以及与CI/CD工具(如Jenkins、GitLab CI)的集成。
36 5
|
16天前
|
JavaScript Docker Python
下个时代的开发工具-Nix:声明式的运行环境构建器、简单场景下的docker替身
Nix 是一个独特的包管理工具和构建系统,采用声明式方法管理软件包和运行环境。它通过精确控制依赖关系和环境配置,确保软件的可重复性、隔离性和可追溯性。Nix 支持多语言开发环境,提供声明式配置、环境隔离、回滚与版本控制等核心功能,适用于复杂开发场景,有效解决依赖冲突和环境不一致问题。
|
30天前
|
监控 Kubernetes 测试技术
掌握Docker网络模式:构建高效容器通信
【10月更文挑战第3天】本文深入探讨了Docker的网络模式,包括它们的工作原理、使用场景以及如何配置和优化容器间的通信。希望能够帮助开发者在项目中有效地应用Docker网络模式,构建高效的容器化应用。
|
20天前
|
运维 Kubernetes 监控
掌握Docker容器化技术:构建、部署与管理的高效实践
【10月更文挑战第14天】掌握Docker容器化技术:构建、部署与管理的高效实践
34 0