①
# yum groupinstall -y "Development Tools" # yum -y install epel-release #需要安装python-pip的扩展源# yum -y install python-dev* libevent-dev* python-pip* openssl-devel xz-devel libffi-dev*# [root@docker1 ~]# git clone https://github.com/docker/docker-registry.gitCloning into 'docker-registry'...remote: Counting objects: 7007, done.remote: Total 7007 (delta 0), reused 0 (delta 0), pack-reused 7007Receiving objects: 100% (7007/7007), 1.69 MiB | 334.00 KiB/s, done.Resolving deltas: 100% (4099/4099), done.# cd docker-registry# lsADVANCED.md CHANGELOG.md config CONTRIBUTING.md depends docker_registry FAQ.md MANIFEST.in requirements setup.cfg tests AUTHORS circle.yml contrib DEBUGGING.md Dockerfile DRIVERS.md LICENSE README.md scripts setup.py tox.ini② 然后基于样例创建配置文件:# cp config/config_sample.yml config/config.yml修改local模版段的storage_path到本地的存储仓库的路径,例如:/tmp/registry更改为/opt/data/registry。# vi config/config.yml......local: &local <<: *common storage: local storage_path: _env:STORAGE_PATH:/opt/data/registry ......③ 需要安装M2Crypto RSA加密、解密 1.手动安装 M2Crypto 0.22.3# wget https://pypi.python.org/packages/source/M/M2Crypto/M2Crypto-0.22.3.tar.gz #下载源码# tar zxvf M2Crypto/M2Crypto-0.22.3.tar.gz # 解压# cd M2Crypto-0.22.32. 然后创建安装脚本,内容如下:# vim fedora_setup.sh#!/bin/sh# This script is meant to work around the differences on Fedora Core-based# distributions (Redhat, CentOS, ...) compared to other common Linux# distributions.## Usage: ./fedora_setup.sh [setup.py options]#arch=`uname -m`for i in SWIG/_{ec,evp}.i; do sed -i -e "s/opensslconf\./opensslconf-${arch}\./" "$i"doneSWIG_FEATURES=-cpperraswarn python setup.py $*3. 然后为脚本添加执行权限,执行脚本,并安装M2Crypto 0.22.3# chmod +x fedora_setup.sh# ./fedora_setup.sh build# python setup.py install# echo $? #返回值为0,则安装成功解决方法是在docker的配置文件里面OPTIONS添加 –insecure-registry http://10.0.0.10:5000 选项# /etc/sysconfig/docker# Modify these options if you want to change the way the docker daemon runsOPTIONS='--selinux-enabled --insecure-registry 10.0.0.10:5000'DOCKER_CERT_PATH=/etc/docker然后重启docker服务:systemctl restart docker④ 然后执行安装操作:# python setup.py install# echo $? #返回值为0,则安装成功对于通过软件包方式安装的,配置文件一般需要放在/usr/local/lib/python2.7/dist-packages/docker_registry/config/cpnfig.yml⑤ 此时,可以通过下面的命令来启动(nohup commend &; jobs -l查看进程):# gunicorn --access-logfile /var/log/docker-registry/access.log --error-logfile /var/log/docker-registry/server.log -k gevent --max-requests 100 --graceful-timeout 3600 -t 3600 -b 127.0.0.1:5000 -w 1 docker_registry.wsgi:application# curl 127.0.0.1:5000 ⑥ 配置服务脚本:一般通过服务脚本来管理registry服务会更加方便,以centos系统为例:首先,创建/etc/init/docker-registry.conf文件,内容为:首先在/lib/systemd/system/目录下,创建服务脚本:docker-registry.service[root@docker1 ~]# cd /etc/initinit.d/ inittab [root@docker1 init.d]# ./docker-registry [root@docker1 init.d]# nohup: appending output to ‘nohup.out’^C[root@docker1 init.d]# cat docker-registry #!/bin/bash#description "Docker Registry"nohup gunicorn --access-logfile /var/log/docker-registry/access.log --error-logfile /var/log/docker-registry/server.log -k gevent --max-requests 100 --graceful-timeout 3600 -t 3600 -b localhost:15000 -w 8 docker_registry.wsgi:application &然后,执行./docker-registry,将在本地的15000端口启动registry服务。 2) 用户认证: 通常在生产场景中,对私有仓库还需要进行访问代理和提供认证和用户管理。① 配置Nginx代理 使用Nginx来代理registry服务的原理十分简单,在上一节中,我们让registry服务监听在127.0.0.1:15000,这意味着只允许本机才能通过15000端口访问到,其他主机是无法访问到的。 为了让其他主机访问到,可以通过Nginx监听在对外地址的5000端口,当外部访问请求到达5000端口时,内部再将请求转发到本地的15000端口。 首先,安装Nginx。# yum -y install nginx 通过Nginx配置docker-registry反向代理[root@docker1 ~]# cat /etc/nginx/nginx.conf# For nginx < 1.3.9# FYI: Chunking requires nginx-extras package on Debian Wheezy and some Ubuntu versions# See chunking http://wiki.nginx.org/HttpChunkinModule# Replace with appropriate values where necessaryuser nginx;worker_processes 10;error_log /var/log/nginx/error.log warn;pid /var/run/nginx.pid;events { worker_connections 1024;}http { #本地的registry服务监听在15000端口 upstream docker-registry { server 127.0.0.1:15000; }# uncomment if you want a 301 redirect for users attempting to connect# on port 80# NOTE: docker client will still fail. This is just for convenience# server { # listen *:80;# server_name my.docker.registry.com;# return 301 https://$server_name$request_uri;# } server { #代理服务器监听在5000端口 listen 5000; server_name my.docker.registry.com;# ssl on; #注释三行# ssl_certificate /etc/ssl/certs/docker-registry;# ssl_certificate_key /etc/ssl/private/docker-registry; proxy_set_header Host $http_host; #required for Docker client sake #添加这两行 proxy_set_header X-Real-IP $remote_addr; #pass on real client IP client_max_body_size 0; # disable any limits to avoid HTTP 413 for large image uploads chunked_transfer_encoding on; location / { #配置转发对于"/"的访问请求到registry服务 proxy_pass http://docker-registry; } location /_ping { #配置转发对于/ping的访问请求到registry服务 auth_basic off; proxy_pass http://docker-registry; } location /v1/_ping { #配置转发对于/v1/ping的访问请求到registry服务 auth_basic off; proxy_pass http://docker-registry; } }}之后,可以通过上传镜像来测试服务是否正常。测试上传本地的sshd:centos镜像:[root@docker1 ~]# curl 127.0.0.1:15000"\"docker-registry server\""[root@docker1 ~]# curl 127.0.0.1:5000"\"docker-registry server\""[root@docker1 ~]# docker tag docker.io/nginx 127.0.0.1:5000/nginx:latest[root@docker1 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE127.0.0.1:5000/nginx latest ae513a47849c 7 days ago 108.9 MBdocker.io/nginx latest ae513a47849c 7 days ago 108.9 MB[root@docker1 ~]# docker push 127.0.0.1:5000/nginx:latestThe push refers to a repository [127.0.0.1:5000/nginx:latest]7ab428981537: Image successfully pushed 82b81d779f83: Image successfully pushed d626a8ad97a1: Image successfully pushed Pushing tag for rev [ae513a47849c] on {http://127.0.0.1:5000/v1/repositories/nginx.latest/tags/latest}② 添加用户认证 公共仓库DockerHub是通过注册索引(index)服务来实现的。由于index服务并没有完善的开源实现,在这里介绍基于Nginx代理的用户访问管理方案。 Nginx支持基于用户名和密码的访问管理。 首先,在配置文件的location/字段中添加两行。[root@docker1 ~]# vi /etc/nginx/nginx.conf...... location / { #let Nginx know about our auth file auth_basic "Please Input username/password"; #注意不要丢了分号 auth_basic_user_file docker-registry-htpasswd; proxy_pass http://docker-registry; }......-----------------------------------------------------------------auth_basic "Please Input username/password" 行说明了启用认证服务,不通过的请求将无法转发。auth_basic_user_file docker-registry-htpasswd;指定了验证的用户名密码存储文件为本地(/etc/nginx/下)的docker-registry-htpasswd文件。docker-registry-htpasswd文件中存储用户名密码的格式为每行放一个用户名、密码对:...user1:password1user2:password2...需要注意的是,密码字段存储的并不是明文,而是使用crypt函数加密过的字符串。要生成加密后的字符串,可以通过htpasswd工具 (apache密码生成工具htpasswd的应用),首先安装apache2-utils:# yum install -y httpd-tools创建用户user1,并添加密码例如,如下的操作会创建/etc/nginx/docker-registrt-htpasswd文件来保存用户名和加密后的密码信息,并创建user1和对应密码。[root@docker1 ~]# htpasswd -c /etc/nginx/docker-registry-htpasswd user1New password: Re-type new password: Adding password for user user1添加更多用户,可以重复上面的命令(密码文件存在后,不需使用-c选项重新创建)。[root@docker1 ~]# htpasswd /etc/nginx/docker-registry-htpasswd user2New password: Re-type new password: Adding password for user user2[root@docker1 ~]# cat /etc/nginx/docker-registry-htpasswduser1:$apr1$Ou2YtwCo$zDFLKHCZwWasX9owaU5il/user2:$apr1$.amOaUuK$aHIDR/72ZvZUNNSWavdku/最后,重新启动Nginx服务。此时,通过浏览器访问本地的服务http://127.0.0.1:5000/v1/search,会弹出对话框,提示输入用户名和密码。[root@docker1 ~]# curl 127.0.0.1:5000<html><head><title>401 Authorization Required</title></head><body bgcolor="white"><center><h1>401 Authorization Required</h1></center><hr><center>nginx/1.14.0</center></body></html>[root@docker1 ~]# curl 127.0.0.1:5000/v1/search<html><head><title>401 Authorization Required</title></head><body bgcolor="white"><center><h1>401 Authorization Required</h1></center><hr><center>nginx/1.14.0</center></body></html>通过命令行访问,需要在地址前面带上用户名和密码才能正常返回:[root@docker1 ~]# curl user1:user1@localhost:5000/v1/search{"num_results": 2, "query": "", "results": [{"description": "", "name": "library/nginx.latest"}, {"description": "", "name": "library/nginx"}]3) 使用私有仓库批量上传镜像
在前面对Docker私有仓库的讲解中,介绍了如何使用本地私有仓库进行上传、下载等操作。有时候,本地镜像很多,逐个打标记上传将十分浪费时间。这里给出两个自动化脚本,来快速完成对大量镜像的上传操作。① 批量上传指定镜像 可以使用下面的push_images.sh脚本,批量上传本地的镜像到注册服务器中,默认是本地注册服务器127.0.0.1:5000,用户可以通过修改registry=127.0.0.1:5000这行来指定目标注册服务器:[root@docker1 bin]# docker login -u user1 -p user1 127.0.0.1:5000 #登录docker-registry Login Succeeded[root@docker1 bin]# ./push_images.sh sshd:centos 这一步的认证有问题The registry server is 127.0.0.1:5000Uploading sshd:centos...The push refers to a repository [127.0.0.1:5000/sshd]1313b4282620: Waiting 4665eb546397: Waiting 5fe984cfc360: Waiting f2bd4f252713: Waiting b53eaab8551b: Waiting 2935bd02b7fe: Waiting cf5686344c89: Waiting c7d53387d4f7: Waiting c800d514f009: Waiting 1c5890b2b229: Waiting c460848e3502: Waiting ccc941d601ab: Waiting 1a8c6d0f3b9f: Waiting 57a2e3e43348: Waiting cf516324493c: Pushing Authentication is required.Untagged: 127.0.0.1:5000/sshd:centosDone
建议把脚本存放到本地的可执行路径下,例如/usr/local/bin/下面。然后添加可执行权限,就可以使用该脚本了: ② 批量上传本地所有镜像 在push_images工具的基础上,还可以进一步的创建push_all工具,来上传本地所有镜像:[root@docker1 bin]# cat push_all.sh #!/bin/bashfor image in `docker images |grep -v "REPOSTIORY" |grep -v "<none>" |awk '{print $1":"$2}'`do push_images.sh $imagedone 同样,读者把它放在/usr/local/bin下面,并添加可执行权限,之后就可通过push_all.sh命令上传本地所有镜像到本地私有仓库中了。 4) 仓库配置文件 Docker的Registry利用配置文件提供了一些仓库的模版(flavor),用户可以直接使用它们来进行开发或生产部署。 我们将以下面的示例配置为例,来介绍如何使用仓库配置文件来管理私有仓库。 示例配置:[root@docker1 ~]# cat /root/docker-registry/config/config_sample.yml# All other flavors inherit the `common' config snippetcommon: &common issue: '"docker-registry server"' # 默认记录info和以上级别的日志 loglevel: _env:LOGLEVEL:info # 是否启用debug模式 debug: _env:DEBUG:false # 默认是standalone模式,不查询index服务 standalone: _env:STANDALONE:true # 非standalone模式下的index服务默认是index.docker.io index_endpoint: _env:INDEX_ENDPOINT:https://index.docker.io # 默认不启用存储转向 storage_redirect: _env:STORAGE_REDIRECT # 非standalone模式下启用基于口令串的认证 disable_token_auth: _env:DISABLE_TOKEN_AUTH # 默认不使用特权 privileged_key: _env:PRIVILEGED_KEY # 搜索后端支持 search_backend: _env:SEARCH_BACKEND # SQLite搜索后端数据库地址 sqlalchemy_index_database: _env:SQLALCHEMY_INDEX_DATABASE:sqlite:tmp/docker-registry.db # 默认不启用镜像服务 mirroring: source: _env:MIRROR_SOURCE # https://registry-1.docker.io source_index: _env:MIRROR_SOURCE_INDEX # https://index.docker.io tags_cache_ttl: _env:MIRROR_TAGS_CACHE_TTL:172800 # seconds cache: host: _env:CACHE_REDIS_HOST port: _env:CACHE_REDIS_PORT db: _env:CACHE_REDIS_DB:0 password: _env:CACHE_REDIS_PASSWORD # 访问远端存储后端时,配置LRU缓存 cache_lru: host: _env:CACHE_LRU_REDIS_HOST port: _env:CACHE_LRU_REDIS_PORT db: _env:CACHE_LRU_REDIS_DB:0 password: _env:CACHE_LRU_REDIS_PASSWORD # 发生异常时发送邮件通知 email_exceptions: smtp_host: _env:SMTP_HOST smtp_port: _env:SMTP_PORT:25 smtp_login: _env:SMTP_LOGIN smtp_password: _env:SMTP_PASSWORD smtp_secure: _env:SMTP_SECURE:false from_addr: _env:SMTP_FROM_ADDR:docker-registry@localdomain.local to_addr: _env:SMTP_TO_ADDR:noise+dockerregistry@localdomain.local # 启用bugsnag bugsnag: _env:BUGSNAG # CORE支持,默认未启用 cors: origins: _env:CORS_ORIGINS methods: _env:CORS_METHODS headers: _env:CORS_HEADERS:[Content-Type] expose_headers: _env:CORS_EXPOSE_HEADERS supports_credentials: _env:CORS_SUPPORTS_CREDENTIALS max_age: _env:CORS_MAX_AGE send_wildcard: _env:CORS_SEND_WILDCARD always_send: _env:CORS_ALWAYS_SEND automatic_options: _env:CORS_AUTOMATIC_OPTIONS vary_header: _env:CORS_VARY_HEADER resources: _env:CORS_RESOURCESlocal: &local <<: *common storage: local storage_path: _env:STORAGE_PATH:/tmp/registrys3: &s3 <<: *common storage: s3 s3_region: _env:AWS_REGION s3_bucket: _env:AWS_BUCKET boto_bucket: _env:AWS_BUCKET storage_path: _env:STORAGE_PATH:/registry s3_encrypt: _env:AWS_ENCRYPT:true s3_secure: _env:AWS_SECURE:true s3_access_key: _env:AWS_KEY s3_secret_key: _env:AWS_SECRET s3_use_sigv4: _env:AWS_USE_SIGV4 boto_host: _env:AWS_HOST boto_port: _env:AWS_PORT boto_calling_format: _env:AWS_CALLING_FORMATcloudfronts3: &cloudfronts3 <<: *s3 cloudfront: base: _env:CF_BASE_URL keyid: _env:CF_KEYID keysecret: _env:CF_KEYSECRETazureblob: &azureblob <<: *common storage: azureblob azure_storage_account_name: _env:AZURE_STORAGE_ACCOUNT_NAME azure_storage_account_key: _env:AZURE_STORAGE_ACCOUNT_KEY azure_storage_container: _env:AZURE_STORAGE_CONTAINER:registry azure_use_https: _env:AZURE_USE_HTTPS:true# Ceph对象网关配置ceph-s3: &ceph-s3 <<: *common storage: s3 s3_region: ~ s3_bucket: _env:AWS_BUCKET s3_encrypt: _env:AWS_ENCRYPT:false s3_secure: _env:AWS_SECURE:false storage_path: _env:STORAGE_PATH:/registry s3_access_key: _env:AWS_KEY s3_secret_key: _env:AWS_SECRET boto_bucket: _env:AWS_BUCKET boto_host: _env:AWS_HOST boto_port: _env:AWS_PORT boto_debug: _env:AWS_DEBUG:0 boto_calling_format: _env:AWS_CALLING_FORMAT# Google 云存储配置gcs: <<: *common storage: gcs boto_bucket: _env:GCS_BUCKET storage_path: _env:STORAGE_PATH:/registry gs_secure: _env:GCS_SECURE:true gs_access_key: _env:GCS_KEY gs_secret_key: _env:GCS_SECRET # 存储服务的OAuth 2.0认证 oauth2: _env:GCS_OAUTH2:false# 存储镜像文件到Openstack Swift服务swift: &swift <<: *common storage: swift storage_path: _env:STORAGE_PATH:/registry # keystone authorization swift_authurl: _env:OS_AUTH_URL swift_container: _env:OS_CONTAINER swift_user: _env:OS_USERNAME swift_password: _env:OS_PASSWORD swift_tenant_name: _env:OS_TENANT_NAME swift_region_name: _env:OS_REGION_NAME# 存储镜像文件到Open Stack Glance服务glance: &glance <<: *common storage: glance storage_alternate: _env:GLANCE_STORAGE_ALTERNATE:file storage_path: _env:STORAGE_PATH:/tmp/registryopenstack: <<: *glance# 存储镜像文件到Glance,标签信息到Swiftglance-swift: &glance-swift <<: *swift storage: glance storage_alternate: swiftopenstack-swift: <<: *glance-swiftelliptics: <<: *common storage: elliptics elliptics_nodes: _env:ELLIPTICS_NODES elliptics_wait_timeout: _env:ELLIPTICS_WAIT_TIMEOUT:60 elliptics_check_timeout: _env:ELLIPTICS_CHECK_TIMEOUT:60 elliptics_io_thread_num: _env:ELLIPTICS_IO_THREAD_NUM:2 elliptics_net_thread_num: _env:ELLIPTICS_NET_THREAD_NUM:2 elliptics_nonblocking_io_thread_num: _env:ELLIPTICS_NONBLOCKING_IO_THREAD_NUM:2 elliptics_groups: _env:ELLIPTICS_GROUPS elliptics_verbosity: _env:ELLIPTICS_VERBOSITY:4 elliptics_logfile: _env:ELLIPTICS_LOGFILE:/dev/stderr elliptics_addr_family: _env:ELLIPTICS_ADDR_FAMILY:2# This flavor stores the images in Aliyun OSS# See:# https://i.aliyun.com/access_key/# for details on access and secret keys.oss: &oss <<: *common storage: oss storage_path: _env:STORAGE_PATH:/registry/ oss_host: _env:OSS_HOST oss_bucket: _env:OSS_BUCKET oss_accessid: _env:OSS_KEY oss_accesskey: _env:OSS_SECRET# 默认启用的配置选项dev: &dev <<: *local loglevel: _env:LOGLEVEL:debug debug: _env:DEBUG:true search_backend: _env:SEARCH_BACKEND:sqlalchemy# 用于测试test: <<: *dev index_endpoint: https://registry-stage.hub.docker.com standalone: true storage_path: _env:STORAGE_PATH:./tmp/test# 在环境变量SETTINGS_FLAVOR中指定启用哪个配置,例如$ export SETTINGS_FLAVOR=prodprod: <<: *s3 storage_path: _env:STORAGE_PATH:/prod 模版 在config_sample.yml文件中,可以看到一些现成的模版段: ◆ common: 基础配置 ◆ local: 存储数据到本地文件系统 ◆ s3: 存储数据到AWS S3中 ◆ dev: 使用local模版的基本配置 ◆ test: 单元测试使用。 ◆ prod: 生产环境配置(基本上跟s3配置) ◆ gcs: 存储数据到Google的云存储 ◆ swift: 存储数据到OpenStack Swift服务 ◆ glance: 存储数据到OpenStack Glance服务,本地文件系统为后备 ◆ glance-swift: 存储数据到OpenStack Glance服务,Swift为后备。 ◆ elliptics: 存储数据到Elliptics key/value存储 用户也可以添加自定义的模版段。 默认情况下使用的模版是dev,要使用某个模版作为默认值,可以添加SETTINGS_FLAVOR到环境变量中,例如: export SETTINGS_FLAVOR=dev 另外,配置文件中支持从环境变量中加载值,语法格式为: _env:VARIABLENAME[:DEFALUT] 选项 ○ 基本选项如下: ◆ loglevel: 字符串类型,标注输出调试信息的级别,包括debug、info、warn、error和critical。 ◆ debug: 布尔类型,开启后会在访问/_ping时候输出更多的信息,包括库版本和主机信息等。 ◆ storage_redirect:重定向存储请求。 ◆ boto_host/boto_port: 使用s3模版时,标准boto配置文件的位置。 ○ 搜索选项如下: Docker注册服务器可以将仓库的索引信息放到数据库中,供通过GET方法访问/v1/search时使用。 ◆ search_backend: 选择搜索后端类型,目前仅支持sqlalchemy。用户也可以将它指定为自定义的模版。例如:common:search_backend: foo.registry.index.xapian ◆ sqlalchemy_index_database: 当使用sqlalchemy作为索引后端引擎时,可以通过sqlalchemy_index_database来指定创建数据库的位置。例如:common:search_backend: sqlalchemysqlalchemy_index_database: sqlite:///tmp/docker-registry.db ○ 镜像选项都放在mirroring字段下面,例如:common: mirroring: source: https://registry-1.docker.io source_index: https://index.docker.io tags_cache_ttl: 172800 # 2 days 默认并未启用。 ○ 缓存选项包括cache字段和cache_lru字段,例如: cache: host: _env:CACHE_REDIS_HOST port: _env:CACHE_REDIS_PORT db: _env:CACHE_REDIS_DB:0 password: _env:CACHE_REDIS_PASSWORD # 访问远端存储后端时,配置LRU缓存 cache_lru: host: _env:CACHE_LRU_REDIS_HOST port: _env:CACHE_LRU_REDIS_PORT db: _env:CACHE_LRU_REDIS_DB:0 password: _env:CACHE_LRU_REDIS_PASSWORD 通过配置缓存(事先本地要启动一个LRU模式下的redis服务器),可以将小文件缓存在本地,加速仓库的查询性能。 ○ Email选项为email_exceptions字段,通过配置该选项,当仓库发生异常时自动发送Email。例如: # 发生异常时发送邮件通知 email_exceptions: smtp_host: _env:SMTP_HOST smtp_port: _env:SMTP_PORT:25 smtp_login: _env:SMTP_LOGIN smtp_password: _env:SMTP_PASSWORD smtp_secure: _env:SMTP_SECURE:false from_addr: _env:SMTP_FROM_ADDR:docker-registry@localdomain.local to_addr: _env:SMTP_TO_ADDR:noise+dockerregistry@localdomain.local ○ 存储选项为storage,该选项将选择事先存储的引擎,仓库默认自带两种类型的引擎:file和s3。用户如果需要其他引擎支持,可以通过下面的命令来进行搜索可用引擎并安装。 # pip search docker-registry-driver # pip install docker-registry-driver-NAME 安装后,可能需要对引擎进行配置。目前支持的引擎包括: ○ elliptics (一种分布式键值数据存储) ○ swift (OpenStack的子项目,提供对象存储服务) ○ gcs (Google的子存储) ○ glance (OpenStack的子项目,提供文件存储服务) ° file引擎 file引擎意味着存储到本地文件。当使用file引擎的时候,可以通过storage_path来指定存储的具体位置,以local模版为例,默认为/tmp/registry。local: &local <<: *common storage: local storage_path: _env:STORAGE_PATH:/tmp/registry 因此,我们在运行registry镜像时,可以挂载本地目录到这个位置,来保存仓库中的数据到本地,即 # docker run -p 5000 -v /tmp/registry:/tmp/registry registry ° s3引擎 s3引擎意味着存储到亚马逊的云服务。亚马逊s3引擎支持的选项包括: ○ s3_access_key: 字符串类型,s3的访问口令 ○ s3_secret_key:字符串类型,s3密钥 ○ s3_bucket: 字符串类型,s3桶名称 ○ s3_region: s3桶所在的存放域 ○ s3_encrypt: 布尔类型,是否加密存储 ○ s3_secure: 布尔类型,进行访问时是否启用HTTPS ○ boto_bucket: 字符串类型,对s3不兼容对象存储的桶名 ○ boto_host: 字符串类型,对s3不兼容对象存储的主机。 ○ boto_port: 对s3不兼容对象存储的端口 ○ boto_debug: 对s3不兼容对象存储的调试输出 ○ boto_calling_format: 字符串类型,boto调用所使用格式的类名。 ○ storage_path: 字符串类型,镜像文件存储的子路径。 例如: prod: storage: s3 s3_region: us-west-1 s3_bucket: acme-docker storage_path: /registry s3_access_key: AKIAHSHAKJSKKJJSKAJK s3_secret_key:xasdkj289bdsbhasbjhckncskl附:
M2Crypto-0.22.3.tar.gz