{"id":108,"date":"2017-03-30T15:15:01","date_gmt":"2017-03-30T07:15:01","guid":{"rendered":"http:\/\/www.jsjs.org\/?p=108"},"modified":"2017-03-30T15:15:01","modified_gmt":"2017-03-30T07:15:01","slug":"harbor-%e4%bc%81%e4%b8%9a%e7%ba%a7-docker-registry-%e5%88%9d%e8%af%95","status":"publish","type":"post","link":"https:\/\/blog.jsjs.org\/?p=108","title":{"rendered":"Harbor \u4f01\u4e1a\u7ea7 Docker Registry \u521d\u8bd5"},"content":{"rendered":"<div>\n<p>Project Harbor is an enterprise-class registry server, which extends the open source Docker Registry server by adding the functionality usually required by an enterprise, such as security, control, and management. Harbor is primarily designed to be a private registry &#8211; providing the needed security and control that enterprises require. It also helps minimize bandwidth usage, which is helpful to both improve productivity (local network access) as well as performance (for those with poor internet connectivity).<\/p>\n<\/div>\n<p>\u7b80\u5355\u7684\u8bf4\uff0cHarbor \u662f\u4e00\u4e2a\u4f01\u4e1a\u7ea7\u7684 Docker Registry\uff0c\u53ef\u4ee5\u5b9e\u73b0 images \u7684\u79c1\u6709\u5b58\u50a8\u548c\u65e5\u5fd7\u7edf\u8ba1\u6743\u9650\u63a7\u5236\u7b49\u529f\u80fd\uff0c\u5e76\u652f\u6301\u521b\u5efa\u591a\u9879\u76ee(Harbor \u63d0\u51fa\u7684\u6982\u5ff5)\uff0c\u57fa\u4e8e\u5b98\u65b9 Registry V2 \u5b9e\u73b0\u3002<\/p>\n<h2>\u4e8c\u3001\u73af\u5883\u51c6\u5907<\/h2>\n<p>\u672c\u6587\u6240\u4f7f\u7528\u7684\u73af\u5883\u5982\u4e0b :<\/p>\n<ul>\n<li>Ubuntu 14.04<\/li>\n<li>Docker 1.11.2<\/li>\n<li>docker-compose 1.6.2<\/li>\n<\/ul>\n<h3>2.1\u3001\u5b89\u88c5 Docker<\/h3>\n<p>\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\u5b89\u88c5 Docker<\/p>\n<div>\n<div>\n<pre class=\"hljs nginx\"><span class=\"hljs-attribute\">curl<\/span> -fsSL https:\/\/get.docker.io | bash<\/pre>\n<\/div>\n<\/div>\n<h3>2.2\u3001\u5b89\u88c5 docker-compose<\/h3>\n<p>\u9ed8\u8ba4\u7684 <a href=\"https:\/\/docs.docker.com\/compose\/install\/\" target=\"_blank\" rel=\"nofollow,noindex noopener\">\u5b98\u65b9\u6587\u6863<\/a> \u5b89\u88c5\u547d\u4ee4\u5982\u4e0b :<\/p>\n<div>\n<div>\n<pre class=\"prettyprint hljs ruby\">curl -L <span class=\"hljs-symbol\">https:<\/span>\/<span class=\"hljs-regexp\">\/github.com\/docker<\/span><span class=\"hljs-regexp\">\/compose\/releases<\/span><span class=\"hljs-regexp\">\/download\/<\/span><span class=\"hljs-number\">1.6<\/span>.<span class=\"hljs-number\">2<\/span>\/docker-compose-<span class=\"hljs-string\">`uname <\/span><span class=\"hljs-string\">-s<\/span><span class=\"hljs-string\">`<\/span>-<span class=\"hljs-string\">`uname -m`<\/span> &gt; <span class=\"hljs-regexp\">\/usr\/<\/span><span class=\"hljs-regexp\">local<\/span><span class=\"hljs-regexp\">\/bin\/docker<\/span>-compose<\/pre>\n<\/div>\n<\/div>\n<h4>\u7ecf\u8fc7\u672c\u4eba\u6d4b\u8bd5\uff0c\u5176\u6587\u4ef6\u6258\u7ba1\u5728\u4e9a\u9a6c\u900a\u4e0a\uff0c\u4f1f\u5927\u7684\u9632\u706b\u5899\u6210\u529f\u963b\u6b62\u4e0b\u8f7d\u2026\u2026<\/h4>\n<p>\u6709\u80fd\u529b\u7684\u7ae5\u978b\u53ef\u4ee5\u4f7f\u7528\u68af\u5b50\uff0c\u6211\u5df2\u7ecf\u4e0b\u8f7d\u597d\u4e86\u4e00\u4e2a\u70b9\u51fb\u4e0b\u8f7d \uff1b\u4e0b\u8f7d\u540e\u76f4\u63a5 cp \u5230 <code>\/usr\/local\/bin<\/code> \u4e0b\u5e76\u7ed9\u4e0e\u53ef\u6267\u884c\u6743\u9650\u5373\u53ef\u3002<\/p>\n<h2>\u4e09\u3001\u642d\u5efa Harbor<\/h2>\n<h3>3.1\u3001\u514b\u9686\u6e90\u7801<\/h3>\n<div>\n<div>\n<pre class=\"prettyprint hljs awk\">git clone https:<span class=\"hljs-regexp\">\/\/gi<\/span>thub.com<span class=\"hljs-regexp\">\/vmware\/<\/span>harbor<\/pre>\n<\/div>\n<\/div>\n<h3>3.2\u3001\u4fee\u6539\u914d\u7f6e<\/h3>\n<div>\n<div>\n<pre class=\"prettyprint hljs vim\"><span class=\"hljs-keyword\">cd<\/span> harbor\/Deploy\/\n<span class=\"hljs-keyword\">vim<\/span> harbor.cfg<\/pre>\n<\/div>\n<\/div>\n<p>\u914d\u7f6e\u6837\u4f8b\u5982\u4e0b :<\/p>\n<div>\n<div>\n<pre class=\"prettyprint hljs delphi\">## Configuration <span class=\"hljs-keyword\">file<\/span> <span class=\"hljs-keyword\">of<\/span> Harbor\n\n#The IP address <span class=\"hljs-keyword\">or<\/span> hostname <span class=\"hljs-keyword\">to<\/span> access admin UI <span class=\"hljs-keyword\">and<\/span> registry service.\n#<span class=\"hljs-keyword\">DO<\/span> <span class=\"hljs-keyword\">NOT<\/span> use localhost <span class=\"hljs-keyword\">or<\/span> <span class=\"hljs-number\">127.0<\/span>.<span class=\"hljs-number\">0.1<\/span>, because Harbor needs <span class=\"hljs-keyword\">to<\/span> be accessed by <span class=\"hljs-keyword\">external<\/span> clients.\n# \u6307\u5b9a hostname\uff0c\u4e00\u822c\u4e3aIP\uff0c\u6216\u8005\u57df\u540d\uff0c\u7528\u4e8e\u767b\u5f55 Web UI \u754c\u9762\nhostname = <span class=\"hljs-number\">10.211<\/span>.<span class=\"hljs-number\">55.17<\/span>\n\n#The protocol <span class=\"hljs-keyword\">for<\/span> accessing the UI <span class=\"hljs-keyword\">and<\/span> token\/notification service, by <span class=\"hljs-keyword\">default<\/span> it <span class=\"hljs-keyword\">is<\/span> http.\n#It can be <span class=\"hljs-keyword\">set<\/span> <span class=\"hljs-keyword\">to<\/span> https <span class=\"hljs-keyword\">if<\/span> ssl <span class=\"hljs-keyword\">is<\/span> enabled <span class=\"hljs-keyword\">on<\/span> nginx.\n# URL \u8bbf\u95ee\u65b9\u5f0f\uff0cSSL \u9700\u8981\u914d\u7f6e nginx\nui_url_protocol = http\n\n#Email account settings <span class=\"hljs-keyword\">for<\/span> sending <span class=\"hljs-keyword\">out<\/span> password resetting emails.\n# \u90ae\u4ef6\u76f8\u5173\u4fe1\u606f\u914d\u7f6e\uff0c\u5982\u5fd8\u8bb0\u5bc6\u7801\u53d1\u9001\u90ae\u4ef6\nemail_server = smtp.xxxxxx.com\nemail_server_port = <span class=\"hljs-number\">465<\/span>\nemail_username = reg@mritd.me\nemail_password = xxxxxx\nemail_from = docker &lt;reg@mritd.me&gt;\nemail_ssl = true\n\n##The password <span class=\"hljs-keyword\">of<\/span> Harbor admin, change this before any production use.\n# \u9ed8\u8ba4\u7684 Harbor \u7684\u7ba1\u7406\u5458\u5bc6\u7801\uff0c\u7ba1\u7406\u5458\u7528\u6237\u540d\u9ed8\u8ba4 admin\nharbor_admin_password = Harbor12345\n\n##By <span class=\"hljs-keyword\">default<\/span> the auth mode <span class=\"hljs-keyword\">is<\/span> db_auth, i.e. the credentials are <span class=\"hljs-keyword\">stored<\/span> <span class=\"hljs-keyword\">in<\/span> a <span class=\"hljs-keyword\">local<\/span> database.\n#<span class=\"hljs-keyword\">Set<\/span> it <span class=\"hljs-keyword\">to<\/span> ldap_auth <span class=\"hljs-keyword\">if<\/span> you want <span class=\"hljs-keyword\">to<\/span> verify a user<span class=\"hljs-string\">'s credentials against an LDAP server.<\/span>\n<span class=\"hljs-string\"># \u6307\u5b9a Harbor \u7684\u6743\u9650\u9a8c\u8bc1\u65b9\u5f0f\uff0cHarbor \u652f\u6301\u672c\u5730\u7684 mysql \u6570\u636e\u5b58\u50a8\u5bc6\u7801\uff0c\u540c\u65f6\u4e5f\u652f\u6301 LDAP<\/span>\n<span class=\"hljs-string\">auth_mode = db_auth<\/span>\n\n<span class=\"hljs-string\">#The url for an ldap endpoint.<\/span>\n<span class=\"hljs-string\"># \u5982\u679c\u91c7\u7528\u4e86 LDAP\uff0c\u6b64\u5904\u586b\u5199 LDAP \u5730\u5740<\/span>\n<span class=\"hljs-string\">ldap_url = ldaps:\/\/ldap.mydomain.com<\/span>\n\n<span class=\"hljs-string\">#The basedn template to look up a user in LDAP and verify the user'<\/span>s password.\n# LADP \u9a8c\u8bc1\u5bc6\u7801\u7684\u65b9\u5f0f(\u6211\u7279\u4e48\u6ca1\u7528\u8fc7\u8fd9\u4e48\u9ad8\u7ea7\u7684\u73a9\u610f)\nldap_basedn = uid=%s,ou=people,dc=mydomain,dc=com\n\n#The password <span class=\"hljs-keyword\">for<\/span> the root user <span class=\"hljs-keyword\">of<\/span> mysql db, change this before any production use.\n# mysql \u6570\u636e\u5e93 root \u8d26\u6237\u5bc6\u7801\ndb_password = root123\n\n#Turn <span class=\"hljs-keyword\">on<\/span> <span class=\"hljs-keyword\">or<\/span> off the self-registration feature\n# \u662f\u5426\u5141\u8bb8\u5f00\u653e\u6ce8\u518c\nself_registration = <span class=\"hljs-keyword\">on<\/span>\n\n#Turn <span class=\"hljs-keyword\">on<\/span> <span class=\"hljs-keyword\">or<\/span> off the customize your certicate\n# \u5141\u8bb8\u81ea\u7b7e\u540d\u8bc1\u4e66\ncustomize_crt = <span class=\"hljs-keyword\">on<\/span>\n\n#fill <span class=\"hljs-keyword\">in<\/span> your certicate <span class=\"hljs-keyword\">message<\/span>\n# \u81ea\u7b7e\u540d\u8bc1\u4e66\u4fe1\u606f\ncrt_country = CN\ncrt_state = State\ncrt_location = CN\ncrt_organization = mritd\ncrt_organizationalunit = mritd\ncrt_commonname = mritd.me\ncrt_email = reg.mritd.me\n#####<\/pre>\n<\/div>\n<\/div>\n<h3>3.3\u3001\u751f\u6210\u76f8\u5173\u914d\u7f6e<\/h3>\n<div>\n<div>\n<pre class=\"prettyprint hljs nginx\"><span class=\"hljs-attribute\">cd<\/span> harbor\/Deploy\/\n.\/prepare<\/pre>\n<\/div>\n<\/div>\n<p><img decoding=\"async\" class=\"alignCenter\" src=\"http:\/\/img2.tuicool.com\/A3eqie6.png!web\" \/><\/p>\n<h3>3.4\u3001\u7f16\u8bd1 image \u5e76\u542f\u52a8<\/h3>\n<div>\n<div>\n<pre class=\"prettyprint hljs bash\"><span class=\"hljs-built_in\">cd<\/span> harbor\/Deploy\/\ndocker-compose up <span class=\"hljs-_\">-d<\/span><\/pre>\n<\/div>\n<\/div>\n<p><img decoding=\"async\" class=\"alignCenter\" src=\"http:\/\/img1.tuicool.com\/FRBFNfM.png!web\" \/><\/p>\n<h3>3.5\u3001\u542f\u52a8\u540e\u76f8\u5173\u5bb9\u5668<\/h3>\n<h4>\u6b63\u5e38\u542f\u52a8\u6210\u529f\u540e\u4f1a\u6709 5 \u4e2a Contianer :<\/h4>\n<ul>\n<li>Proxy : \u7531Nginx \u670d\u52a1\u5668\u6784\u6210\u7684\u53cd\u5411\u4ee3\u7406<\/li>\n<li>Registry : \u7531Docker\u5b98\u65b9\u7684\u5f00\u6e90registry \u955c\u50cf\u6784\u6210\u7684\u5bb9\u5668\u5b9e\u4f8b<\/li>\n<li>UI : \u5373\u67b6\u6784\u4e2d\u7684core services, \u6784\u6210\u6b64\u5bb9\u5668\u7684\u4ee3\u7801\u662fHarbor\u9879\u76ee\u7684\u4e3b\u4f53<\/li>\n<li>Mysql : \u7531\u5b98\u65b9MySql\u955c\u50cf\u6784\u6210\u7684\u6570\u636e\u5e93\u5bb9\u5668<\/li>\n<li>Log : \u8fd0\u884c\u7740rsyslogd\u7684\u5bb9\u5668\uff0c\u901a\u8fc7log-driver\u7684\u5f62\u5f0f\u6536\u96c6\u5176\u4ed6\u5bb9\u5668\u7684\u65e5\u5fd7<\/li>\n<\/ul>\n<h4>\u8fd9\u51e0\u4e2a Contianer \u901a\u8fc7 Docker link \u7684\u5f62\u5f0f\u8fde\u63a5\u5728\u4e00\u8d77\uff0c\u5728\u5bb9\u5668\u4e4b\u95f4\u901a\u8fc7\u5bb9\u5668\u540d\u5b57\u4e92\u76f8\u8bbf\u95ee\u3002\u5bf9\u7ec8\u7aef\u7528\u6237\u800c\u8a00\uff0c\u53ea\u9700\u8981\u66b4\u9732 proxy\uff08\u5373Nginx\uff09\u7684\u670d\u52a1\u7aef\u53e3<\/h4>\n<p><img decoding=\"async\" class=\"alignCenter\" src=\"http:\/\/img2.tuicool.com\/JVB77j6.png!web\" \/><\/p>\n<h2>\u56db\u3001\u8bbf\u95ee Web UI \u5e76\u6d4b\u8bd5<\/h2>\n<h3>4.1\u3001\u4e3b\u9875<\/h3>\n<h4>\u9ed8\u8ba4\u7684\u8bbf\u95ee\u5730\u5740\u5373\u4e3a <code>harbor.cfg<\/code> \u4e2d <code>hostname<\/code> \u5730\u5740\uff0c\u76f4\u63a5\u8bbf\u95ee\u5373\u53ef\uff0c\u5982\u4e0b<\/h4>\n<p><img decoding=\"async\" class=\"alignCenter\" src=\"http:\/\/img1.tuicool.com\/2aeU3eM.png!web\" \/><\/p>\n<h4>\u5982\u679c <code>harbor.cfg<\/code> \u4e2d <code>self_registration<\/code> \u5c5e\u6027\u8bbe\u7f6e\u4e3a <code>off<\/code> \uff0c\u90a3\u4e48\u666e\u901a\u7528\u6237\u5c06\u65e0\u6cd5\u81ea\u5df1\u5b9e\u73b0\u6ce8\u518c\uff0c\u53ea\u80fd\u7531\u7ba1\u7406\u5458\u521b\u5efa\u7528\u6237\uff0c\u4e3b\u9875\u53f3\u4e0a\u89d2\u7684\u6ce8\u518c\u6309\u94ae\u4e5f\u4f1a\u6d88\u5931\u3002<\/h4>\n<h3>4.2\u3001\u767b\u5f55<\/h3>\n<h4>Harbor \u9ed8\u8ba4\u7ba1\u7406\u5458\u7528\u6237\u4e3a <code>admin<\/code> \uff0c\u5bc6\u7801\u5728 <code>harbor.cfg<\/code> \u4e2d\u8bbe\u7f6e\u8fc7\uff0c\u9ed8\u8ba4\u7684\u662f <code>Harbor12345<\/code> \uff0c\u53ef\u76f4\u63a5\u767b\u9646<\/h4>\n<p><img decoding=\"async\" class=\"alignCenter\" src=\"http:\/\/img2.tuicool.com\/uI7nMbv.png!web\" \/><\/p>\n<h3>4.3\u3001\u521b\u5efa\u79c1\u6709\u9879\u76ee<\/h3>\n<h4>Harbor \u6709\u4e00\u4e2a\u9879\u76ee\u7684\u6982\u5ff5\uff0c\u9879\u76ee\u540d\u53ef\u4ee5\u7406\u89e3\u4e3a Docker Hub \u7684\u7528\u6237\u540d\uff0c\u5176\u4e0b\u53ef\u4ee5\u540e\u5f88\u591a images\uff0cHarbor \u7684\u9879\u76ee\u5fc5\u987b\u767b\u5f55\u540e\u65b9\u53ef push\uff0c\u516c\u6709\u9879\u76ee\u548c\u79c1\u6709\u9879\u76ee\u7684\u533a\u522b\u662f\u5bf9\u5176\u4ed6\u7528\u6237\u662f\u5426\u53ef\u89c1<\/h4>\n<p><img decoding=\"async\" class=\"alignCenter\" src=\"http:\/\/img2.tuicool.com\/fiEraaV.png!web\" \/><\/p>\n<h3>4.4\u3001push \u955c\u50cf<\/h3>\n<h4>4.4.1\u3001\u8bbe\u7f6e http \u4ed3\u5e93\u5730\u5740<\/h4>\n<p>\u7531\u4e8e\u91c7\u7528\u4e86\u9ed8\u8ba4\u7684 http \u65b9\u5f0f\u8fde\u63a5\uff0c\u800c Docker \u8ba4\u4e3a\u8fd9\u662f\u4e0d\u5b89\u5168\u7684\uff0c\u6240\u4ee5\u5728 push \u4e4b\u524d\u9700\u8981\u8c03\u6574\u4e00\u4e0b docker \u914d\u7f6e\uff0c\u7f16\u8f91 <code>\/etc\/default\/docker<\/code> \u589e\u52a0\u5982\u4e0b\u5185\u5bb9<\/p>\n<div>\n<div>\n<pre class=\"prettyprint hljs ini\"><span class=\"hljs-attr\">DOCKER_OPTS<\/span>=<span class=\"hljs-string\">\"<\/span><span class=\"hljs-string\">$DOCKER_OPTS<\/span><span class=\"hljs-string\"> --insecure-registry 10.211.55.17\"<\/span><\/pre>\n<\/div>\n<\/div>\n<p>\u5176\u4e2d IP \u5730\u5740\u8981\u6307\u5411 <code>harbor.cfg<\/code> \u4e2d\u7684 <code>hostname<\/code> \uff0c\u7136\u540e\u6267\u884c <code>docker-compose stop<\/code> \u505c\u6389\u6240\u6709 Contianer\uff0c\u518d\u6267\u884c <code>service docker restart<\/code> \u91cd\u542f Dokcer \u670d\u52a1\uff0c\u6700\u540e\u6267\u884c <code>docker-compose start<\/code>\u5373\u53ef\u3002<\/p>\n<h4>\u6ce8\u610f : Docker \u670d\u52a1\u91cd\u542f\u540e\uff0c\u6267\u884c <code>docker-compose start<\/code> \u65f6\u6709\u4e00\u5b9a\u51e0\u7387\u51fa\u73b0\u5982\u4e0b\u9519\u8bef(\u6216\u8005\u76ee\u5f55\u5df2\u5b58\u5728\u7b49\u9519\u8bef)\uff0c\u6b64\u65f6\u5728 <code>docker-compose stop<\/code> \u4e00\u4e0b\u7136\u540e\u5728\u542f\u52a8\u5373\u53ef\uff0c\u5b9e\u5728\u4e0d\u884c\u518d\u6b21\u91cd\u542f Dokcer \u670d\u52a1\uff0c\u5343\u4e07\u4e0d\u8981\u624b\u8d31\u7684\u53bb\u5220\u6587\u4ef6(\u522b\u95ee\u6211\u600e\u4e48\u77e5\u9053\u7684)<\/h4>\n<p><img decoding=\"async\" class=\"alignCenter\" src=\"http:\/\/img0.tuicool.com\/INNzyiF.jpg!web\" \/><\/p>\n<h4>4.4.2\u3001Harbor \u9879\u76ee\u548c\u6743\u9650(\u89d2\u8272)<\/h4>\n<h4>\u7528\u6237\u672c\u8eab\u62e5\u6709\u7684\u9879\u76ee\uff0c\u767b\u9646\u540e\u53ef\u76f4\u63a5 push\uff0c\u5176\u4ed6\u7684\u7528\u6237\u521b\u5efa\u7684\u9879\u76ee\u53d6\u51b3\u4e8e\u9879\u76ee\u662f\u5426\u6dfb\u52a0\u4e86\u5bf9\u5e94\u7528\u6237\u548c\u6743\u9650\uff0c<\/h4>\n<h4>\u4e5f\u5c31\u662f\u8bf4\u7528\u6237\u662f\u5426\u53ef\u4ee5\u5411\u4e00\u4e2a\u9879\u76ee push \u955c\u50cf\uff0c\u53d6\u51b3\u4e8e\u6743\u9650(\u89d2\u8272)\u8bbe\u7f6e\uff0c\u5982\u4e0b\u6240\u793a\uff0c\u5728\u9879\u76ee\u4e2d\u53ef\u4ee5\u8bbe\u7f6e\u6210\u5458\u548c\u5176\u6743\u9650<\/h4>\n<p><img decoding=\"async\" class=\"alignCenter\" src=\"http:\/\/img0.tuicool.com\/iUremuN.png!web\" \/><\/p>\n<p><img decoding=\"async\" class=\"alignCenter\" src=\"http:\/\/img0.tuicool.com\/aMjYRbU.png!web\" \/><\/p>\n<h4>\u5bf9\u4e8e\u6743\u9650(\u89d2\u8272)\uff0c <code>Project Admin<\/code> \u548c <code>Developer<\/code> \u53ef\u4ee5\u6709 push \u7684\u6743\u9650\uff0c\u800c <code>Guest<\/code> \u53ea\u80fd\u67e5\u770b\u548c pull<\/h4>\n<h4>4.4.3\u3001push \u955c\u50cf<\/h4>\n<p>\u9996\u5148\u4f7f\u7528\u4e00\u4e2a\u5bf9\u76ee\u6807\u9879\u76ee\u5177\u6709 push \u6743\u9650\u7684\u7528\u6237\u767b\u5f55\uff0c\u4ee5\u4e0b push \u7684\u76ee\u6807\u662f mritd \u9879\u76ee\uff0ctest1 \u7528\u6237\u5728\u9879\u76ee\u91cc\u5b9a\u4e49\u4e3a <code>Developer<\/code> \uff0c\u6240\u4ee5\u767b\u5f55\u540e push \u5373\u53ef<\/p>\n<p><img decoding=\"async\" class=\"alignCenter\" src=\"http:\/\/img2.tuicool.com\/rQF3ayU.png!web\" \/><\/p>\n<p>\u7136\u540e <code>tag<\/code> \u4e00\u4e2a image\uff0c\u540d\u79f0\u4e00\u5b9a\u8981\u6807\u51c6( <code>registryAddress[:\u7aef\u53e3]\/\u9879\u76ee\/imageName[:tag]<\/code> )\uff0c\u6700\u540e\u5c06\u5176 push \u5373\u53ef<\/p>\n<p><img decoding=\"async\" class=\"alignCenter\" src=\"http:\/\/img1.tuicool.com\/3amU3yZ.png!web\" \/><\/p>\n<p>\u6700\u540e\u53ef\u5728 Web UI \u4e2d\u67e5\u770b\u521a\u521a push \u7684 image<\/p>\n<p><img decoding=\"async\" class=\"alignCenter\" src=\"http:\/\/img0.tuicool.com\/z6jQveV.png!web\" \/><\/p>\n<h4>\u5230\u6b64\u7ed3\u675f Thanks<\/h4>\n","protected":false},"excerpt":{"rendered":"<p>Project Harbor is an enterprise-class registry server, which extends the open source Docker Registry server by adding the functionality usually [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-108","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/blog.jsjs.org\/index.php?rest_route=\/wp\/v2\/posts\/108","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.jsjs.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.jsjs.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jsjs.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jsjs.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=108"}],"version-history":[{"count":0,"href":"https:\/\/blog.jsjs.org\/index.php?rest_route=\/wp\/v2\/posts\/108\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.jsjs.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=108"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jsjs.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=108"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jsjs.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=108"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}