docker 仓库

Posted fyy-hhzzj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker 仓库相关的知识,希望对你有一定的参考价值。

 

【Nexus】用nexus3.5搭建docker私有仓库
 一、安装环境

# cat /etc/redhat-release

CentOS Linux release 7.3.1611 (Core)

# ifconfig

ens33: flags=4163mtu 1500
inet 192.168.1.104  netmask 255.255.255.0  broadcast 192.168.1.255


二、安装nexus

# rpm -e --nodeps $(rpm -qa | grep -i openjdk)   

#  wget   https://sonatype-download.global.ssl.fastly.net/nexus/3/nexus-3.5.0-02-unix.tar.gz

#  tar  zxvf nexus-3.5.0-02-unix.tar.gz      -C     /opt

# tar   zxvf  jdk-8u131-linux-x64.tar.gz     -C     /opt

# ls   /opt/

nexus-3.5.0-02    sonatype-work     jdk8u_131

# groupadd  -g 2017  cmp 

# useradd  -u 2017 -g  2017 cmp

#  ln -s /opt/jdk1.8.0_131/bin/java  /usr/bin/java 

# echo "JAVA_HOME=/opt/jdk1.8.0_131"   >>  /etc/environment 

#  source  /etc/environment  

# echo "export PATH=$JAVA_HOME/bin:$PATH" >> /home/cmp/.bash_profile 

# source  /home/cmp/.bash_profile

# java -version
 技术分享图片

# vim /opt/nexus-3.5.0-02/bin/nexus.rc

run_as_user="cmp"

技术分享图片

# vim /opt/nexus-3.5.0-02/bin/nexus 

INSTALL4J_JAVA_HOME="/opt/jdk1.8.0_131"

技术分享图片

 

# vim /etc/systemd/system/nexus.service 

########################

[Unit]

Description=nexus service
After=network.target

[Service]
Type=forking
LimitNOFILE=65536 
ExecStart=/opt/nexus-3.5.0-02/bin/nexus start
ExecStop=/opt/nexus-3.5.0-02/bin/nexus stop
User=cmp
Restart=on-abort

[Install]
WantedBy=multi-user.target

#####################################

# chown  -R  cmp:cmp  /opt/nexus-3.5.0-02 
# chown  -R  cmp:cmp  /opt/sonatype-work 

#  systemctl  daemon-reload
#  systemctl  start nexus.service
#  ss  -tan  | grep 8081


# cd /opt/nexus-3.5.0-02/etc/ssl 

#  keytool
-genkeypair
-keystore nexus.jks 
-alias cmp_nexus 
-keypass nexuspasswd123# 
-storepass nexuspasswd123# 
-keyalg RSA
-keysize 2048
-validity 5000
-dname "CN=*.huawei.com,OU=CMP,O=Huawei,L=ShenZhen,ST=GuangDong,C=CN"
-ext "SAN=IP:192.168.1.104"  
-ext "BC=ca:true"

###########################################

NEXUS_IP_ADDRESS=xx.xx.xx.xx        //nexus服务器的IP
NEXUS_DOMAIN=xxx                        //nexus服务器IP对应的域名,如 nexus.abc.com, 没有可不写

keytool  
-genkeypair
-keystore nexus.jks
-storepass 123456
-keypass 123456
-alias nexus
-keyalg RSA
-keysize 2048
-validity 5000
-dname "CN=${NEXUS_DOMAIN},OU=Example,O=Sonatype,L=Unspecified,ST=Unspecified,C=US"
-ext "SAN=DNS:${NEXUS_DOMAIN},IP:${NEXUS_IP_ADDRESS}"
-ext "BC=ca:true"

##############################################

#  ls
nexus.jks

# chown  -R  cmp:cmp  /opt/nexus-3.5.0-02 
# chown  -R  cmp:cmp  /opt/sonatype-work 


#  find  /opt/nexus-3.5.0-02/etc/*   -type d  -exec   chmod 700 {} ;
#  find  /opt/nexus-3.5.0-02/etc/    -type  f   -exec   chmod 600 {} ;

 

#   vim /opt/sonatype-work/nexus3/etc/nexus.properties 

nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-requestlog.xml,${jetty.etc}/jetty-https.xml

application-port-ssl=8443

技术分享图片

如果想要设置重定向 redirect  http request  to  http requests (可选)
那么在上面设置的基础上,再添加一个配置:
########################
nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-requestlog.xml,${jetty.etc}/jetty-https.xml,${jetty.etc}/jetty-http-redirect-to-https.xml

application-port-ssl=8443
#########################

技术分享图片


# application-host=0.0.0.0  默认监听所有IP
如果想要端口监听绑定特定IP:
application-host=xx.xx.xx.xx

# vim /opt/nexus-3.5.0-02/etc/jetty/jetty-https.xml

技术分享图片

注:此处跟上面用keytool生成nexus.jks相关

如果定期修改秘钥文件 nexus.jks:
1.用keytool工具用新密码重新生成nexus.jks,此处配置文件相应修改
2.如果使用root用户生成,注意将数主 数组 chown 为相应的nexus运行用户
3.默认生成的nexus.jks文件权限为644,安全起见,请将nexus.jks文件权限 chmod 为 600 

# systemctl  restart  nexus 

# systemctl  status  nexus

# systemctl  enable  nexus

技术分享图片
 

# ss  -tan | grep 8081
# ss  -tan | grep 8443

浏览器访问  http://192.168.1.104:8081
浏览器访问  https://192.168.1.104:8443

注意:
如果设置启用了重定向,那么nexus server只会监听 8081端口,但是访问 http://192.168.1.104:8081会被重定向到
https://192.168.1.104:8443 ,所以设置防火墙策略时也要开放8443端口。

如果没有设置启用重定向,那么 nexus server 会同时监听 8081 和8443 端口。


三、创建仓库
1.访问 https://192.168.1.104:8443  

技术分享图片


2.登录
用户名:admin
密码:admin123 

 

技术分享图片

登录后需要按 F5 手动刷新页面

3.创建一个docker仓库

 

技术分享图片
 

 

 

技术分享图片
 

 

技术分享图片
 

 

 

技术分享图片
 
 
技术分享图片
 


4.创建对接账号

创建一个role,role是一个权限的集合,可以将其授予某个用户

技术分享图片
 

技术分享图片


 

 

技术分享图片
 

创建用户,选择授予的role权限集合

技术分享图片


现在我们成功创建了一个docker仓库
dokcer仓库名称:cmp
dokcer仓库地址:192.168.1.104:10086
登录用户:
admin/admin123
cmpdokcer/123456 

四、修改密码
1.修改admin的密码

 

技术分享图片
 

 

技术分享图片


2.修改cmpdocker的密码
用admin 登录,然后修改 

技术分享图片



五、安全加固
1. nexus监听端口绑定特定IP

 # vim /opt/sonatype-work/nexus3/etc/nexus.properties 
 
 application-host=192.168.1.103

技术分享图片



2.自定义防火墙策略

# touch iptables.rules
# cat iptables.rules

#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#

# Generated by iptables-save v1.4.21 on Fri Sep  8 00:07:19 2017
*raw
:PREROUTING ACCEPT  [594:196067]
:OUTPUT     ACCEPT  [503:260590]
COMMIT
# Completed on Fri Sep  8 00:07:19 2017
 
# Generated by iptables-save v1.4.21 on Fri Sep  8 00:06:38 2017
*mangle
:PREROUTING   ACCEPT   [661:205439]
:INPUT        ACCEPT   [661:205439]
:FORWARD      ACCEPT   [0:0]
:OUTPUT       ACCEPT   [554:272157]
:POSTROUTING  ACCEPT   [554:272157]
COMMIT
# Completed on Fri Sep  8 00:06:38 2017
 
# Generated by iptables-save v1.4.21 on Fri Sep  8 00:08:32 2017
*filter
:INPUT    DROP  [0:0]
:FORWARD  ACCEPT  [0:0]
:OUTPUT   ACCEPT  [1220:447081]
-A INPUT -p tcp -m tcp --dport  22     -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport  8443   -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -p tcp -m tcp --dport  10086  -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
COMMIT
# Completed on Fri Sep  8 00:08:32 2017
 
*nat
:PREROUTING   ACCEPT  [192:12171]
:INPUT        ACCEPT  [0:0]
:OUTPUT       ACCEPT  [88:5529]
:POSTROUTING  ACCEPT  [88:5529]
COMMIT
# Completed on Fri Sep  8 00:09:06 2017
 
 
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#


我们不需要设置为永久策略,设置为开机加载我们得默认策略就OK了。
那么我们需要定义一个系统服务 iptables-rules ,设为开机自启,加载我们的默认防火墙策略。

我们需要编写一个iptables的service文件:

 # touch iptables-rules.service  

 # cat iptables-rules.service 

 #######################################
 [Unit]

Description=iptables rules
 
[Service]
ExecStart=/usr/sbin/iptables-restore  /etc/iptables.rules
After=network.target
 
[Install]
WantedBy=multi-user.target
 

#######################################

# mv  iptables.rules   /etc
# mv  iptables-rules.service  /etc/systemd/system
 
# systemctl  start     iptables-rules.service
# systemctl  enable  iptables-rules.service

加固效果:

# ss  -tan
# iptables  -nvL  --line 

技术分享图片


技术分享图片


安全加固后的nexus服务器8081端口被封了,所以 http://192.168.1.104:8081 无法访问,要访问走 https://192.168.1.104:8443


六、获取公钥及刷新信任列表

说明:命令中端口请输入上面Create Repository步骤配置的https端口(举例中是10086,请按实际输入)

#  source  /home/cmp/.bash_profile

# keytool -printcert -sslserver  192.168.1.104:10086   -rfc  >/etc/pki/ca-trust/source/anchors/nexus.crt

# update-ca-trust


注意:如果nexus服务器有 inside_ip 和 outside_ip,做了NAT,用keytool 生成nexus.jks应该是用outside_ip,不然其他有拉取需要的主机无法正确获取nexus.crt。

在有拉取需要的主机:
方法一:
# scp   镜像库IP:/etc/pki/ca-trust/source/anchors/nexus.crt   /etc/pki/ca-trust/source/anchors
# update-ca-trust

方法二: 
keytool -printcert -sslserver  192.168.1.104:10086   -rfc  >/etc/pki/ca-trust/source/anchors/nexus.crt 
 
# update-ca-trust
 
测试: 

# curl  https://192.168.1.104:8443    无需使用 -k  参数
 
curl -k https://ip:port
-k insecure SSL , will not check the cert
允许不使用证书到SSL站点 

登录方式

交互式
# docker  login 192.168.1.104:10086
username:
password:

技术分享图片
 

非交互式
# docker login   xx.xx.xx.xx:xx -u "XXX"  -p "XXX"
# echo "XXX" | docker login xx.xx.xx.xx:xx   --username "XXX"  --password-stdin

技术分享图片

七、关于dokcer节点获取公钥后的免验证登录问题
 
# docker  login 192.168.1.104:10086

根据提示,输入用户名和密码即可。
如果登录成功,会在/root/.docker/config.json文件中保存账户信息。
这个文件类似sshd的 /root/.ssh/known_hosts 
如果测试环境同一台nexus服务器重装了,那么相应的docker节点要先清除 /root/.docker/config.json后重新获取新的公钥,再登录,否则会报错!

Error response from daemon: 
Get https://192.168.1.104:10086/v1/users/:x509: certificate signed by unknown authority
 

1技术分享图片


#  rm -rf   /root/.docker/config.json
# systemctl restart dokcer
# scp   镜像库IP:/etc/pki/ca-trust/source/anchors/nexus.crt     /etc/pki/ca-trust/source/anchors
# update-ca-trust
 

八、在dokcer节点向nexus上传和从下载docker镜像 

admin 有上传和下载权限
cmpdocker 只有下载权限 

# docker         login           192.168.1.104:10086
# docker  tag  redis:3.2.5   192.168.1.104:10086/redis:v1
#  docker        push            192.168.1.104:10086/redis:v1
#  docker         rmi              192.168.1.104:10086/redis:v1
# docker          pull              192.168.1.104:10086/redis:v1
 
技术分享图片
       

 

技术分享图片


九、nexus的卸载

cat  nexus_uninstall.sh
############################

#!/bin/bash

echo "INFO:starting to uninstall nexus."

systemctl stop nexus.service

systemctl disable nexus.service

systemctl disable iptables-rules.service

# jdk的删除根据具体情况,如果没有其他程序使用,可以删除
rm -rf /opt/jdk1.8.0_131
sed -i  ‘/JAVA_HOME/s/JAVA_HOME=/opt/jdk1.8.0_131//g‘  /etc/environment 
source  /etc/environment 

rm -rf /usr/bin/java

rm -rf /opt/nexus-3.5.0-02

rm -rf /opt/sonatype-work

rm -rf /etc/iptables.rules

rm -rf /etc/systemd/system/nexus.service

rm -rf /etc/systemd/system/iptables-rules.service

rm -rf /etc/pki/ca-trust/source/anchors/nexus.crt
update-ca-trust 

userdel -r cmp

echo "INFO:nexus uninstallation OK!"

echo "INFO:please exit the current shell and login again!" 

#####################################


参考文档:
https://www.sonatype.org
http://www.eclipse.org/jetty/documentation/9.3.x/configuring-ssl.html
https://docs.docker.com/engine/reference/commandline/login 
https://docs.docker.com/engine/reference/commandline/login/#parent-command
https://github.com/codeclou/docker-sonatype-nexus-repository-oss
http://blog.codecp.org/2016/05/23/Nexus%20oss%203.0%20%E6%9E%84%E5%BB%BAdocker%E4%BB%93%E5%BA%93
https://docs.docker.com/registry/insecure/#docker-still-complains-about-the-certificate-when-using-authentication










































































































































































































































































以上是关于docker 仓库的主要内容,如果未能解决你的问题,请参考以下文章

搭建docker私有镜像仓库

三、docker远程仓库地址设置为Nexus

docker 私有仓库搭建以及用户认证

docker拉取自建http镜像仓库

docker--docker仓库

docker仓库