升级docker并构建自己的app(代码片段)

天堂1223 天堂1223     2022-12-05     653

关键词:

现在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

docker从入门到进阶三:构建自己的镜像并分享给大家用(代码片段)

文章目录什么是镜像?镜像分层与联合文件系统Docker镜像加载原理commit构建镜像本地镜像发布到阿里云添加镜像到私有库什么是镜像?是什么我想大家都知道了,不过我放一段比较专业的话:是一种轻量级、可执... 查看详情

手动构建自己的docker容器镜像实战(代码片段)

...话请三连,有问题请私信😘文章目录前言一.设置docker构建镜像的环境1.1commit命令的介绍1.2创建一个tomcat容器二.开始构建自己的镜像2.1查看容器的ID2.2使用命令dockercommit生成该容器的镜像,并保存在本地三.上传镜像到... 查看详情

sh构建并推送docker镜像(代码片段)

查看详情

关于docker构建镜像(代码片段)

...好看到这一块了,记录一下,希望可以帮助到大家。构建Dockerfile先来看一个示例:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#第... 查看详情

docker编译缓存?(代码片段)

我在使用docker-compose时遇到了非常奇怪的行为。我有一个仓库配置为与dockerswarm用于生产和docker-compose用于开发。Swarm在生产中运行良好,但docker-compose有着奇怪的行为。具体来说,我用参数替换来定义构建参数,就像这样build:conte... 查看详情

docker|第六章:构建私有仓库(代码片段)

前言上一章节,讲解了利用Dockerfile和commit进行自定义镜像的构建。大部分时候,公司运维或者实施部门在构建了符合公司业务的镜像环境后,一般上不会上传到公共资源库的。这就需要自己搭建一个私有仓库,来存放自己的镜... 查看详情

docker构建文件(代码片段)

构建文件创建DockerfiletouchDockerfile编辑DockerfilevimDockerfile#基于java8版本构建FROMjava:8#挂载日志目录VOLUME/Data/logs#复制文件到容器ADDbms-eureka-1.0-SNAPSHOT.jar/app.jar#申明暴露端口EXPOSE9000#配置启动执行的命令ENTRYPOINT["java","-jar"," 查看详情

docker入门(代码片段)

(一)、简介Docker是Docker.Inc公司开源的一个基于LXC技术之上构建的Container容器引擎,源代码托管在GitHub上,基于Go语言并遵从Apache2.0协议开源。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后... 查看详情

docker教程-9-构建镜像并上传到dockerhub仓库(代码片段)

目录1、基于已有镜像构建镜像并上传到DockerHub1.1更改已安装的镜像容器1.2 基于上述容器重新创建镜像1.3上传镜像到DockerHub仓库2、使用Dockerfile构建JDK+tomcat镜像2.1 准备好jdk和tomcat安装包等文件2.2 编写Dockerfile文件2.3 设置Dock... 查看详情

更新docker容器(代码片段)

...了很久了,这几天在维护服务器时,发现Redmine的版本也升级了。就想着也升级一下容器吧。先说下大体思路:升级DockerImage关闭就容器,并删除之重新开启新的容器,这样才能使用新的代码升级数据库升级DockerImage升级Image很简... 查看详情

docker教程-9-构建镜像并上传到dockerhub仓库(代码片段)

转自Docker教程-9-构建镜像并上传到DockerHub仓库,更优体验http://www.kongzid.com/目录1、基于已有镜像构建镜像并上传到DockerHub1.1更改已安装的镜像容器1.2 基于上述容器重新创建镜像1.3上传镜像到DockerHub仓库2、使用Dockerfile构建JDK... 查看详情

docker:alpinelinux升级且安装openssh导致构建凉凉排查修正(代码片段)

前言最近在搞一个迭代,发现开发环境的持续集成有些地方可以优化,但需要动到前端基础镜像;而搞完基础镜像准备用起来的时候,问题就冒出来了。本着不能半途而废的态度,搞起~~问题这边是... 查看详情

docker:alpinelinux升级且安装openssh导致构建凉凉排查修正(代码片段)

前言最近在搞一个迭代,发现开发环境的持续集成有些地方可以优化,但需要动到前端基础镜像;而搞完基础镜像准备用起来的时候,问题就冒出来了。本着不能半途而废的态度,搞起~~问题这边是... 查看详情

docker--dockercommit构建docker镜像(代码片段)

我们知道,镜像我们可以从DockerHub上下载,也可以从阿里云镜像上下载,这些镜像都是已经构建好的镜像,如果想要构建自己的镜像,那么我们可以通过2种方式来实现方式一:  Dockercommit方式二:  DockerFile一.dockercommit 命... 查看详情

dockerfile详解,以及构建自定义镜像(代码片段)

Dockerfile使用前面的操作我们一直下载下载官方已经构建好的镜像,直接下载后就可以run,如果我们想要在镜像中添加自己的应用,比如在tomcat中添加自己的app,构建一个自定义的镜像,那么我们应该怎么做,这个时候就用到了Do... 查看详情

制作自己的docker镜像并上传到hub.docker(代码片段)

...#xff0c;先要获取基础镜像前提是,你先要有一台安装好docker的机器,ubuntu、ctenos、windows、MAC都可以具体的docker安装教程可以自行去百度找找,我这里就不赘述了,也可以看我之前写的一篇安装docker的教程废话不多... 查看详情

根据dockerfile构建镜像(代码片段)

根据Dockerfile构建出一个镜像Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。Docker程序将这些Dockerfile指令翻译真正的Linux命令。Dockerfile有自己书写格式和支持的命令,Docke... 查看详情

docker镜像相关(代码片段)

一.中间镜像我前面写过一个《ASP.NETCore&Docker零基础持续集成 》的教程。里面我们通过持续集成工具Jenkins构建Docker镜像并运行容器,采用的是DockerCompose来进行编排构建运行的(VisualStudio2017添加Docker支持是采用的DockerCompose... 查看详情