docker搭建私有仓库

序言

黄金指,一不小心就弄出一个故障。。。好可怕好可怕,我的小心脏。。。我的小心眼。。。

我这么信任你,你居然欺骗我。。。。****,这么大的坑,填不满啊。。。

生产变更,做再多的准备都不为过。。。double check。。。所谓的预期无影响都是骗人的。。。感觉很重要。。。内心是拒绝的。。。但是并不能拒绝。。。心魔啊、、、

为何要搭建私有仓库

在进行docker的时候,一般都是使用共有仓库来下载相关的镜像文件,然后运行一个镜像的实例也就是运行一个容器,如下:

在使用docker run的时候,首先查找的是本地仓库,如果本地没有,那么就会向公共仓库发起请求,找到对应的版本,然后下载,下载之后,运行这个镜像的实例,也就是dokcer images的结果是下载的镜像,而docker ps看到的是容器。

注册服务器(repository),仓库(registry),镜像(image),容器(container)之间的关系:注册服务器主要是用来存放仓库的服务器,在一个服务器上有多个仓库,而仓库又可以分为公共仓库和私有仓库,一个仓库里面有可以有多个镜像,而容器则是镜像的一个实例

其实最简单的理解方式就是在使用linux系统的时候,我们会搭建yum源,而有公共的yum源epel,而总是喜欢搭建本地源,主要是为了应对内网环境

在以上运行的registry容器其实就是一个私有仓库。在其中提供了监听的端口5000.

使用dockerfile来创建自己的镜像

在这里会使用dockerfile来创建自己的镜像,然后运行一个python程序,主要就是flask访问redis,dockerfile内容如下:

[root@docker-1 dockerfile]# cat Dockerfile

FROM python:2.7-slim

WORKDIR /app

ADD . /app

EXPOSE 80

ENV NAME World

CMD ["python","app.py"]

在写dockerfile的时候,第一行必须指定基础的镜像,此处的dockerfile就是以python-2.7-slim为基础镜像,当指定为基础镜像的时候使用的关键字为FROM。

WORKDIR表示指定工作目录,主要是为了在使用RUN,CMD,ENTRYPOINT指定工作目录,在指定目录的时候,如果没有以/开头那么表示为相对路径,如果指定了那么使用的是绝对路径。

ADD表示复制指定的源文件到容器的目录路径之中,在使用COPY的时候,也是复制,只是相对于dockerfile的相对路径。

RUN后面如果直接接的是命令,那么就是表示在shell中直接运行的命令,也就是使用/bin/sh -c 来直接运行这个命令;以上的RUN也可以修改为RUN [“executable”,"pip install --trusted-host pypi.python.org -r requirements.txt"],这步的主要目的就是安装相关的python模块文件redis和flask。

EXPOSE表示为容器对外的端口,在启动容器的时候,可以使用参数-P来指定容器的端口隐射关系。

ENV表示设定环境变量,会被RUN使用到,并且在容器运行的时候保持。

CMD表示指定容器启动时的命令,在上面的表示意思就是容器运行之后,运行python app.py。

dockerfile写完之后,那么就需要创建一个app依赖的模块文件,也就是requirements.txt,内容如下:

[root@docker-1 dockerfile]# cat requirements.txt

Flask

Redis

在根据flask写一个简单的程序,监听端口80:

[root@docker-1 dockerfile]# cat app.py (此处为官网实例

from flask import Flask

from redis import Redis, RedisError

import os

import socket

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 = "cannot connect to Redis, counter disabled"

html = "Hello !" \

"Hostname:

" \

"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)

所以一切准备完毕,那么开始编译镜像:

在编译镜像的时候,使用的参数未build,-t表示为这个镜像打上标签。

在进行push到私有仓库的时候,首先必须打tag,标记相关的ip和端口,如下:

在这个registry使用的是v2版本,从而和v1的api接口不一样,默认存储的路径为:

这个也就是刚刚上传的镜像文件,使用curl可以来进行检查查看(api文档路径https://docs.docker.com/registry/spec/api/):

看以上的ip地址问本宿主机的ip地址,查看本机的监听端口和容器的监听端口,如下:

其实。。。。docker的地址也是可以直接访问的,尼玛。。。

关键是这第二个报错,你TM为啥是V1的地址呢。。。为什么呢。百思不得骑姐。。。。

第二个报错需要修改启动文件,在启动docker的时候,注册这个服务器,然后使用http协议就好了,如下:

运行python程序

在上面创建一个python的程序,那么就运行一下:

当创建容器失败后,那么就会显示状态为创建中,但是并不能运行,需要删除,如下:

创建容器,并使用默认的CMD进行运行,然后使用curl进行访问:

冬。。微凉

这个冬天太冷了,手指都冻僵了,打个docker这个指令,都很多次出现dokcer。。。

dokcer的好处太多,照着目前看来,比虚拟机好无数倍,拿着镜像就可以到处浪了。。。虚拟机还需要修改各种配置。。。各种环境变量。。。

来。。。谁来送点温暖,你懂的。。。哈哈

本文来自企鹅号 - 运维Linux和python媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏finleyMa

docker学习系列3 提交并分享自己的镜像

docker有个类似 github的平台,叫 https://hub.docker.com 可以 pull 官方或第三方提供的镜像,当然也可以发布自己的镜像供...

1625
来自专栏星流全栈

DaoCloud的Docker Mirror服务更新啦!

1633
来自专栏三木的博客

QEMU 1: 使用QEMU创建虚拟机

一、QEMU简介# QEMU是一款开源的模拟器及虚拟机监管器(Virtual Machine Monitor, VMM)。QEMU主要提供两种功能给用户使用。一...

3287
来自专栏Laoqi's Linux运维专列

Docker 配置安装(Ⅲ)

1436
来自专栏我是攻城师

Docker学习笔记一之安装卸载

3055
来自专栏A周立SpringCloud

Docker系列教程14-Docker数据持久化

容器中数据持久化主要有两种方式: 数据卷(Data Volumes) 数据卷容器(Data Volumes Dontainers) 数据卷 数据卷是一个可供一个...

3936
来自专栏阮一峰的网络日志

Docker 入门教程

2013年发布至今, Docker 一直广受瞩目,被认为可能会改变软件行业。 但是,许多人并不清楚 Docker 到底是什么,要解决什么问题,好处又在哪里?本文...

3453
来自专栏PHP在线

Docker 入门教程

2013年发布至今, Docker 一直广受瞩目,被认为可能会改变软件行业。 但是,许多人并不清楚 Docker 到底是什么,要解决什么问题,好处又在哪里?本文...

3634
来自专栏北京马哥教育

Docker容器构建过程的安全性分析

DevOps概念的流行跟近些年微服务架构的兴起有很大关系,DevOps是Dev(Development)和Ops(Operations)的结合,Dev负责开发,...

720
来自专栏holer

外网访问内网Docker容器

局域网里的主机上安装了Docker容器,只能在内网访问,怎样从外网也能访问内网的Docker容器?

2321

扫码关注云+社区