docker save load 与 docker export import
- 利用ssh pv Linux管道 实现镜像迁移(带进度条)
docker save <镜像名> | bzip2 | pv | ssh <用户名>@<主机名> 'cat |docker load'
- docker load 与 docker import区别
容器快照文件将丢失所有的历史数据和元数据信息(仅保存容器当时的快照状态)
从容器快照文件导入时可以重新指定标签等元数据信息。
镜像存储文件则将保存完整记录, 体积也要更大。
清除所有处于终止状态的容器
docker container prune
访问仓库
- 仓库(Repository)是集中存放镜像的地方。
- 一个容易混淆的概念是注册服务器(Registry)。
- Registry是管理仓库的具体服务器,每个Registry可以有多个Repository,每个Repository下面多个image。
- 仓库可以看成是一个具体的项目或目录。
- d1.dockerpool.com/ubuntu, d1.dockerpool.com是注册服务器地址,ubuntu是仓库名。
Docker Hub
- 需要先注册一个Docker账号
命令行登陆 退出
docker login docker logout
查找 拉取镜像
docker search docker pull
推送镜像
用户在登陆后 docker push 将自己的镜像推送到Docker Hub
自动创建
- 创建并登陆Docker Hub 以及目标网站
- 在目标网站中连接账户到Docker Hub
- 在Docker Hub中配置一个自动创建
- 选取一个目标网站中的项目(需要包含Dockerfile)和分支
- 指定Dockerfile位置, 并提交创建
私有仓库
容器运行
docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry
在私有仓库上传、搜索、下载镜像
docker tag 标记一个镜像,并推送到仓库。比如私有仓库地址为127.0.0.1:5000
格式: docker tag IMAGE[:TAG] [REGISTRY_HOST][:REGISTRY_PORT/]REPOSITORY[:TAG]
docker tag docker.io/mysql:5 127.0.0.1:5000/docker.io/mysql:5
docker push 上传标记的镜像
docker push 127.0.0.1:5000/docker.io/mysql
curl 查看仓库中的镜像
curl 127.0.0.1:5000/v2/_catalog
从私有仓库下载
需要先删除已有镜像 docker image rm 127.0.0.1:5000/docker.io/mysql:5 docker pull 127.0.0.1:5000/docker.io/mysql:5
注意事项
Docker默认不允许非HTTPS方式推送镜像,可以通过docker配置选项取消这个限制
对于upstar系统(Ubuntu 14.04 Debian7 Wheezy)
编辑/etc/default/docker,在其中的DOCKER_OPTS增加内容 DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com --insecure-registries=10.9.2.100:5000" sudo service docker restart
对于systemd系统(Ubuntu16.04+ Debian8+ centos7)
编辑/etc/docker/daemon.json (不存在则新建) { "registry-mirror": [ "https://registry.docker-cn.com" ], "insecure-registries": [ "122.112.207.157:5000" ] } systemctl restart docker
私有仓库高级配置
使用Docker Compose构建,搭建一个拥有权限认证、TLS的私有仓库
使用openssl自行签发docker.domain.com的站点的SSL证书
step1 创建 CA 密钥
openssl genrsa -out "root-ca.key" 4096
step2 利用私钥创建 CA 根证书请求文件
openssl req \ -new -key "root-ca.key" \ -out "root-ca.csr" -sha256 \ -subj '/C=CN/ST=Zhejiang/L=Hangzhou/O=eichong/CN=eichong Docker Registry CA'
-subj参数 /C 表示国家 如CN /ST 表示省 /L 表示城市或地区 /O 表示组织名 /CN 通用名称
step3 配置 CA 根证书,新建root-ca.cnf
[root_ca] basicConstraints = critical, CA:TRUE, pathlen:1 keyUsage = critical, nonRepudiation, cRLSign, keyCertSign subjectKeyIdentifier=hash
step4 签发根证书
openssl x509 -req -days 3650 -in "root-ca.csr" \ -signkey "root-ca.key" -sha256 -out "root-ca.crt" \ -extfile "root-ca.cnf" -extensions \ root_ca
step5 生成站点 SSL 私钥
openssl genrsa -out "docker.domain.com.key" 4096
step6 使用私钥生成证书请求文件
openssl req -new -key "docker.domain.com.key" -out "site.csr" -sha256 \ -subj '/C=CN/ST=Zhejiang/L=Hangzhou/O=eichong/CN=docker.domain.com'
step7 配置证书,新建 site.cnf 文件
[server] authorityKeyIdentifier=keyid, issuer basicConstraints = critical, CA:FALSE extendedKeyUsage=serverAuth keyUsage = critical, digitalSignature, keyEncipherment subjectAltName = DNS:docker.domain.com, IP:127.0.0.1 subjectKeyIdentifier=hash
step8 签署站点 SSL 证书
openssl x509 -req -days 750 -in "site.csr" -sha256 \ -CA "root-ca.crt" -CAkey "root-ca.key" -CAcreateserial \ -out "docker.domain.com.crt" -extfile "site.cnf" -extensions server
经过以上步骤,就拥有了docker.domain.com的网站SSL私钥 docker.domain.com.key 和 SSL证书 docker.domain.com.crt 新建ssl文件夹将 docker.domain.com.key docker.domain.com.crt 移入,其他删除
配置私有仓库
私有仓库默认的配置文件位于 /etc/docker/registry/config.yml ,我们先在本地编辑 config.yml ,之后挂载到容器中。
version: 0.1
log:
accesslog:
disabled: true
level: debug
formatter: text
fields:
service: registry
environment: staging
storage:
delete:
enabled: true
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
auth:
htpasswd:
realm: basic-realm
path: /etc/docker/registry/auth/nginx.htpasswd
http:
addr: :443
host: https://docker.domain.com
headers:
X-Content-Type-Options: [nosniff]
http2:
disabled: false
tls:
certificate: /etc/docker/registry/ssl/docker.domain.com.crt
key: /etc/docker/registry/ssl/docker.domain.com.key
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
生成 http 认证文件
mkdir auth docker run --rm \ --entrypoint htpasswd registry \ -Bbn username password > auth/nginx.htpasswd
- 编辑 docker-compose.yml
version: '3'
services:
registry:
image: registry
ports:
- "443:443"
volumes:
- ./:/etc/docker/registry
- registry-data:/var/lib/registry
volumes:
registry-data:
修改 hosts
编辑 /etc/hosts
docker.domain.com 127.0.0.1
启动
docker-compose up -d
测试私有仓库功能
登录到私有仓库
docker login docker.domain.com
尝试推送、拉取镜像
docker pull ubuntu:17.10 docker tag ubuntu:17.10 docker.domain.com/username/ubuntu:17.10 docker push docker.domain.com/username/ubuntu:17.10 docker image rm docker.domain.com/username/ubuntu:17.10 docker pull docker.domain.com/username/ubuntu:17.10
- 443端口若被占用,请尝试用Nginx代理