linux之Docker容器服务简介镜像.搭建本地 Registry

1.docker服务

Dock常用命令

docker-machine active显示当前的活动主机

docker-machine config显示连接主机的配置

docker-machine create创建一个主机

docker-machine env设置当前的环境与哪个主机通信

docker-machine inspect查看主机的详细信息

docker-machine ip查看主机的IP

docker-machine kill强制关闭一个主机

docker-machine ls 查看所有的主机信息

docker-machine provision重新配置现在主机

docker-machine regenerate-certs为主机重新生成证书

docker-machine restart重启主机

docker-machine rm删除主机

docker-machine sshSSH的方式连接到主机上

docker-machine scp远程复制

docker-machine status查看主机的状态

docker-machine stop停止一个正在运行的主机

docker-machine upgrade升级主机的docker服务到最新版本

docker-machine version查看docker-machine版本

容器简介

Docker是容器引擎 用来管理容器的生命周期

容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。

 

容器vs虚拟机

 

 

 

 

容器与虚拟化管理程序 (hypervisor virtualization,HV)有所不同,虚拟化管理程序通过中间层将一台或者多台独立的机器虚拟运行于物理硬件之上,而容器则是直接运行在操作系统内核之上的用户空间

因此,容器虚拟化也被称为“操作系统级虚拟化”容器技术可以让多个独立的用户空间运行在同一台宿主机上。

Docker概念 作用 架构

Docker是一个用于开发、发布和运行应用程序的开放平台。能够将应用程序与基础设施分离,以便快速交付软件。

Docker使用Google公司推出的Go语言进行开发实现,基于Linux内核的cgroup,namespace,以及AUFS类的UnionFS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。 由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。Docker最初实现是基于LXC。

 

Docker作用

快速、一致地交付应用程序

弹性伸缩,快速扩展

在相同的硬件上运行更多的工作负载

 

Docker架构

    

 

 

 

 

Docker基本概念

Docker daemon

Docker守护进程(dockerd)侦听Docker API请求,并管理Docker对象,如镜像、容器、网络和卷。

Docker client

Docker客户端(Docker)是许多Docker用户与Docker交互的主要方式。当使用诸如docker run之类的命令时,客户端将这些命令发送给dockerd, dockerd将执行这些命令。

Image

镜像文件是一个只读模板,带有创建Docker容器的指令。通常,一个镜像是基于另一个镜像的,还需要进行一些额外的定制。例如,您可以构建一个基于ubuntu镜像的镜像,安装Apache web服务器和其他应用程序,以及应用程序运行所需的配置细节。

 

可以创建自己的镜像,也可以只使用其他人创建并发布在镜像仓库中的镜像。

构建自己的镜像,需要创建一个Dockerfile,该文件具有简单的语法,用于定义创建镜像并运行镜像所需的步骤。Dockerfile中的每条指令都在镜像中创建一个层。当更改Dockerfile并重新构建镜像时,只会重新构建那些已更改的层。与其他虚拟化技术相比,这是镜像如此轻量级、小巧和快速的部分原因。

    

 

 

 

 

Container

容器是镜像的运行实例。使用Docker API或CLI创建、启动、停止或删除容器。可以将容器连接到一个或多个网络,将存储附加到其中,也可以根据其当前状态创建一个新镜像。

Registry

Docker镜像仓库存储Docker镜像。Docker Hub是任何人都可以使用的公共镜像仓库,默认情况下,Docker被配置为在Docker Hub上查找镜像。也可以搭建私有镜像仓库。

2.安装docker

 

安装前准备 配置yum源

yum install -y  yum-utils  device-mapper-persistent-data  lvm2

  

yum-config-manager  --add-repo \

https://download.docker.com/linux/centos/docker-ce.repo

 

 

 

 

 

 yum clean all

 yum makecache

 

 

 

 

安装docker

yum install -y docker-ce

启动docker并测试是否正常

systemctl start docker启动docker

systemctl enable docker

 

docker run hello-world测试docker安装是否正常

 

 

 

 

查看镜像

 

 

 

 

设置docker镜像加速

 

 

 

 

https://cr.console.aliyun.com/cn-qingdao/instances/repositories

 

{

  "registry-mirrors": ["https://jo2iwt8h.mirror.aliyuncs.com"]

}

 

 

systemctl daemon-reload

systemctl restart docker

 

 

 

 

 

 

 

3.docker镜像常用命令

1.镜像搜索(docker hub)

docker search centos

 

 

 

 

 

2.下载镜像pull

 

docker pull centos

 

 

 

 

 

3.查看已经下载的镜像 images

docker images

 

 

 

 

 

4.删除镜像 rmi

docker rmi centos

 

docker images

 

 

 

 

 

5.打包镜像 save -o

docker save -o 保存的文件名 镜像名

docker save -o centos.tar centos

 

 

 

 

 

6.加载 load -i镜像(可以在任何装 docker 的地方加载刚保存的镜像)

docker images

docker load -i   镜像文件名

docker load -i   centos.tar

 

 

 

 

 

7.镜像历史信息 history

docker history [参数] 镜像名

docker history  centos

 

 

 

 

 

8.镜像详细信息 image inspect

docker image inspect [参数] 镜像

docker image inspect  centos

 

 

 

 

 

 

 

9.镜像 管理 示意图

 

 

 

 

 

 

4.docker容器相关命令

1.创建容器并启动  run -it

docker run -it centos启动完成,进入容器中

 

 

 

 

-i 表示以“交互模式”运行容器

-t 表示容器启动后会进入其命令行

加入这两个参数后,容器创建就能登录进去,即分配一个伪终端。

 

 

2.ps查看运行中的容器

docker ps

或者

docker container ls

查看运行中的容器,发现列表为空,原因是容器在执行完成命令后会自动退出

 

 

 

 

3.ps -a查看所用 容器,并显示了容器的状态

docker ps -a

或者

docker container ls -a

查看所用容器,并显示了容器的状态

 

 

 

 

 

 

 

4.容器创建

docker create [选项] 镜像名[容器执行命令][需要提供的参数]

常用选项说明:

-i 示以“交互模式”运行容器

-t 表示容器启动后会进入其命令行

--name 为创建的容器命名

 

docker run -it --name centos7 centos

docker ps -a

 

 

 

 

 

docker create -it --name ubuntu ubuntu

 

 

 

 

docker create -it --name  hello-world hello-world

 

 

5.容器启动

docker start [选项] 容器[容器..]

常用选项:

-a 将当前的输入/输出连接到容器

-i 将当前的输入连接到容器上

docker start ubuntu

 

 

 

 

 

6.交互式容器

创建一个交互式容器,并命名为ubuntu

docker run -it --name ubuntu ubuntu

 

 

 

 

 

7.守护式容器

对于一个需要长期运行的容器来说,可以创建一个守护式容器。在容器内部exit退出时,容器也不会停止。

 

docker run -itd --name httpd httpd

 

 

 

 

 

 

 

 

8.进入已运行的容器

docker exec -it  容器名或容器id   进入后执行的第一个命令

 

docker exec -it  httpd /bin/sh

 

 

 

 

docker images

 

 

 

 

 

 

9.查看容器

# 列出本机正在运行的容器

docker container ls

 

 

 

 

 

# 列出本机所有容器,包括已经终止运行的

docker container ls --all

 

 

 

 

10.停止与启动容器

docker container stop 容器名或容器id停止一个已经在运行的容器

docker container start 容器名或容器id启动一个已经停止的容器

docker container stop httpd

docker container start httpd

 

 

 

 

11.kill掉一个已经在运行的容器

docker container kill 容器名或容器id

 docker container kill  httpd

 

 

 

 

12.删除容器

docker container rm 容器名或容器id

docker container rm hello-world

 

 

 

 

 

13.容器提交: 根据容器生成一个新的镜像

docker  commit   容器名 镜像名

docker  commit httpd  httpd:1.0

docker images

 

 

 

 

 

14.容器导出: 将当前容器导出为TAR文件

docker  export [选项] 容器

常用选项:

-o 指定写入的文件

docker export -o httpd.tar httpd

 

 

 

 

 

 

15容器导入:将之前导出的容器文件导入并创建为一个镜像

docker import 文件  [版本信息]

docker import httpd.tar httpd:latest

docker images

 

 

 

 

 

 

16.容器管理命令流程图

 

 

 

 

5.容器和镜像的关系

 

 

 

 

 

在镜像层面上:

当我们查看镜像详细信息时,可以看到以下信息:

 

 

 

 

这里的Layers指的就是一个个只读的文件系统,镜像就是由这样一个个文件系统组成的,我们把镜像运行起来就会成为一个个容器,当我们在容器中做了修改并commit为镜像后,就会不断在原有的Layers层上新增一个Layer层,就像下面看到的这样。

 

 

 

 

所以当我们commit后,我们看到的镜像就是最上层的Layer。

 

 

 

 

 

在容器层面上:

当我们使用Docker create [image id]用指定镜像创建容器时,可以理解为在镜像的最上层创建了一个可读可写的Layer,当我们修改完,使用commit提交后,这个容器的可读可写的Layer层就会转化为镜像的只读的Layer层。

 

 

 

 

 

 

 

 

而当我们使用Docker inspect查看容器的时候只能查看到最上层容器的信息而无法查看到像镜像那样的Layers,这是因为在容器的视角中Layer层是这样的:

 

 

 

 

当容器中有进程运行时:

 

 

 

 

 

 

 

 

 

6.Docker镜像

镜像内部结构

理解 Docker 为什么是轻量级的,

1..案例 hello-world - 最小的镜像

hello-world 是 Docker 官方提供的一个镜像,通常用来验证 Docker 是否安装成功。

 

docker pull Docker Hub 下载它。

docker images 查看镜像的信息。

docker pull hello-world

docker images hello-world

 

 

 

 

hello-world 不到 2KB

 

 

docker run 运行

docker run hello-world

 

 

 

 

2.hello-world 的 Dockerfile 内容解释  如下

hello-world 镜像包含哪些内容。

Dockerfile 是镜像的描述文件,定义了如何构建 Docker 镜像。Dockerfile 的语法简洁且可读性强

 

 

 

 

1.FROM scratch
此镜像是从 0 开始构建。

2.COPY hello /
将文件“hello”复制到镜像的根目录。

3.CMD ["/hello"]
容器启动时,执行 /hello

 

docker history 命令查看指定镜像的创建历史

docker history  hello-world

 

 

 

 

 

镜像 hello-world 中就只有一个可执行文件 “hello”,其功能就是打印出 “Hello from Docker ......” 等信息。

/hello 就是文件系统的全部内容,连最基本的 /bin,/usr, /lib, /dev 都没有。

 

hello-world 虽然是一个完整的镜像,并没有什么实际用途。镜像能提供一个基本的操作系统环境,用户可以根据需要安装和配置软件。这样的镜像我们称作 base 镜像。

7.base 镜像


base 镜像有两层含义:

1.不依赖其他镜像,从 scratch 构建。

2.其他镜像可以之为基础进行扩展。

3.base 镜像的通常都是各种 Linux 发行版的 Docker 镜像,比如 Ubuntu, Debian, CentOS 等

docker pull centos下载镜像

docker images centos查看镜像信息

 

 

 

 

镜像大小 200MB。

 

1.Linux 操作系统由内核空间和用户空间组成 图

 

 

 

 

2.Rootfs ???

内核空间是 kernel,Linux 刚启动时会加载 bootfs 文件系统,之后 bootfs 会被卸载掉。

 

用户空间的文件系统是 rootfs,包含我们熟悉的 /dev, /proc, /bin 等目录。

对于 base 镜像来说,底层直接用 Host 的 kernel,自己只需要提供 rootfs 就行了。

 

而对于一个精简的 OS,rootfs 可以很小,只需要包括最基本的命令、工具和程序库就可以了。相比其他 Linux 发行版,CentOS 的 rootfs 已经算臃肿的了,alpine 还不到 10MB。

我们平时安装的 CentOS 除了 rootfs 还会选装很多软件、服务、图形桌面等,需要好几个 GB 就不足为奇了。

base 镜像提供的是最小安装的 Linux 发行版。

 

下面是 CentOS 镜像的 Dockerfile 的内容:

 

 

 

 

第二行 ADD 指令添加到镜像的 tar 包就是 CentOS 7 的 rootfs。在制作镜像时,这个 tar 包会自动解压到 / 目录下,生成 /dev, /porc, /bin 等目录。

 

注:可在 Docker Hub 的镜像描述页面中查看 Dockerfile 。

支持运行多种 Linux OS

 

不同 Linux 发行版的区别主要就是 rootfs。

Ubuntu 14.04 使用 upstart 管理服务,apt 管理软件包

CentOS 7 使用 systemd 和 yum。

 

这些都是用户空间上的区别,Linux kernel 差别不大。

所以 Docker 可以同时支持多种 Linux 镜像,模拟出多种操作系统环境。

 

 

 

 

Debian 和 BusyBox(一种嵌入式 Linux)上层提供各自的 rootfs,底层共用 Docker Host 的 kernel。

 

base 镜像只是在用户空间与发行版一致,kernel 版本与发型版是不同的。


例如

CentOS 7 使用 3.x.x 的 kernel,如果 Docker Host 是 Ubuntu 16.04,那么在 CentOS 容器中使用的实际是 Host 4.x.x 的 kernel。

 

 

 

 

注释
① Host kernel 为 3.10.0

② 启动并进入 ubuntu 容器
③ 验证容器是 ubuntu
④ 容器的 kernel 版本与 Host 一致

 

 

2.容器只能使用 Host 的 kernel,并且不能修改。
所有容器都共用 host 的 kernel,在容器中没办法对 kernel 升级。如果容器对 kernel 版本有要求(比如应用只能在某个 kernel 版本下运行),则不建议用容器,这种场景虚拟机可能更合适。

镜像的分层结构

Docker 支持通过扩展现有镜像,创建新的镜像。


实际上,Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。比如我们现在构建一个新的镜像,

Dockerfile 如下

 

 

 

 

 

注释

① 新镜像不再是从 scratch 开始,而是直接在 Debian base 镜像上构建。
② 安装 emacs 编辑器。
③ 安装 apache2。
④ 容器启动时运行 bash。

 

3.构建过程 如图所示

 

 

 

 

新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。

 

 

Docker 镜像要采用这种分层结构  最大好处 共享资源。

有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。  而且镜像的每一层都可以被共享。

 

多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容 , /etc 下的文件,其他容器的 /etc 不会被修改


修改会被限制在单个容器内。

Copy-on-Write 特性  可写的容器层

 

当容器启动时,一个新的可写层被加载到镜像的顶部。
这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

 

 

 

 

 

 

所有对容器的改动  - 无论添加、删除、还是修改文件都只会发生在容器层中。

只有容器层是可写的,容器层下面的所有镜像层都是只读的。

 

4.容器层的细节

镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统。如果不同层中有一个相同路径的文件,比如 /a,上层的 /a 会覆盖下层的 /a,也就是说用户只能访问到上层中的文件 /a。在容器层中,用户看到的是一个叠加之后的文件系统。

 

添加文件
在容器中创建文件时,新文件被添加到容器层中。

 

读取文件
在容器中读取某个文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,打开并读入内存。

 

修改文件
在容器中修改已存在的文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改之。

 

删除文件
在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中记录下此删除操作。

只有当需要修改时才复制一份数据,这种特性被称作 Copy-on-Write。可见,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。

 

容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享。

8.构建镜像

Docker 提供了两种构建镜像的方法:

1. docker commit 命令  

2. Dockerfile 构建文件

docker commit

docker commit 命令是创建新镜像最直观的方法,

 

包含三个步骤:

1. 运行容器

2. 修改容器

3. 将容器保存为新的镜像

1.案例 在 centos base 镜像中安装 vim 并保存为新镜像。

1.运行容器 
docker run -it centos
-it 参数的作用是以交互模式进入容器,并打开终端。ba29d054ede9 是容器的内部 ID。

 

2.安装 vim
yum -y install vim

 

 

 

 

 

3.保存为新镜像     在新窗口中查看当前运行的容器。

docker ps

 

 

 

 

 

inspiring_kilby Docker 为我们的容器随机分配的名字。

docker commit 命令将容器保存为镜像。 

docker commit  inspiring_kilby  centos_with_vim新镜像命名为 centos_with_vim

 

 

 

 

 

docker images查看新镜像的属性

 

 

 

 

size 上看到镜像因为安装了软件而变大了。

从新镜像启动容器,验证 vim 已经可以使用。

 

 

以上演示了如何用 docker commit 创建新镜像。然而,Docker 并不建议用户通过这种方式构建镜像。

 

原因如下:

1. 这是一种手工创建镜像的方式,容易出错,效率低且可重复性弱。比如要在 debian base 镜像中也加入 vi,还得重复前面的所有步骤。

2. 更重要的:使用者并不知道镜像是如何创建出来的,里面是否有恶意程序。也就是说无法对镜像进行审计,存在安全隐患。

 

原因是:

即便是用 Dockerfile(推荐方法)构建镜像,底层也 docker commit 一层一层构建新镜像的。

Dockerfile 构建镜像

Dockerfile 是一个文本文件,记录了镜像构建的所有步骤。

2.编写第一个 Dockerfile  ????

Dockerfile 创建上节的 centos_with_vim

 

 

 

 

 

pwd      

ls          

Dockerfile   

docker build -t centos-with-vim-dockerfile构建镜像
① 当前目录为 /root。

② Dockerfile 准备就绪。

③ 运行 docker build 命令,-t 将新镜像命名为 centos-with-vim-dockerfile,命令末尾的 . 指明 build context 为当前目录。Docker 默认会从 build context 中查找 Dockerfile 文件,我们也可以通过 -f 参数指定 Dockerfile 的位置。

 

[root@bogon dockerfile]# docker build -f Dockerfile -t myimage2 /root/dockerfile/

 

④ 首先 Docker 将 build context 中的所有文件发送给 Docker daemon。build context 为镜像构建提供所需要的文件或目录。
Dockerfile 中的 ADD、COPY 等命令可以将 build context 中的文件添加到镜像。此例中,build context 为当前目录 /root,该目录下的所有文件和子目录都会被发送给 Docker daemon。

所以,使用 build context 就得小心了,不要将多余文件放到 build context,特别不要把 /、/usr 作为 build context,否则构建过程会相当缓慢甚至失败。

 

⑤ Step 1:执行 FROM,将 centos作为 base 镜像。
centos 镜像 ID 为 75835a67d134。

⑥ Step 2:执行 RUN,安装 vim,具体步骤为 ⑦、⑧、⑨。

⑦ 启动 ID 为 2b7c684fedd3  的临时容器,在容器中通过 yum 安装 vim。

⑧ 删除临时容器 2b7c684fedd3。

⑨ 安装成功后,将容器保存为镜像,其 ID 为 a0decbc8e9f3。
这一步底层使用的是类似 docker commit 的命令。

 

通过 docker images 查看镜像信息。 

 

 

 


镜像 ID 为 a0decbc8e9f3,与构建时的输出一致。

在上面的构建过程中,我们要特别注意指令 RUN 的执行过程 ⑦、⑧、⑨。Docker 会在启动的临时容器中执行操作,并通过 commit 保存为新的镜

 

查看镜像分层结构

centos-with-vim-dockerfile 是通过在 base 镜像的顶部添加一个新的镜像层而得到的。

 

 

 

 

这个新镜像层的内容由 RUN yum install -y vim 生成。这一点我们可以通过 docker history 命令验证。

 

 

 

 

docker history 会显示镜像的构建历史,也就是 Dockerfile 的执行过程。

centos-with-vim-dockerfile 与 centos 镜像相比,确实只是多了顶部的一层 a0decbc8e9f3,由yum 命令创建,大小为 155MB。docker history 也向我们展示了镜像的分层结构,每一层由上至下排列。

注: 表示无法获取 IMAGE ID,通常从 Docker Hub 下载的镜像会有这个问题。

 

 

9.Dockerfile 常用指令

FROM指定 base 镜像。

MAINTAINER设置镜像的作者,可以是任意字符串。

 

COPY将文件从 build context 复制到镜像。
COPY 支持两种形式:

COPY src dest

COPY ["src", "dest"]

注意:src 只能指定 build context 中的文件或目录。

 

ADD
COPY 类似,从 build context 复制文件到镜像。不同的是,

如果 src 是归档文件(tar, zip, tgz, xz 等),文件会被自动解压到 dest。

ENV设置环境变量,环境变量可被后面的指令使用。

 

例如:

ENV MY_VERSION 1.3

RUN apt-get install -y mypackage=$MY_VERSION

...

 

 

EXPOSE指定容器中的进程会监听某个端口,Docker 可以将该端口暴露出来。

VOLUME将文件或目录声明为 volume。

WORKDIR为后面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令设置镜像中的当前工作目录。

RUN在容器中运行指定的命令。

 

CMD容器启动时运行指定的命令。

Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效。CMD 可以被 docker run 之后的参数替换。

 

ENTRYPOINT设置容器启动时运行的命令。
Dockerfile 中可以有多个 ENTRYPOINT 指令,但只有最后一个生效。CMD 或 docker run 之后的参数会被当做参数传递给 ENTRYPOINT。

 

 

10.容器启动执行命令

CMD docker run  ENTRYPOINT??

 

 

mkdir dockfile

cd dockfile/

vim Dockerfile

 

#my dockerfile

FROM busybox

MAINTAINER xuld

WORKDIR /testdir

RUN touch tmpfile1

COPY ["tmpfile2","."]

ADD ["bunch.tar.gz","."]

ENV WELCOME "You are in my container,welcome!"

 

 

 

 

 

注:Dockerfile 支持以“#”开头的注释。

 

 

1.构建镜像

echo "test826" > tmpfile2

touch file1 file2 file3

tar -czvf bunch.tar.gz file1 file2 file3

构建前确保 build context 中存在需要的文件。

依次执行 Dockerfile 指令,完成构建。

 

 

 

 

 

 

[root@localhost dockerfile]# docker build -t my-image .

 

 

 

 

2.运行容器,验证镜像内容

docker images

docker run -it my-image

 

 

 

 

 

解释

① 进入容器,当前目录即为 WORKDIR。
如果 WORKDIR 不存在,Docker 会自动为我们创建。

 

② WORKDIR 中保存了我们希望的文件和目录:
目录 bunch:由 ADD 指令从 build context 复制的归档文件 bunch.tar.gz,已经自动解压。
文件 tmpfile1:由 RUN 指令创建。
文件 tmpfile2:由 COPY 指令从 build context 复制。

 

③ ENV 指令定义的环境变量已经生效。

 

 

11.RUN vs CMD vs ENTRYPOINT区别

RUN、CMD 和 ENTRYPOINT 这三个 Dockerfile 指令看上去很类似,很容易混淆。

 

 

RUN 执行命令并创建新的镜像层,RUN 经常用于安装软件包。

CMD 设置容器启动后默认执行的命令及其参数,但 CMD 能够被 docker run 后面跟的命令行参数替换。

ENTRYPOINT 配置容器启动时运行的命令。

分发 image

为镜像命名

无论采用何种方式保存和分发镜像,首先都得给镜像命名。

 

docker images 可以查看镜像的信息。

 

 

 

 

这里注意到my-image对应的是 REPOSITORY,而且还有一个叫 latest 的 TAG。

实际上一个特定镜像的名字由两部分组成:repository 和 tag。

[image name] = [repository]:[tag]

 

如果执行 docker build 时没有指定 tag,会使用默认值 latest。

tag 常用于描述镜像的版本信息,

比如 httpd 镜像:

 

 

 

 

 

当然 tag 可以是任意字符串,比如 ubuntu 镜像:

 

 

 

 

千万别被 latest tag 给误导了。latest 其实并没有什么特殊的含义。

当没指明镜像 tag 时,Docker 会使用默认值 latest,仅此而已。

虽然 Docker Hub 上很多 repository 将 latest 作为最新稳定版本的别名,但这只是一种约定,而不是强制规定。所以我们在使用镜像时最好还是避免使用 latest,明确指定某个 tag,比如 httpd:2.3,ubuntu:xenial。

 

12.搭建本地 Registry

Docker Hub 虽然非常方便,但还是有些限制,比如:

1.需要 internet 连接,而且下载和上传速度慢。

2.上传到 Docker Hub 的镜像任何人都能够访问,虽然可以用私有 repository,但不是免费的。

3.安全原因很多组织不允许将镜像放到外网。

 

解决方案就是搭建本地的 Registry。

Docker 已经将 Registry 开源了,同时在 Docker Hub 上也有官方的镜像 registry。

 

Docker 中运行自己的 registry。

1.启动 registry 容器。

docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry:2

docker images

docker ps

 

 

 

 

 

 

 

 

我们使用的镜像是 registry:2。
-d 是后台启动容器。
-p 将容器的 5000 端口映射到 Host 的 5000 端口。5000 是 registry 服务端口。
-v 将容器 /var/lib/registry 目录映射到 Host 的 /myregistry,用于存放镜像数据。

 

2.通过 docker tag 重命名镜像,使之与 registry 匹配。

docker tag my-image 192.168.10.10:5000/my-image 重新命名

docker images

docker push 192.168.10.10:5000/my-image会报错

 

 

 

 

会报错 问题的原因是:

Docker自从1.3.X之后docker registry交互默认使用的是HTTPS,但是搭建私有镜像默认使用的是HTTP服务,所以与私有镜像交时出现以上错误。

 

解决办法: 修改/etc/docker/daemon.json   增加下面这段话

{ "insecure-registries": ["192.168.10.10:5000"] }

注意  

这一步一定要  在创建私有仓库的  容器之前,否则修改配置文件不会生效,改完重启也不生效。

 

 

 

 

3.正确的步骤:

1.  vim/etc/docker/daemon.json

 

{

  "insecure-registries": ["192.168.10.10:5000"]

 }

 

 

 

 

 

systemctl daemon-reload

systemctl restart docker

2.docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry:2

3.docker push 192.168.10.10:5000/my-image通过docker pull命令下载本地仓库的镜像了

cd /myregistry/docker/registry/v2/repositories/可以到/myregistry目录下看到my-image相关数据

 

 

 

 

 

 

13简答& 实验

 

1简答题

Docker与虚拟化软件有什么不同

Docker镜像原理

进入容器的两种方式?

如何将本地文件拷贝到容器?

如何实现容器启动时执行的命令?

2 实验题

安装docker并实现镜像加速

熟练docker镜像和容器相关基础命令

熟练编写dockerfile,并实现构建镜像

搭建本地私有镜像仓库,并将手动构建的镜像发布上去

 

 

posted @ 2020-08-10 19:09  浅唱I  阅读(796)  评论(0编辑  收藏  举报