mkdir ~/rpms
sudo yum update && yum install -y --downloadonly --downloaddir=${HOME}/rpms docker
ssh user@master01.airgapped.org mkdir packages
#You can verify the outcome by type
ssh user@master01.airgapped.org "pwd && ls"
scp ${HOME}/rpms/* user@master01.airgapped.org:~/packages
cd ~/packages
sudo rpm -ivh *
If you encoutner missing depandency error like
warning: audit-libs-python-2.7.6-3.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
error: Failed dependencies:
libyajl.so.2()(64bit) is needed by oci-systemd-hook-1:0.1.14-1.git1ba44c6.el7.x86_64
libyajl.so.2()(64bit) is needed by oci-umount-2:2.3.0-1.git51e7c50.el7.x86_64
libcgroup is needed by policycoreutils-python-2.5-17.1.el7.x86_64
On the localhost you can run
sudo yum update && yum reinstall -y --downloadonly --downloaddir=${HOME}/rpms missing-packages(like yajl libcgroup)
And redo the scp command for the missing rpms.
sudo groupadd docker
sudo usermod -aG docker $USER
You have to re-login to make current $USER group affect.
sudo setenforce 0
sudo sed 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config > /etc/selinux/config
Verify the whether selinux is disabled:
$ getenforce
Permissive
sudo systemctl enable docker && sudo systemctl start docker
--exec-opt native.cgroupdriver=systemdcat /usr/lib/systemd/system/docker.service
If not:
/usr/lib/systemd/system/docker.service file and add --exec-opt native.cgroupdriver=systemd to /usr/lib/systemd/system/docker.service's ExecStart strings.sudo systemctl reload-deamon docker && sudo systemctl restart docker
systemctl status docker
docker pull registry \
&& docker save docker.io/registry:latest -o docker-io.registry.tar
docker load -i docker-io.registry.tar
This procedure follows the example on Openssl certificate creation on k8s official document
On master01.airgapped.org :
sudo mkdir /usr/lib/certs -p
pushd /usr/lib/certs
sudo openssl genrsa -out ca.key 2048
sudo openssl req -x509 -new -nodes -key ca.key -subj "/CN=${MASTER_IP}" -days 10000 -out ca.crt
You can replace ${MASTER_IP} with your actual or persuade CA server ip address like
sudo openssl req -x509 -new -nodes -key ca.key -subj "/CN=8.8.8.8" -days 10000 -out ca.crt
sudo openssl genrsa -out private-registry-server.key 2048
cat > /tmp/private-registry-server.conf <<EOF
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn
[ dn ]
C = cn #replace with actual info
ST = Tianjin #replace with actual info
L = Tianjin #replace with actual info
O = Air Gaped Company #replace with actual info
OU = Air Gaped team #replace with actual info
CN = master01.airgapped.org #replace with actual registry server name
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = master01.airgapped.org #replace with alternative dns resolve name
DNS.2 = registry.airgapped.org #replace with alternative dns resolve name
IP.1 = 192.168.122.163 #replace with actuel ip for the registry server
[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=serverAuth,clientAuth
subjectAltName=@alt_names
EOF
sudo scp /tmp/private-registry-server.conf ./
sudo openssl req -new -key private-registry-server.key \
-out private-registry-server.csr \
-config private-registry-server.conf
sudo openssl x509 -req -in private-registry-server.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out private-registry-server.crt -days 10000 \
-extensions v3_ext -extfile private-registry-server.conf
openssl x509 -noout -text -in private-registry-server.crt
sudo mkdir /etc/docker/certs.d/registry.airgapped.org -p
sudo cp /usr/lib/certs/ca.crt /etc/docker/certs.d/registry.airgapped.org
sudo mkdir /mnt/docker_images
docker run -d --restart=always -v /mnt/docker_images:/var/lib/registry \
-v /usr/lib/certs:/cert \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/cert/private-registry-server.crt \
-e REGISTRY_HTTP_TLS_KEY=/cert/private-registry-server.key \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-p 443:443 --name local-registry registry
docker logs local-registry
You should see the following output like,with listening on [::]:443
time="2017-12-18T12:57:53Z" level=warning msg="No HTTP secret provided - generated random secret. This may cause problems with uploads if multiple registries are behind a load-balancer. To provide a shared secret, fill in http.secret in the configuration file or set the REGISTRY_HTTP_SECRET environment variable." go.version=go1.7.6 instance.id=df382424-0e5d-49ad-b758-2b7b3e92d32f version=v2.6.2
time="2017-12-18T12:57:53Z" level=info msg="redis not configured" go.version=go1.7.6 instance.id=df382424-0e5d-49ad-b758-2b7b3e92d32f version=v2.6.2
time="2017-12-18T12:57:53Z" level=info msg="Starting upload purge in 37m0s" go.version=go1.7.6 instance.id=df382424-0e5d-49ad-b758-2b7b3e92d32f version=v2.6.2
time="2017-12-18T12:57:54Z" level=info msg="using inmemory blob descriptor cache" go.version=go1.7.6 instance.id=df382424-0e5d-49ad-b758-2b7b3e92d32f version=v2.6.2
time="2017-12-18T12:57:54Z" level=info msg="listening on [::]:443, tls" go.version=go1.7.6 instance.id=df382424-0e5d-49ad-b758-2b7b3e92d32f version=v2.6.2
sudo sh -c 'echo "192.168.122.163 registry.airgapped.org" >> /etc/hosts'
If every thing is ok, you shall see the result by verifing the registry v2 API
curl --cacert /usr/lib/certs/ca.crt https://registry.airgapped.org/v2/_catalog
{"repositories":[]}
On master01.airgapped.org, At this point, you have:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/registry latest 177391bcf802 2 weeks ago 33.26 MB
Now you can verify the service by the following scripts:
3.3.1. Tag cached image with new registry path which leads to registry.airgapped.org
bash $ docker tag docker.io/registry:latest registry.airgapped.org/registry:latest $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry.airgapped.org/registry latest 177391bcf802 2 weeks ago 33.26 MB docker.io/registry latest 177391bcf802 2 weeks ago 33.26 MB
3.3.2. Push newly taged image to registry.airgapped.org
bash docker push registry.airgapped.org/registry
3.3.3. Remove cached image on local docker, newly tag registry.airgapped.org/registry:latest
bash docker rmi registry.airgapped.org/registry:latest $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/registry latest 177391bcf802 2 weeks ago 33.26 MB
3.3.4. Pull image registry from registry.airgapped.org
```bash
$ docker pull registry.airgapped.org/registry
Using default tag: latest
Trying to pull repository registry.airgapped.org/registry ...
latest: Pulling from registry.airgapped.org/registry
Digest: sha256:e82c444f6275eaca07889d471943668ac17fd03ea8d863289a54c199ed216332
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/registry latest 177391bcf802 2 weeks ago 33.26 MB
registry.airgapped.org/registry latest 177391bcf802 2 weeks ago 33.26 MB
```
Now, you have a working and verified private registry!
For securer docker access, you shall follow the instruction list on Restricting access.