diff --git a/SUMMARY.md b/SUMMARY.md index d861043..890c073 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -48,7 +48,7 @@ * [删除](container/rm.md) * [访问仓库](repository/README.md) * [Docker Hub](repository/dockerhub.md) - * [私有仓库](repository/local_repo.md) + * [私有仓库](repository/registry.md) * [配置文件](repository/config.md) * [数据管理](data_management/README.md) * [数据卷](data_management/volume.md) diff --git a/basic_concept/container.md b/basic_concept/container.md index 4066110..f4f0b68 100644 --- a/basic_concept/container.md +++ b/basic_concept/container.md @@ -8,6 +8,6 @@ 容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。 -按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 [数据卷(Volume)](https://docs.docker.com/engine/tutorials/dockervolumes/)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。 +按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 [数据卷(Volume)](../data_management/volume.md)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。 数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器可以随意删除、重新 `run`,数据却不会丢失。 diff --git a/basic_concept/repository.md b/basic_concept/repository.md index 0ff5d0b..b938e89 100644 --- a/basic_concept/repository.md +++ b/basic_concept/repository.md @@ -16,13 +16,13 @@ Docker Registry 公开服务是开放给用户使用、允许用户管理镜像 最常使用的 Registry 公开服务是官方的 [Docker Hub](https://hub.docker.com/),这也是默认的 Registry,并拥有大量的高质量的官方镜像。除此以外,还有 [CoreOS](https://coreos.com/) 的 [Quay.io](https://quay.io/repository/),CoreOS 相关的镜像存储在这里;Google 的 [Google Container Registry](https://cloud.google.com/container-registry/),[Kubernetes](http://kubernetes.io/) 的镜像使用的就是这个服务。 -由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务(Registry Mirror),这些镜像服务被称为**加速器**。常见的有 [阿里云加速器](https://cr.console.aliyun.com/#/accelerator)、[DaoCloud 加速器](https://www.daocloud.io/mirror#accelerator-doc) 等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从官方网站下载速度会提高很多。在后面的章节中会有进一步如何配置加速器的讲解。 +由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务(Registry Mirror),这些镜像服务被称为**加速器**。常见的有 [阿里云加速器](https://cr.console.aliyun.com/#/accelerator)、[DaoCloud 加速器](https://www.daocloud.io/mirror#accelerator-doc) 等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从 Docker Hub 下载速度会提高很多。在 [安装 Dcoekr](../install/mirror.md) 一节中有详细的配置方法。 -国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 [时速云镜像仓库](https://hub.tenxcloud.com/)、[网易云镜像服务](https://c.163.com/hub#/m/library/)、[DaoCloud 镜像市场](https://hub.daocloud.io/)、[阿里云镜像库](https://cr.console.aliyun.com)等。 +国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 [时速云镜像仓库](https://hub.tenxcloud.com/)、[网易云镜像服务](https://c.163.com/hub#/m/library/)、[DaoCloud 镜像市场](https://hub.daocloud.io/)、[阿里云镜像库](https://cr.console.aliyun.com) 等。 ### 私有 Docker Registry -除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 [Docker Registry 镜像](https://hub.docker.com/_/registry/),可以直接使用做为私有 Registry 服务。在后续的相关章节中,会有进一步的搭建私有 Registry 服务的讲解。 +除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 [Docker Registry 镜像](https://hub.docker.com/_/registry/),可以直接使用做为私有 Registry 服务。在 [私有仓库](../repository/registry.md) 一节中,会有进一步的搭建私有 Registry 服务的讲解。 开源的 Docker Registry 镜像只提供了 [Docker Registry API](https://docs.docker.com/registry/spec/api/) 的服务端实现,足以支持 `docker` 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。在官方的商业化版本 [Docker Trusted Registry](https://docs.docker.com/datacenter/dtr/2.0/) 中,提供了这些高级功能。 diff --git a/container/rm.md b/container/rm.md index 6355d15..afa7004 100644 --- a/container/rm.md +++ b/container/rm.md @@ -1,17 +1,14 @@ ## 删除容器 -可以使用 `docker rm` 来删除一个处于终止状态的容器。 -例如 -``` +可以使用 `docker rm` 来删除一个处于终止状态的容器。例如 +```bash $ docker rm trusting_newton trusting_newton ``` 如果要删除一个运行中的容器,可以添加 `-f` 参数。Docker 会发送 `SIGKILL` 信号给容器。 - ## 清理所有处于终止状态的容器 -用 `docker ps -a` 命令可以查看所有已经创建的包括终止状态的容器,如果数量太多要一个个删除可能会很麻烦,用 `docker rm $(docker ps -a -q)` 可以全部清理掉。 -*注意:这个命令其实会试图删除所有的包括还在运行中的容器,不过就像上面提过的 `docker rm` 默认并不会删除运行中的容器。* +用 `docker ps -a` 命令可以查看所有已经创建的包括终止状态的容器,如果数量太多要一个个删除可能会很麻烦,用 `docker container prune` 可以清理掉所有处于终止状态的容器。 ## Docker 1.13+ diff --git a/image/build.md b/image/build.md index af402a3..ef4ff46 100644 --- a/image/build.md +++ b/image/build.md @@ -27,11 +27,9 @@ RUN echo '

Hello, Docker!

' > /usr/share/nginx/html/index.html 所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个 `nginx` 镜像的容器,再进行修改一样,基础镜像是必须指定的。而 `FROM` 就是指定**基础镜像**,因此一个 `Dockerfile` 中 `FROM` 是必备的指令,并且必须是第一条指令。 -在 [Docker Hub](https://hub.docker.com/explore/)[^1] 上有非常多的高质量的官方镜像, -有可以直接拿来使用的服务类的镜像,如 [`nginx`](https://hub.docker.com/_/nginx/)、[`redis`](https://hub.docker.com/_/redis/)、[`mongo`](https://hub.docker.com/_/mongo/)、[`mysql`](https://hub.docker.com/_/mysql/)、[`httpd`](https://hub.docker.com/_/httpd/)、[`php`](https://hub.docker.com/_/php/)、[`tomcat`](https://hub.docker.com/_/tomcat/) 等; -也有一些方便开发、构建、运行各种语言应用的镜像,如 [`node`](https://hub.docker.com/_/node/)、[`openjdk`](https://hub.docker.com/_/openjdk/)、[`python`](https://hub.docker.com/_/python/)、[`ruby`](https://hub.docker.com/_/ruby/)、[`golang`](https://hub.docker.com/_/golang/) 等。 -可以在其中寻找一个最符合我们最终目标的镜像为基础镜像进行定制。 -如果没有找到对应服务的镜像,官方镜像中还提供了一些更为基础的操作系统镜像,如 [`ubuntu`](https://hub.docker.com/_/ubuntu/)、[`debian`](https://hub.docker.com/_/debian/)、[`centos`](https://hub.docker.com/_/centos/)、[`fedora`](https://hub.docker.com/_/fedora/)、[`alpine`](https://hub.docker.com/_/alpine/) 等,这些操作系统的软件库为我们提供了更广阔的扩展空间。 +在 [Docker Store](https://store.docker.com) 上有非常多的高质量的官方镜像,有可以直接拿来使用的服务类的镜像,如 [`nginx`](https://store.docker.com/images/nginx/)、[`redis`](https://store.docker.com/images/redis/)、[`mongo`](https://store.docker.com/images/mongo/)、[`mysql`](https://store.docker.com/images/mysql/)、[`httpd`](https://store.docker.com/images/httpd/)、[`php`](https://store.docker.com/images/php/)、[`tomcat`](https://store.docker.com/images/tomcat/) 等;也有一些方便开发、构建、运行各种语言应用的镜像,如 [`node`](https://store.docker.com/images/node)、[`openjdk`](https://store.docker.com/images/openjdk/)、[`python`](https://store.docker.com/images/python/)、[`ruby`](https://store.docker.com/images/ruby/)、[`golang`](https://store.docker.com/images/golang/) 等。可以在其中寻找一个最符合我们最终目标的镜像为基础镜像进行定制。 + +如果没有找到对应服务的镜像,官方镜像中还提供了一些更为基础的操作系统镜像,如 [`ubuntu`](https://store.docker.com/images/ubuntu/)、[`debian`](https://store.docker.com/images/debian/)、[`centos`](https://store.docker.com/images/centos/)、[`fedora`](https://store.docker.com/images/fedora/)、[`alpine`](https://store.docker.com/images/alpine/) 等,这些操作系统的软件库为我们提供了更广阔的扩展空间。 除了选择现有镜像为基础镜像外,Docker 还存在一个特殊的镜像,名为 `scratch`。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。 @@ -221,8 +219,6 @@ $ docker build - < context.tar.gz 如果发现标准输入的文件格式是 `gzip`、`bzip2` 以及 `xz` 的话,将会使其为上下文压缩包,直接将其展开,将里面视为上下文,并开始构建。 -[^1]: [Docker Store](https://store.docker.com/)是发现公共Docker内容,镜像发布和发行软件的新地方 - # Docker 1.13+ 在 Docker 1.13+ 版本中推荐使用 docker image 来管理镜像。 diff --git a/image/commit.md b/image/commit.md index f99a7e3..378e6c8 100644 --- a/image/commit.md +++ b/image/commit.md @@ -125,4 +125,4 @@ docker run --name web2 -d -p 81:80 nginx:v2 此外,使用 `docker commit` 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为**黑箱镜像**,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体在操作的。虽然 `docker diff` 或许可以告诉得到一些线索,但是远远不到可以确保生成一致镜像的地步。这种黑箱镜像的维护工作是非常痛苦的。 -而且,回顾之前提及的镜像所使用的分层存储的概念,除当前层外,之前的每一层都是不会发生改变的,换句话说,任何修改的结果仅仅是在当前层进行标记、添加、修改,而不会改动上一层。如果使用 `docker commit` 制作镜像,以及后期修改的话,每一次修改都会让镜像更加臃肿一次,所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到™。这会让镜像更加臃肿。 +而且,回顾之前提及的镜像所使用的分层存储的概念,除当前层外,之前的每一层都是不会发生改变的,换句话说,任何修改的结果仅仅是在当前层进行标记、添加、修改,而不会改动上一层。如果使用 `docker commit` 制作镜像,以及后期修改的话,每一次修改都会让镜像更加臃肿一次,所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到。这会让镜像更加臃肿。 diff --git a/image/list.md b/image/list.md index 18ff19c..f3e5af7 100644 --- a/image/list.md +++ b/image/list.md @@ -28,6 +28,12 @@ ubuntu 14.04 1e0c3dd64ccd 4 weeks ago ```bash $ docker system df + +TYPE TOTAL ACTIVE SIZE RECLAIMABLE +Images 24 0 1.992GB 1.992GB (100%) +Containers 1 0 62.82MB 62.82MB (100%) +Local Volumes 9 0 652.2MB 652.2MB (100%) +Build Cache 0B 0B ``` ### 虚悬镜像 diff --git a/image/pull.md b/image/pull.md index 914c289..84c2ad0 100644 --- a/image/pull.md +++ b/image/pull.md @@ -10,8 +10,8 @@ docker pull [选项] [Docker Registry地址]<仓库名>:<标签> 具体的选项可以通过 `docker pull --help` 命令看到,这里我们说一下镜像名称的格式。 -* Docker Registry地址:地址的格式一般是 `<域名/IP>[:端口号]`。默认地址是 Docker Hub。 -* 仓库名:如之前所说,这里的仓库名是两段式名称,既 `<用户名>/<软件名>`。对于 Docker Hub,如果不给出用户名,则默认为 `library`,也就是官方镜像。 +* Docker Registry 地址:地址的格式一般是 `<域名/IP>[:端口号]`。默认地址是 Docker Hub。 +* 仓库名:如之前所说,这里的仓库名是两段式名称,即 `<用户名>/<软件名>`。对于 Docker Hub,如果不给出用户名,则默认为 `library`,也就是官方镜像。 比如: diff --git a/install/mac.md b/install/mac.md index 28bb05a..7f3ad5b 100644 --- a/install/mac.md +++ b/install/mac.md @@ -13,14 +13,14 @@ [Homebrew](http://brew.sh/) 的 [Cask](https://caskroom.github.io/) 已经支持 Docker for Mac,因此可以很方便的使用 Homebrew Cask 来进行安装: ```bash -brew cask install docker +$ brew cask install docker ``` #### 手动下载安装 如果需要手动下载,可以通过这个链接下载: -如同 macOS 其它软件一样,安装也非常简单,双击下载的 `.dmg` 文件,然后将那只叫 [Moby](https://blog.docker.com/2013/10/call-me-moby-dock/) 的鲸鱼图标拖拽到 `Application` 文件夹即可(其间可能会询问系统密码)。 +如同 macOS 其它软件一样,安装也非常简单,双击下载的 `.dmg` 文件,然后将那只叫 [Moby](https://blog.docker.com/2013/10/call-me-moby-dock/) 的鲸鱼图标拖拽到 `Application` 文件夹即可(其间需要输入用户密码)。 diff --git a/install/mirror.md b/install/mirror.md index f720b3e..f012ee8 100644 --- a/install/mirror.md +++ b/install/mirror.md @@ -2,7 +2,7 @@ 国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如: -* [Docker 官方提供的中国registry mirror](https://docs.docker.com/registry/recipes/mirror/#use-case-the-china-registry-mirror) +* [Docker 官方提供的中国 registry mirror](https://docs.docker.com/registry/recipes/mirror/#use-case-the-china-registry-mirror) * [阿里云加速器](https://cr.console.aliyun.com/#/accelerator) * [DaoCloud 加速器](https://www.daocloud.io/mirror#accelerator-doc) diff --git a/install/windows.md b/install/windows.md index db5db86..c894fee 100644 --- a/install/windows.md +++ b/install/windows.md @@ -6,13 +6,13 @@ Docker CE 支持 64 位版本的 Windows 10 Pro,且必须开启 Hyper-V。 ### 安装 -点击以下链接下载 [stable](https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exe) 或 [edge](https://download.docker.com/win/edge/Docker%20for%20Windows%20Installer.exe) 版本的 Docker CE。 +点击以下链接下载 [Stable](https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exe) 或 [Edge](https://download.docker.com/win/edge/Docker%20for%20Windows%20Installer.exe) 版本的 Docker CE。 下载好之后双击 Docker for Windows Installer.exe 开始安装。 ### 运行 -在 Windows 搜索栏 输入 Docker 点击 Docker for Windows 开始运行。 +在 Windows 搜索栏输入 Docker 点击 Docker for Windows 开始运行。 ![](_images/install-win-docker-app-search.png) diff --git a/introduction/what.md b/introduction/what.md index 739891c..f193155 100644 --- a/introduction/what.md +++ b/introduction/what.md @@ -1,6 +1,6 @@ ## 什么是 Docker -Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 [2013 年 3 月以 Apache 2.0 授权协议开源][docker-soft],主要项目代码在 [GitHub](https://github.com/moby/moby) 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 [开放容器联盟](https://www.opencontainers.org/)。 +Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 [2013 年 3 月以 Apache 2.0 授权协议开源][docker-soft],主要项目代码在 [GitHub](https://github.com/moby/moby) 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 [开放容器联盟(OCI)](https://www.opencontainers.org/)。 Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目已经超过 4 万 6 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,[dotCloud 公司决定改名为 Docker](https://blog.docker.com/2013/10/dotcloud-is-becoming-docker-inc/)。Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中广泛应用 Docker。 diff --git a/introduction/why.md b/introduction/why.md index 01f03e5..2c2a9ab 100644 --- a/introduction/why.md +++ b/introduction/why.md @@ -18,7 +18,7 @@ 对开发和运维([DevOps](https://zh.wikipedia.org/wiki/DevOps))人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。 -使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 [Dockerfile](https://docs.docker.com/engine/reference/builder/) 来进行镜像构建,并结合 [持续集成(Continuous Integration)](https://en.wikipedia.org/wiki/Continuous_integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 [持续部署(Continuous Delivery/Deployment)](https://en.wikipedia.org/wiki/Continuous_delivery) 系统进行自动部署。 +使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 [Dockerfile](../image/dockerfile/) 来进行镜像构建,并结合 [持续集成(Continuous Integration)](https://en.wikipedia.org/wiki/Continuous_integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 [持续部署(Continuous Delivery/Deployment)](https://en.wikipedia.org/wiki/Continuous_delivery) 系统进行自动部署。 而且使用 `Dockerfile` 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。 @@ -28,7 +28,7 @@ ### 更轻松的维护和扩展 -Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的[官方镜像](https://hub.docker.com/explore/),既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。 +Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 [官方镜像](https://hub.docker.com/explore/),既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。 ### 对比传统虚拟机总结 diff --git a/repository/dockerhub.md b/repository/dockerhub.md index ef8c3b3..6bd9ad8 100644 --- a/repository/dockerhub.md +++ b/repository/dockerhub.md @@ -1,7 +1,7 @@ ## Docker Hub 目前 Docker 官方维护了一个公共仓库 [Docker Hub](https://hub.docker.com/),其中已经包括了超过 15,000 的镜像。大部分需求,都可以通过在 Docker Hub 中直接下载镜像来实现。 ### 注册 -你可以在 https://hub.docker.com 免费注册一个 Docker 账号。 +你可以在 https://cloud.docker.com 免费注册一个 Docker 账号。 ### 登录 可以通过执行 `docker login` 命令交互式的输入用户名及密码来完成在命令行界面的登录。 登录成功后,本地用户目录的 `.dockercfg` 中将保存用户的认证信息。 diff --git a/repository/local_repo.md b/repository/local_repo.md deleted file mode 100644 index f0367f1..0000000 --- a/repository/local_repo.md +++ /dev/null @@ -1,114 +0,0 @@ -## 私有仓库 - -有时候使用 Docker Hub 这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人使用。 - -本节介绍如何使用本地仓库。 - -`docker-registry` 是官方提供的工具,可以用于构建私有的镜像仓库。 -### 安装运行 docker-registry -#### 容器运行 -在安装了 Docker 后,可以通过获取官方 registry 镜像来运行。 -```bash -$ docker run -d -p 5000:5000 registry -``` -这将使用官方的 registry 镜像来启动本地的私有仓库。 -用户可以通过指定参数来配置私有仓库位置,例如配置镜像存储到 Amazon S3 服务。 -```bash -$ docker run \ - -e SETTINGS_FLAVOR=s3 \ - -e AWS_BUCKET=acme-docker \ - -e STORAGE_PATH=/registry \ - -e AWS_KEY=AKIAHSHB43HS3J92MXZ \ - -e AWS_SECRET=xdDowwlK7TJajV1Y7EoOZrmuPEJlHYcNP2k4j49T \ - -e SEARCH_BACKEND=sqlalchemy \ - -p 5000:5000 \ - registry -```` -此外,还可以指定本地路径(如 `/home/user/registry-conf` )下的配置文件。 -```bash -$ docker run -d \ - -p 5000:5000 \ - -v /home/user/registry-conf:/registry-conf \ - -e DOCKER_REGISTRY_CONFIG=/registry-conf/config.yml \ - registry -``` -默认情况下,仓库会被创建在容器的 `/var/lib/registry `(v1 中是`/tmp/registry`)下。可以通过 `-v` 参数来将镜像文件存放在本地的指定路径。 -例如下面的例子将上传的镜像放到 `/opt/data/registry` 目录。 -```bash -$ docker run -d \ - -p 5000:5000 \ - -v /opt/data/registry:/var/lib/registry \ - registry -``` - -### 在私有仓库上传、下载、搜索镜像 -创建好私有仓库之后,就可以使用 `docker tag` 来标记一个镜像,然后推送它到仓库,别的机器上就可以下载下来了。例如私有仓库地址为 `192.168.7.26:5000`。 - -先在本机查看已有的镜像。 -```bash -$ docker images -REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE -ubuntu latest ba5877dc9bec 6 weeks ago 192.7 MB -ubuntu 14.04 ba5877dc9bec 6 weeks ago 192.7 MB -``` - -使用`docker tag` 将 `ba58` 这个镜像标记为 `192.168.7.26:5000/test`(格式为 `docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]`)。 -```bash -$ docker tag ba58 192.168.7.26:5000/test -root ~ # docker images -REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE -ubuntu 14.04 ba5877dc9bec 6 weeks ago 192.7 MB -ubuntu latest ba5877dc9bec 6 weeks ago 192.7 MB -192.168.7.26:5000/test latest ba5877dc9bec 6 weeks ago 192.7 MB -``` -使用 `docker push` 上传标记的镜像。 -```bash -$ docker push 192.168.7.26:5000/test -The push refers to a repository [192.168.7.26:5000/test] (len: 1) -Sending image list -Pushing repository 192.168.7.26:5000/test (1 tags) -Image 511136ea3c5a already pushed, skipping -Image 9bad880da3d2 already pushed, skipping -Image 25f11f5fb0cb already pushed, skipping -Image ebc34468f71d already pushed, skipping -Image 2318d26665ef already pushed, skipping -Image ba5877dc9bec already pushed, skipping -Pushing tag for rev [ba5877dc9bec] on {http://192.168.7.26:5000/v1/repositories/test/tags/latest} -``` -用 curl 查看仓库中的镜像。 -```bash -$ curl http://192.168.7.26:5000/v1/search -{"num_results": 7, "query": "", "results": [{"description": "", "name": "library/miaxis_j2ee"}, {"description": "", "name": "library/tomcat"}, {"description": "", "name": "library/ubuntu"}, {"description": "", "name": "library/ubuntu_office"}, {"description": "", "name": "library/desktop_ubu"}, {"description": "", "name": "dockerfile/ubuntu"}, {"description": "", "name": "library/test"}]} -``` -这里可以看到 `{"description": "", "name": "library/test"}`,表明镜像已经被成功上传了。 - -现在可以到另外一台机器去下载这个镜像。 -```bash -$ docker pull 192.168.7.26:5000/test -Pulling repository 192.168.7.26:5000/test -ba5877dc9bec: Download complete -511136ea3c5a: Download complete -9bad880da3d2: Download complete -25f11f5fb0cb: Download complete -ebc34468f71d: Download complete -2318d26665ef: Download complete -$ docker images -REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE -192.168.7.26:5000/test latest ba5877dc9bec 6 weeks ago 192.7 MB -``` - -可以使用 `docker-compose push` 批量上传本地的镜像到私有 Docker 仓库,这里以 `127.0.0.1:5000` 为例: - -编写 `docker-compose.yml` 文件 - -```yaml -version: "3.4" -services: - - ubuntu: - image: 127.0.0.1:5000/ubuntu:latest - centos: - image: 127.0.0.1:5000/centos:centos7 -``` - -在该文件路径下执行 `docker-compose push` 即可将上面的两个镜像上传到私有仓库中。 diff --git a/repository/registry.md b/repository/registry.md new file mode 100644 index 0000000..18f4c8b --- /dev/null +++ b/repository/registry.md @@ -0,0 +1,90 @@ +## 私有仓库 + +有时候使用 Docker Hub 这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人使用。 + +本节介绍如何使用本地仓库。 + +`docker-registry` 是官方提供的工具,可以用于构建私有的镜像仓库。本文内容基于 `docker-registry` v2。 + +### 安装运行 docker-registry + +#### 容器运行 + +你可以通过获取官方 `registry` 镜像来运行。 + +```bash +$ docker run -d -p 5000:5000 --restart=always --name registry registry +``` + +这将使用官方的 registry 镜像来启动本地的私有仓库。默认情况下,仓库会被创建在容器的 `/var/lib/registry ` 下。可以通过 `-v` 参数来将镜像文件存放在本地的指定路径。例如下面的例子将上传的镜像放到本地的 `/opt/data/registry` 目录。 + +```bash +$ docker run -d \ + -p 5000:5000 \ + -v /opt/data/registry:/var/lib/registry \ + registry +``` + +### 在私有仓库上传、搜索、下载镜像 + +创建好私有仓库之后,就可以使用 `docker tag` 来标记一个镜像,然后推送它到仓库。例如私有仓库地址为 `127.0.0.1:5000`。 + +先在本机查看已有的镜像。 + +```bash +$ docker images +REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE +ubuntu latest ba5877dc9bec 6 weeks ago 192.7 MB +``` + +使用 `docker tag` 将 `ubuntu:latest` 这个镜像标记为 `127.0.0.1:5000/ubuntu:latest`(格式为 `docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]`)。 + +```bash +$ docker tag ubuntu:latest 127.0.0.1:5000/ubuntu:latest +$ docker images +REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE +ubuntu latest ba5877dc9bec 6 weeks ago 192.7 MB +127.0.0.1:5000/ubuntu:latest latest ba5877dc9bec 6 weeks ago 192.7 MB +``` + +使用 `docker push` 上传标记的镜像。 + +```bash +$ docker push 127.0.0.1:5000/ubuntu:latest +The push refers to repository [127.0.0.1:5000/ubuntu] +373a30c24545: Pushed +a9148f5200b0: Pushed +cdd3de0940ab: Pushed +fc56279bbb33: Pushed +b38367233d37: Pushed +2aebd096e0e2: Pushed +latest: digest: sha256:fe4277621f10b5026266932ddf760f5a756d2facd505a94d2da12f4f52f71f5a size: 1568 +``` + +用 `curl` 查看仓库中的镜像。 + +```bash +$ curl 127.0.0.1:5000/v2/_catalog +{"repositories":["ubuntu"]} +``` + +这里可以看到 `{"repositories":["ubuntu"]}`,表明镜像已经被成功上传了。 + +先删除已有镜像,再尝试去下载这个镜像。 + +```bash +$ docker rmi 127.0.0.1:5000/ubuntu:latest + +$ docker pull 127.0.0.1:5000/ubuntu:latest +Pulling repository 127.0.0.1:5000/ubuntu:latest +ba5877dc9bec: Download complete +511136ea3c5a: Download complete +9bad880da3d2: Download complete +25f11f5fb0cb: Download complete +ebc34468f71d: Download complete +2318d26665ef: Download complete + +$ docker images +REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE +127.0.0.1:5000/ubuntu:latest latest ba5877dc9bec 6 weeks ago 192.7 MB +```