Docker从入门到精通

第四章Docker镜像和仓库

2019-03-06  本文已影响13人  a7cfd566252e

一、Docker镜像概述

镜像是Docker容器的基石,容器是镜像的运行实例,有了镜像才能启动容器。每一个镜像都会有一个文本文件Dockerfile,定义了如何构建Docker镜像。

1、基础镜像
提供了一个基本的操作系统环境,用户可以根据需要安装和配置软件。 基础镜像通常是各种Linux发行版的Docker镜像比如ubuntu、Debian、centos等;
基础镜像只是在用户空间与发行版一致,kernel版本与发行版是不同的。比如说虚机系统是centos,运行一个容器是ubuntu系统的,那么ubuntu使用的其实就是本虚机的kernel,容器只能使用本地虚机的kernel且不能修改。
2、镜像的分层结构
    DockerHub中绝大多数的镜像都是通过在base镜像中安装和配置需要的软件构建出来的。base镜像是from scratch开始,新镜像是直接在base镜像上构建from ubuntu, 新镜像是从base镜像一层一层叠加生成的,每安装一个软件就等于在现有
的镜像上增加一层。 Docker镜像采用分层结构的好处就是共享资源。
3、可写的容器层
    当容器启动时,一个新的可写层被加载到镜像的顶部,这一层就叫容器层,容器层之下都叫镜像层。只有容器层是可写的,容器层下面的所有镜像层都是只读的。对容器的任何改动都只会发生在容器层中。
这里,所有的镜像层联合一起组成一个统一的文件系统,用户在容器层看到的就是一个叠加之后的文件系统。
镜像层内部是有上下之分的:
- 添加文件:在容器中创建文件时,新文件被添加到容器层中。
- 读取文件:当在容器中读取某个文件时,Docker会从上往下依次在各镜像层中查找此文件,一旦找到打开并读入内存。
- 修改文件:在容器中修改已存在的文件时,Docker会从上往下依次在各个镜像层中查找此文件,一旦找到立即将其复制到容器层中,然后才修改。(copy-on-write特性)
- 删除文件:在容器中删除文件时,Docker会从上往下依次在镜像层中找,找到后,会在容器层记录下此删除操作。
copy-on-write特性说明容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。所以镜像可以被多个容器共享。
图片.png

二、Docker的镜像的常用命令

1、查看镜像: docker images本地镜像存储在docker宿主机的/var/lib/docker/目录下,其中containers下面存放的是所有的容器。如下图所示:

图片.png
镜像是存储在仓库中的,而仓库是存在Registry(注册中心)中的。默认的Registry是Docker Hub,我们可以去注册,后面也可以搭建自己的私有Registry。
2、拉取镜像:docker pull +镜像名:标签
3、查找镜像: docker search +镜像名也可以直接去docker hub中查找相应的镜像
4、构建镜像:有两种方式
a、使用docker commit命令--不推荐使用此方式构建镜像
 需要在构建之前自行去docker hub去注册号相应的账号。然后通过命令docker login登录如下图1,因为docker hub是国外的网站所以会比较慢,此时我们可以是设置自己国内的加速器
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://noq3xink.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
首先基于一个基础镜像启动生成一个容器,然后在容器中安装apache2的软件包,最后将此环境进行提交
docker commit +容器id 目标镜像仓库/镜像名
b、使用docker build命令和Dockerfile文件
   mkdir myfirst_web  创建一个文件夹
   cd myfirst_web/
   touch Dockerfile
   vi Dockerfile写入如下内容:
# Version:0.01
FROM ubuntu
MAINTAINER wtt "1269878284@qq.com"
RUN apt-get update && apt-get install -y nginx
Run echo 'Hi ,I am in your container '\
>/usr/share/nginx/html/index.html
EXPOSE 80
然后在文件接内执行docker build 命令:docker build -t="dockerwu123/myfirst_webimage:0.0.1" .(含义:其中点的意思是告诉docker到本地目录下去找dockerfile文件,也可以指定一个git仓库的源地址来指定Dockerfile的位置)。
基于当前创建的镜像来启动生成一个容器
docker run -i -t --name myfirstcontainer -p 8080:80 -d dockerwu123/myfirst_webimage:0.0.1 /bin/bash

图1.png
图2.png
5、查看新镜像
docker images dockerwu123/myfirst_web
6、-p选项映射到特定端口
docker run -d -p 8080:80会将容器内的80端口绑定到本地宿主机的8080端口。

三、Docker私有Registry的搭建和使用

虽然Docker镜像有默认的官方提供的公共的Registry,但是如果想要搭建自己的私有Registry,用于存放我们不想被公开的信息或数据的镜像。
有两种方式:
其一、利用Docker Hub上的私有Registry
其二、在防火墙后面运行我们自己的Registry
这里主要介绍第二种的方式的搭建和使用方法
1、运行基于容器的Registry:docker run -p 5000:5000 registry:2
2、基于Dockerfile构建自己的镜像文件
3、使用私有的Registry为镜像打标签
docker tag 10c96ded251f localhost.localdomain:5000/dockerwu123/myfirst_webimage:0.0.1
可以使用命令hostname查看本机的主机名
4、将镜像推送到自己新搭建的Registry中,保证新的Registry容器是处于运行开启的状态
docker push localhost.localdomain:5000/dockerwu123/myfirst_webimage:0.0.1
推送成功如下图

图片.png
上一篇下一篇

猜你喜欢

热点阅读