Docker使用Go语言开发,基于Linux内核的cgroup、namespace以及AUFS等技术对进程进行封装隔离,是一种操做系统层面的虚拟化技术。因为隔离的进程独立于宿主和其它的隔离的进程,所以也称其为容器。html
Docker则使用宿主机内核提供的隔离机制建立沙盒环境,容器内的应用进程直接运行于宿主的内核。 由于容器内没有虚拟硬件和内核,容器在启动时间、执行效率、内存占用以及镜像大小等方面相对于传统虚拟机都拥有很大优点。linux
Docker容器将程序及其运行环境打包在一块儿,镜像建立后能够在任何安装了Docker的系统上运行,无需配置运行环境, 加之较小的镜像体积极大方便了协做开发和部署。nginx
使用Dockerfile将镜像构建过程透明化,也便于开发和运维人员理解程序的运行环境。git
Docker相对于虚拟机的优点来源于它运行与宿主内核而减小了开销,这使得Docker不能虚拟不一样的内核环境。也就是说咱们能够很容易地在Windows操做系统上启动一个Linux虚拟机,可是在Windows上启动一个基于Linux的Docker容器则是很困难的事情。redis
docker官方已经发布了docker for mac
及docker for windows
。目前docker for mac
使用MAC OS内核提供的HyperKit
虚拟化技术代替了docker-toolbox采用的使用Linux虚拟机提供支持的方式。docker
目录:json
cgroup和namespace是Linux内核提供的两种隔离机制,是Docker虚拟化的技术基础:ubuntu
/
及其下目录树在了解隔离机制以后咱们能够了解Docker中的两个核心概念:windows
/
,镜像就是容器的root文件系统。Docker采用服务端/客户端架构:centos
Docker采用UnionFS技术将镜像设计为分层结构,即一个镜像分为多层,每一层在上一层的基础上构建(即存储增量)。在容器中只能看到全部层叠加后的结果,隐藏了分层的结构。由于镜像层会被其它层依赖,为了保证下层能正常工做, 镜像层在建立后就没法进行修改。
Docker目前分为免费的社区版(CE)和付费的商业版(EE)两种, 这里咱们选用社区版。 Docker官网上提供了各类经常使用操做系统的安装说明:
下面看一个简单的示例:
finley@mbp:$ uname Darwin finley@mbp:$ docker run -it ubuntu root@528ab91753d6:/# uname Linux
在执行docker run
命令后发现咱们已经从宿主机Mac的终端进入到了Linux终端中。 这个运行中的"Linux"就是容器,启动这个虚拟的Linux环境所需的文件便是镜像。
上面的示例中咱们使用docker代替了ubuntu虚拟机,对比之下docker在镜像大小,启动时间和运行内存占用方面都具备巨大的优点。
由于启动docker容器的开销和启动相应进程的开销基本相同, 所以彻底可使用docker代替原生进程, 避免复杂的编译安装配置过程。
$ docker run -p 6379:6379 -d redis 3a5748eef653 $ redis-cli 127.0.0.1:6379> keys * (empty list or set)
这个示例中咱们一键安装并启动了redis-server。
在终端中输入docker
命令则会显示全部命令和使用帮助, 在docker命令后添加--help
选项能够查看该命令的帮助信息, 如docker run --help
能够查看run命令的帮助。
本节将简单介绍如何搜索和管理镜像, 为介绍容器作准备。更多关于镜像的构建和共享的内容将在下文中介绍。
docker images
命令用于显示本地全部镜像:
REPOSITORY | TAG | IMAGE ID | CREATED | SIZE |
---|---|---|---|---|
ubuntu | latest | 00fd29ccc6f1 | 3 weeks ago | 111MB |
redis | latest | 1e70071f4af4 | 4 weeks ago | 107MB |
和其它软件同样docker镜像也能够演进出不一样版本,tag用于标识镜像的版本。
repository表明同一镜像多个版本的集合, 它的值是一个URI用于全局惟一标识一组镜像,如"registry.cn-hangzhou.aliyuncs.com/acs/agent"。
对于DockerHub中的镜像则会省略仓库的地址,诸如dorowu/ubuntu-desktop-lxde-vnc
和ubuntu
就是DockerHub中的镜像。
因而可知,repository
和tag
能够惟一标识docker镜像。
除此以外每一个镜像还拥有一个摘要(DIGEST),docker images --digest
能够显示镜像的摘要。
DockerHub是docker官方提供的公有仓库,docker search
命令用于根据关键字搜索DockerHub中的镜像:
format: docker search TERM demo: docker search ubuntu
NAME | DESCRIPTION | STARS | OFFICIAL | AUTOMATED |
---|---|---|---|---|
ubuntu | Ubuntu is a ... | 7076 | [OK] | |
dorowu/ubuntu-desktop-lxde-vnc | Ubuntu with openssh-server and NoVNC | 156 | [OK] |
docker pull
命令用于从远程下载镜像,能够经过NAME:TAG
或NAME@DIGEST
的格式来指明目标镜像。
当只提供了镜像NAME时,默认下载tag为latest
的镜像。
$docker pull ubuntu $docker pull ubuntu:16.04 $docker pull ubuntu@sha256:fbaf303d18563e57a3c1a0005356ad102509b60884f3aa89ef9a90c0ea5d1212
NAME也能够是私有仓库中一个REPOSITORY的URI。
docker rmi
用于删除镜像,可使用IMAGE ID
或REPOSITORY:TAG
来标记一个容器。
docker run
命令用于新建一个容器并启动, 是最重要的和最经常使用的docker命令之一。
format: docker run IMAGE CMD ARGS
docker run
命令的标准执行流程包括:
CMD ARGS
参数指定的命令docker容器在命令执行完毕后会自动退出, 容器的生存周期仅决定于执行命令所需的时间。 若是在容器中执行bash
等长期运行的命令, 就能够保证容器长期运行。
docker run
命令默认会把标准输出流(stdout)重定向到终端,并与容器保持链接状态(attach)。
在attach状态下, 容器退出以前doceker run
命令不会返回,而是在终端回显容器的输出。 若发出kill
信号(如ctrl + c
快捷键)杀死docekr run
, 那么容器也会提早退出。
容器对文件系统的修改在可读写层,不会对镜像产生影响, 除非使用docker commit
建立新的镜像层。 容器退出后其文件系统仍将保存在磁盘中,下次启动后会保留全部修改。
打开终端
docker run
命令默认将容器的标准输出流重定向到终端, 可是没有将终端的标准输入流(stdin)重定向到容器。 也就是说,容器没法接收咱们在终端中输入的命令。
使用-i
或--interactive
选项会保持容器的输入流(stdin)打开,即便docker run
不与容器保持attach状态。
docker run -i ubuntu bash
命令能够打开一个ubuntu终端, 该终端也能够接受咱们输入的指令。
和标准的Linux系统同样,docker镜像也为用户指定了默认终端。 使用-t
或--tty
选项会打开一个虚拟终端(Pseudo-TTY)。
也就是说,docker run -it ubuntu
命令能够轻松地打开一个可交互ubuntu虚拟环境。
后台运行
docker run
命令默认与容器保持链接状态(attach), -d
或--detach
选项能够与容器断开链接。 docker run
命令在显示容器ID后当即返回,容器则会在后台运行。
上文redis-server的示例即便用了-d
选项, docker run
当即返回, redis-server在后台继续运行。
$ docker run -p 6379:6379 -d redis 3a5748eef653 $ redis-cli 127.0.0.1:6379>
端口映射
如上文中redis-server示例, 咱们常用docker容器提供服务,所以须要docker容器监听宿主机的某个端口。
docker run -p 6379:6379 -d redis
将对宿主机TCP6379端口的访问映射到容器的TCP6379端口。
-p 6379:6379/udp
则能够映射udp访问(虽然对redis-server来讲没有意义)。 多个-p
选项能够映射多个端口docker run -p 80:8080 -p 8080:8081 -d my_server
.
端口映射是将对宿主机某个端口的访问映射到容器的某个端口上, 容器访问宿主机端口不须要配置端口映射。
-v
选项能够将宿主机上某个目录挂载到容器中的某个目录
$ ls ~/myvol history.txt $ docker run -it -v ~/myvol:/app ubuntu root@e690c508219e:/# ls /app history.txt
上述指令将宿主机目录~/myvol
挂载到镜像的/app
目录下,/app
目录下原来的内容会被隐藏而是显示宿主机目录~/myvol
下的内容。
这种方式咱们称为在容器上挂载了数据卷,对数据卷的读写独立于容器以外:
若数据卷~/myvol
或挂载点/app
不存在的时候, docker会自动建立空目录。
docker提供了独立于容器的数据卷管理功能,参考docker volume。
为容器命名
每一个容器都拥有一个惟一的CONTAINER ID
来标识,但ID不便于记忆和使用。 所以在docker run
建立容器时可使用--name
选项来为容器指定一个名称。
在某个dockerd中容器名称是惟一的, 咱们可使用容器名来惟一指定容器。
示例:docker run --name my_ubuntu -it ubuntu
退出时自动删除
docker run --rm
选项会在容器退出时自动删除容器。 使用该命令时需谨慎, 容器一旦删除便不可恢复。
自定义工做目录
docker run -w PATH
选项会在启动容器时,使用PATH参数指定的路径做为工做目录。
docker create
命令与docker run
指令极为类似,区别在于docker run
建立容器后自动启动容器, 而docker create
不自动启动容器须要使用docker start
命令来启动。
docker ps
命令用于显示容器的信息,默认状况下显示运行中的容器:
finley@mbp $ docker ps
CONTAINER ID | IMAGE | COMMAND | CREATED | STATUS | PORTS | NAMES |
---|---|---|---|---|---|---|
3a5748eef653 | redis | "docker-entrypoint..." | 3 hours ago | Up 3 hours | 0.0.0.0:6379->6379/tcp | redis-server |
c10921921bfb | ubuntu | "/bin/bash" | 3 hours ago | Up 52 seconds | my_ubuntu |
-a
选项能够显示包括已中止容器在内的全部容器信息。
docker start
命令用于启动一个已中止的容器,默认状况下不与容器链接(attach)也不将输入重定向到容器。
$ docker run --name redis-server -p 6379:6379 redis $ docker stop redis-server # 此时已经存在一个名为redis-server的已中止容器 $ docker start redis-server redis-server $ redis-cli 127.0.0.1:6379>
若使用-a
或--attach
选项将docker start
与容器链接(attach), 终端将回显容器输出。
-i
或--interactive
选项则会将输入重定向到容器。
$ docker run --name my_ubuntu -it ubuntu root@c10921921bfb # exit # 此时已经存在一个名为my_ubuntu的已中止容器 $ docker start -ai my_ubuntu root@c10921921bfb:/#
docker exec
用于让一个正在运行的容器执行命令,命令执行完成后docker exec
将返回容器继续运行。
$ docker run --name my_ubuntu -d ubuntu $ docker exec my_ubuntu ls home bin ...
默认状况下docker exec
与容器链接,-d
或--detach
选项能够不与容器链接而在后台执行命令。
与docker run
命令相似, -i
选项用于将标准输入重定向到容器以便接收用户输入, -t
选项能够打开终端。
$docker exec -it my_ubuntu bash root@c10921921bfb:/#
docker attach
命令用于与容器链接, 即将容器输出流重定向到终端,终端输入流重定向到容器。
$ docker attach my_ubuntu # 再按一次回车 root@c10921921bfb:/#
当容器没有输出时终端中没有回显,可能令用户误觉得卡死。 attach以后再次输入回车, bash将回显命令行提示符。
attach状态下ctrl + c
快捷键会发送SIGKILL
信号停止容器, 而ctrl + p, ctrl + q
快捷键会退出attach容器继续运行。
docker stop
用于终止容器的运行
$docker stop redis-server
docker stop
命令会先发送SIGTERM
信号要求容器中的进程执行退出操做,若达到超时时间(默认10s)容器仍未退出则会发送SIGKILL
信号强制退出。
-t
或-time
选项能够秒为单位设置强制杀死以前的等待时间:
$docker stop -t 20 redis-server
docker kill
命令将直接向容器发送SIGKILL
命令中止容器:
$docker kill redis-server
-s
或--signal
选项能够向容器发送指定的信号:
docker kill -s SIGINT my_ubuntu
docker cp
命令负责在运行的容器和宿主机之间复制文件:
# format: docker cp FROM TO $ docker cp test.txt my_ubuntu:/root/test.txt $ docker cp my_ubuntu:/root/test.txt test.txt
docker rm
用于删除一个镜像,经过镜像ID或镜像名来指定要删除的镜像, 默认状况下只能删除已退出的镜像:
$ docker stop my_ubuntu $ docker rm my_ubuntu
-f
或--force
选项能够强制删除运行中的镜像。
-v
或--volumes
选项将删除全部挂载的数据卷。
docker volume
系列指令用于独立的管理数据卷, 请先阅读docker run:挂载数据卷
create
将宿主机上一个目录建立为数据卷:
# format: docker volume create PATH $ docker volume create myvol
ls
查看全部数据卷:
docker volume ls DRIVER VOLUME NAME local 0c28b79a9b3f local myvol
inspect
查看某个数据卷的详细信息:
docker volume inspect myvol [ { "CreatedAt": "2018-01-16T09:04:16Z", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/myvol/_data", "Name": "myvol", "Options": {}, "Scope": "local" } ]
rm
删除某个数据卷:
docker volume remove myvol myvol
prune
删除全部未被使用的数据卷:
docker volume prune WARNING! This will remove all volumes not used by at least one container. Are you sure you want to continue? [y/N] y Total reclaimed space: 0B
使用数据卷
docker run
和docker create
命令可使用-v
或--volume
选项来使用数据卷:
docker run -d -it -v myvol:/app ubuntu
docker会优先寻找数据卷列表中的myvol而不是当前目录下的myvol子目录。
若找不到myvol数据卷且当前目录下也不存在myvol子目录,docker会自动建立myvol数据卷不会再当前目录下建立子目录。
--mount
选项虽然语法复杂,可是能够配置更多选项:
docker run -it --mount source=my_volume,target=/app ubuntu
上文中已经介绍了如何获取和使用已有镜像,接下来介绍如何构建本身的镜像。
咱们能够将本身的程序及其运行环境打包成Docker容器,部署到服务器或者共享给其它开发者免去配置环境的烦恼。
前文已经提到过Docker镜像采用分层结构,容器运行时没法修改镜像的内容,而是在镜像层上挂载了一个可读写层。
docker diff
命令能够查看容器对镜像的修改:
$ docker run --name my_ubuntu -it ubuntu # if exists: docker start -ai my_ubuntu root@c10921921bfb:~# echo "Hello, from finley" > hello.txt root@c10921921bfb:~# exit ➜ ~ docker diff my_ubuntu C /root A /root/.bash_history A /root/hello.txt
咱们打开一个ubuntu容器在/root
目录中建立了hello.txt
文件, 并在其中写入"Hello, from finley"。
经过docker diff
能够看出这个操做产生了三个影响:
/root
, C表明变动工做目录.bash_history
文件改变, A表明文件或目录内容发生改变hello.txt
docker commit
命令根据容器对镜像的修改建立新的镜像层
# format: docker commit CONTAINER REPOSITORY[:TAG] $docker commit my_ubuntu my_ubuntu:2018_01_14 sha256:8096f47d8d6b80e52e617030938c7a83a9d50bafd73915d6952675e7126bb38a $docker images
REPOSITORY | TAG | IMAGE ID | CREATED | SIZE |
---|---|---|---|---|
my_ubuntu | 2018_01_14 | 8096f47d8d6b | Less than a second ago | 111MB |
-a
或--author
选项能够指定容器的做者, -m
或--message
能够添加备注信息:
$docker commit \ -a "finley<finley@finley.pw>" \ -m "say hello" \ my_ubuntu my_ubuntu:2018_01_14
-c
或--change
选项能够添加一系列Dockerfile指令,关于Dockerfile的内容咱们将在下文介绍。
docker tag
命令用于为镜像建立一个别名。
# format: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] $ docker tag ubuntu my_ubuntu
TARGET_IMAGE能够是私有仓库REPOSITORY的URI,tag命令常常被用来协助将镜像推送到私有仓库。
docker history
命令用于显示镜像各层的信息,即查看commit历史:
$ docker history ubuntu
docker commit
命令虽然能够很方便的建立新的镜像,可是咱们在容器内操做(特别是尝试性的操做)可能会在新镜像内产生无关的内容,如命令历史和日志等。
Dockerfile是控制镜像构建过程的脚本,使用Dockerfile能够有效避免镜像中包含无关内容。
Dockerfile中包含多行指令,每一个指令会在镜像中建立一层。
FROM nginx RUN echo '<h1>Hello from finley!</h1>' > /usr/share/nginx/html/index.html
$ docker build -t nginx_hello . Step 1/2 : FROM nginx ---> 3f8a4339aadd Step 2/2 : RUN echo '<h1>Hello from finley!</h1>' > /usr/share/nginx/html/index.html ---> Running in 2b3c5df09f9c ---> a918263d0f2f Removing intermediate container 2b3c5df09f9c Successfully built a918263d0f2f Successfully tagged nginx_hello:latest $ docker run --name nginx_hello -p 80:80 -d --rm nginx_hello $ curl localhost <h1>Hello from finley!</h1>
上面示例中咱们以nginx为基础构建了一个新镜像,并启动它提供服务。
在具体介绍Dockerfile的指令以前,咱们先介绍一下docker build
命令。
docker build
指令用于根据Dockerfile构建镜像,一般该指令须要一个PATH参数来指定某个目录作为构建上下文(context)。
-f
或--file
选项用于在构建上下文指定Dockerfile文件的路径, 默认为PATH/Dockerfile
。
-t
或--tag
选项用于为镜像指定标签,默认状况下名称仍然与基础镜像相同, 而-t NAME:TAG
则会指定容器的名称。
除了使用一个目录做为构建上下文以外,也可使用tar压缩包、git仓库做为上下文, 甚至从标准输入中读取Dockerfile或tar进行构建。
接下来介绍经常使用的Dockerfile命令:
FROM
FROM
指令用于指定构建容器的基础镜像,标记镜像的语法与docker pull
命令相同。
除了使用已存在的镜像做为基础镜像以外还有一个特殊的镜像scratch
, 它是一个空镜像。
咱们能够把静态编译的可执行文件放入空白镜像中,由内核直接执行能够极大的下降镜像的体积。
RUN
RUN
命令在镜像中建立一个容器并执行指定指令,执行结束后commit修改做为镜像的一层。
上文示例中的Step2展现了RUN
指令运行的过程:
echo '<h1>Hello from finley!</h1>' > /usr/share/nginx/html/index.html
RUN
命令有两种参数格式:
RUN ls -al
RUN ["ls", "-al"]
在实际执行过程当中命令行式指令会被映射为RUN ["sh", "-c", "ls", "-al"]
。
由于每一个RUN
指令都会生成一层镜像, 所以最好用&&
将多条指令链接而不是写多条RUN
指令。
COPY
COPY from to
指令将文件或目录从构建上下文(context)将文件复制到镜像内部。
COPY ./config.json /root/config.json
WORKDIR
WORKDIR path
命令用于指定容器的默认工做目录。
WORKDIR
命令对Dockerfile中的后续命令都有影响, 除非有另外一条WORKDIR
命令修改了工做目录
上文已经介绍过每条RUN
指令都会建立一个临时容器, 所以RUN cd PATH &&...
只对同一条RUN
中的后续指令有效。
USER
USER
命令用于指定容器中的当前用户:
RUN groupadd -r redis && useradd -r -g redis redis USER redis RUN redis-server
和WORKDIR
命令同样,USER
指令直到下一条USER
指令以前始终有效。
CMD
CMD
命令用于指定启动容器的指令, 和RUN
命令同样有两种格式。
EXPOSE
EXPOSE
命令用于声明须要暴露哪些接口,注意EXPOSE
命令没有创建端口映射, 须要在建立容器时启动端口映射。
ENV
ENV
命令用于为容器设置环境变量:
ENV DEBUG=on VERSION='1.0'
ENTRYPOINT
ENTRYPOINT
指令和CMD同样,用于指定启动容器的指令。 当指定了ENTRYPOINT以后,CMD命令的内容将被做为参数传递给ENTRYPOINT指定的指令。
首先建立一个容器:
FROM ubuntu CMD ls
$ docker build -t ls:v1 . $ docker run --rm ls:v1 bin boot dev etc home lib ...
若是咱们试图传递-al
选项给ls以显示更详细的信息:
$ docker docker run --rm ls -al container_linux.go:265: starting container process caused "exec: \"-al\": executable file not found in $PATH"
根据docker run
的语法咱们试图让ls
镜像执行-al
命令代替默认命令, 这固然行不通。
用ENTRYPOINT代替CMD:
FROM ubuntu ENTRYPOINT ["ls"]
从新建立:
$ docker build -t ls:v2 . $ docker run --rm ls:v2 -al total 72 drwxr-xr-x 1 root root 4096 Jan 14 13:29 . drwxr-xr-x 1 root root 4096 Jan 14 13:29 .. -rwxr-xr-x 1 root root 0 Jan 14 13:29 .dockerenv drwxr-xr-x 2 root root 4096 Dec 1 21:53 bin drwxr-xr-x 2 root root 4096 Apr 12 2016 boot drwxr-xr-x 5 root root 340 Jan 14 13:29 dev
ENTRYPOINT一般用于在执行容器CMD作一些准备工做, 好比官方redis镜像中:
FROM alpine:3.4 ... RUN addgroup -S redis && adduser -S -G redis redis ... ENTRYPOINT ["docker-entrypoint.sh"]
docker run --entrypoint CMD
能够用来更改容器的ENTRYPOINT。
如今咱们已经了解如何构造本身的镜像,接下来的问题是如何将镜像分享给其它开发者或者部署到服务器。
docker export
命令用于导出容器的快照, 默认输出到标准输出流,须要将输出重定向到文件进行保存。
# format: docker export CONTAINER > TAR $ docker export my_ubuntu > my_ubuntu.tar
或者使用-o
或--output
选项
$ docker export -o my_ubuntu.tar my_ubuntu
docker export
命令导出时会新建一个空白镜像而后将容器文件系统的内容写入,不包含容器基础镜像各层和tag等信息。
docker save
用于将镜像存储为tar压缩包,默认导出到标准输出流须要重定向以写入文件
# format: docker save IMAGE > TAR $ docker save ubuntu > ubuntu.tar
或者使用-o
或--output
选项
$ docker save -o ubuntu.tar ubuntu
docker save
命令会将镜像各层及其tag信息导出到文件。
docker import
命令用于导入tar格式的快照,生成的镜像只有一层不导入各层和tag信息。
$ docker import my_ubuntu.tar my_ubuntu:v2
该指令与docker export
相对用于导入容器镜像,但也能够导入docker save
生成的tar文件。
docker load
用于导入tar格式的镜像副本,导入时保留各层和tag等元数据, 所以不须要指定镜像名和tag。
默认从标准输入流导入:
$ cat ubuntu.tar | docker load
或者使用-i
或--input
选项:
docker load -i ubuntu.tar
docker load
命令与docker save
命令相对,由于缺乏元数据不能导入docker export
生成的tar文件。
虽然docker支持以文件的形式导入导出镜像,但这种方式对于共享镜像来讲仍十分不便。
Docker官方提供了一个registry镜像,咱们可使用它轻松搭建私有仓库。
$ mkdir registry $ docker run -d \ -p 5000:5000 \ -v registry:/var/lib/registry \ registry
-v
选项将./registry
目录挂载到了容器中,这个目录将用来实际存储镜像。
docker默认采用HTTPS方式推送和拉取镜像,本文再也不介绍如何为私有仓库配置HTTPS证书。
私有仓库能够配置权限认证,仅受权用户才能推送或拉取镜像,这里也再也不详细介绍权限认证相关功能。
docker push
命令用于将镜像推送到仓库,推送到的仓库由镜像的REPOSITORY属性决定。
$ docker tag ubuntu 127.0.0.1:5000/finley/my_ubuntu:v1 $ docker docker push 127.0.0.1:5000/finley/my_ubuntu:v1 The push refers to a repository [127.0.0.1:5000/finley/my_ubuntu] f17fc24fb8d0: Mounted from registry/my_ubuntu 6458f770d435: Mounted from registry/my_ubuntu 5a876f8f1a3d: Mounted from registry/my_ubuntu d2f8c05d353b: Mounted from registry/my_ubuntu 48e0baf45d4d: Mounted from registry/my_ubuntu v1: digest: sha256:f871d0805ee3ce1c52b0608108dbdf1b447a34d22d5c7278a3a9dd78fc12c663 size: 1357 $ curl 127.0.0.1:5000/v2/_catalog {"repositories":["registry/my_ubuntu"]}
首先,使用docker tag
命令给想要推送的镜像unbuntu:latest
建立一个别名127.0.0.1:5000/registry/my_ubuntu:v1
。
在这个URI中, 127.0.0.1:5000
是Registry的地址,finley
是私有仓库中的一个命名空间, my_ubuntu
是私有仓库中的一个REPOSITORY。
访问127.0.0.1:5000/v2/_catalog
来查看私有仓库中的镜像。