关键词:
现在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 CE
和Docker 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.py
和requirements.txt
。在下面我们获取这些文件。
app本身
获取这两个文件并放到和Dockerfile
相同的目录中。这样就完成了我们的app,看上去是很简单的。当上述的Dockerfile
被构建进入镜像的时候,app.py
和requirements.txt
也将会存在,因为Dockerfile
的ADD
命令,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 ID
和http://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... 查看详情