1. Dcoker镜像初识

$ docker images -a  //查看当前所有镜像

REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
cptactionhank/atlassian-jira latest 2fc2bea9b5ac 4 days ago 1.1GB
mariadb latest afa0733d0c1b 4 days ago 387MB
sameersbn/gitlab latest 77bfce5b3fc7 5 days ago 1.43GB
sameersbn/redis latest d8f7b0e07097 6 days ago 203MB
sameersbn/redmine latest 1741b9b25489 7 days ago 670MB
wordpress latest f28808014819 9 days ago 406MB
sameersbn/ubuntu 14.04.20170228 38b8a7a67dab 5 months ago 200MB
sameersbn/postgresql latest 409a9e95e432 6 months ago 234MB
hello-world latest 48b5124b2768 6 months ago 1.84kB

镜像有和容器一样有一个Image ID(126)做标识,一般使用其16位作缩略形式,同时通过镜像的名字(REPOSITORY)+ 版本号(TAG)也能标识一镜像,如果省略TAG,刚默认使用最新版

2. 镜像的分层

Docker的镜像是通过联合文件系统将各层系统叠加在一起,每个镜像都会有各自磁盘的应用层和与其他镜像共享的公共层,所以image在本地的总和大小,要远远小于他们的实际大小之和,具体看下图示意:



对于分层的Docker镜像有两个特性:

  • 已有分层只能读不能修改
  • 上层镜像的优先级高于底层镜像

即当多个镜象共享的公用层文件是不允许修改的,只能在各个镜像的上层加一个可写层进行相应修改(这种可写的操作是在以镜像为基础生成Docker容器的基础上进行的),具体看下图示意:

关于镜像分层的命令:

docker history  镜像id/镜像名 //查询镜像的生成缩略历史(分了多少层)
docker history --no-trunc 镜像id/镜像名 //查询镜像的生成详细历史(分了多少层)

3. Dockerfile

看一个Dockerfile的例子:

FROM sameersbn/ubuntu:14.04.20170228
MAINTAINER sameer@damagehead.com ENV REDIS_USER=redis \
REDIS_DATA_DIR=/var/lib/redis \
REDIS_LOG_DIR=/var/log/redis RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y redis-server \
&& sed 's/^daemonize yes/daemonize no/' -i /etc/redis/redis.conf \
&& sed 's/^bind 127.0.0.1/bind 0.0.0.0/' -i /etc/redis/redis.conf \
&& sed 's/^# unixsocket /unixsocket /' -i /etc/redis/redis.conf \
&& sed 's/^# unixsocketperm 755/unixsocketperm 777/' -i /etc/redis/redis.conf \
&& sed '/^logfile/d' -i /etc/redis/redis.conf \
&& rm -rf /var/lib/apt/lists/* COPY entrypoint.sh /sbin/entrypoint.sh
RUN chmod 755 /sbin/entrypoint.sh EXPOSE 6379/tcp
VOLUME ["${REDIS_DATA_DIR}"]
ENTRYPOINT ["/sbin/entrypoint.sh"]
  • FROM:构建开始于哪个基础镜像
  • MAINTAINER: 镜像作者
  • ENV: 设置环境变量
  • RUN: 运行shell命令,多条以“&&”相连
  • COPY:奖编译机本地文件拷贝到镜像文件系统中
  • EXPOSE:指定监听端口
  • ENTRYPOINT: 预执行命令,创建镜像时不执行,创建容器时执行

entrypoint.sh的一个示例代码如下:

#!/bin/bash
set -e REDIS_PASSWORD=${REDIS_PASSWORD:-} map_redis_uid() {
USERMAP_ORIG_UID=$(id -u redis)
USERMAP_ORIG_GID=$(id -g redis)
USERMAP_GID=${USERMAP_GID:-${USERMAP_UID:-$USERMAP_ORIG_GID}}
USERMAP_UID=${USERMAP_UID:-$USERMAP_ORIG_UID}
if [ "${USERMAP_UID}" != "${USERMAP_ORIG_UID}" ] || [ "${USERMAP_GID}" != "${USERMAP_ORIG_GID}" ]; then
echo "Adapting uid and gid for redis:redis to $USERMAP_UID:$USERMAP_GID"
groupmod -g "${USERMAP_GID}" redis
sed -i -e "s/:${USERMAP_ORIG_UID}:${USERMAP_GID}:/:${USERMAP_UID}:${USERMAP_GID}:/" /etc/passwd
fi
} create_socket_dir() {
mkdir -p /run/redis
chmod -R 0755 /run/redis
chown -R ${REDIS_USER}:${REDIS_USER} /run/redis
} create_data_dir() {
mkdir -p ${REDIS_DATA_DIR}
chmod -R 0755 ${REDIS_DATA_DIR}
chown -R ${REDIS_USER}:${REDIS_USER} ${REDIS_DATA_DIR}
} create_log_dir() {
mkdir -p ${REDIS_LOG_DIR}
chmod -R 0755 ${REDIS_LOG_DIR}
chown -R ${REDIS_USER}:${REDIS_USER} ${REDIS_LOG_DIR}
} map_redis_uid
create_socket_dir
create_data_dir
create_log_dir # allow arguments to be passed to redis-server
if [[ ${1:0:1} = '-' ]]; then
EXTRA_ARGS="$@"
set --
fi # default behaviour is to launch redis-server
if [[ -z ${1} ]]; then
echo "Starting redis-server..."
exec start-stop-daemon --start --chuid ${REDIS_USER}:${REDIS_USER} --exec $(which redis-server) -- \
/etc/redis/redis.conf ${REDIS_PASSWORD:+--requirepass $REDIS_PASSWORD} ${EXTRA_ARGS}
else
exec "$@"
fi

构建镜像的命令:

docker build -t 镜像名
docker images 查看构建的镜像

4. 项目中的镜像分层

如图:我们总结如下:

  • 这两个项目使用四个镜像创建了5个容器,这四个镜像都是基于同一基础镜像sameersbn/ubuntu,而sameersbn/ubuntu又是基于更通用的Ubuntu系统镜像基制作的
  • 每个镜像加一个可写层形成容器,多个容器组合在一起构成服务对外提供
  • 基于同一个镜像只需要增加一个可写层,就可以为不同项目创建各自所需的容器

5. 定制私有的基础镜像

  • 使用debootstarp工具定mrhj自己需要的最小化的linux基出镜像:
sudo apt-get install debootstarp
sudo debootstrap --arch amd64 trusty ubuntu-trusty http://mirrors.163.com/ubuntu/
cd ubuntu-trusty
sudo cp usr/share/zoneinfo/Asia/Shanghai etc/localtime
  • 提交生成基础镜像
cd ubuntu-trusty
sudo tar -c ./docker import - ubuntu1404-baseimage:1.0
  • 查看新创建镜像
docker images
  • 新建容器查看镜像是否可用
docker run -t -i ubuntu1404-baseimage:1.0  /bin/bash

Docker系统四:Dcoker的镜像管理的更多相关文章

  1. ubuntu-docker入门到放弃(三)images镜像管理

    docker虽然有公共的镜像管理hub,但是我们在日常的使用中,由于不同的业务场景,不同的架构,公共的镜像库不能满足需求,并且出于安全考虑,会搭建私有的docker hub镜像库来管理自己的image ...

  2. Docker笔记(四):Docker镜像管理

    原文地址:http://blog.jboost.cn/2019/07/16/docker-4.html 在Docker中,应用是通过容器来运行的,而容器的运行是基于镜像的,类似面向对象设计中类与对象的 ...

  3. Devops(四):Docker 镜像管理

    参考 <Docker中上传镜像到docker hub中> <Docker 镜像管理> <通过容器提交镜像(docker commit)以及推送镜像(docker push ...

  4. Docker(四)-Dcoker镜像

    Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在本地, Docker 会从镜像仓库下载(默认是Docker Hub公共注册服务器中的仓库). Docker Hub:https://hub ...

  5. 004.Docker镜像管理

    一 镜像基本操作 镜像是一个包含程序运行必要依赖环境和代码的只读文件,其本质是磁盘上一系列文件的集合.它采用分层的文件系统,将每一次改变以读写层的形式增加到原来的只读文件上.镜像是容器运行的基石. 1 ...

  6. Docker镜像管理基础篇

    Docker镜像管理基础篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Docker Images Docker镜像还有启动容器所需要的文件系统及其内容,因此,其用于创建并启 ...

  7. Docker进阶之四:镜像管理

      一.什么是镜像? 简单说,Docker镜像是一个不包含Linux内核而又精简的Linux操作系统. 二.镜像从哪里来? Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容 ...

  8. Docker 学习3 Docker镜像管理基础

    一.docker 常用操作及原理 1.docker 常用操作 2.docker 机制 1.docker client端是通过http或者https与server端通信的.个 2.docker 镜像可以 ...

  9. Docker入门与应用系列(二)镜像管理

    1.1 什么是镜像 简单说,Docker镜像是一个不包含Linux内核而又精简的Linux操作系统. 1.2 镜像从哪里来 Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容 ...

随机推荐

  1. selenium+python自动化测试系列(二):AutoIt工具实现本地文件上传

    AutoIt使用简单说明 AutoIt的安装这里就不在啰嗦,可以参考AutoIt安装或者自行搜索解决. 第一步:定位上传文件路径的文本框 这里举例说明,如何定位?如图 这里我们看到上传文件的类型是bu ...

  2. Linux cp 移动的时候报错

    报错如下: cp: omitting directory `./nginx-1.12.1'   原因: 要移动的目录下还存在有目录   解决: cp -r 文件名 地址   注意: 这里的-r代表递归 ...

  3. MySql全文索引

    使用索引是数据库性能优化的必备技能之一.在MySQL数据库中,有四种索引:聚集索引(主键索引).普通索引.唯一索引以及我们这里将要介绍的全文索引(FULLTEXT INDEX). 全文索引(也称全文检 ...

  4. join on用法

    内连接和外连接 内连接用于返回满足连接条件的记录:而外连接则是内连接的扩展,它不仅会满足连接条件的记录,而且还会返回不满足连接条件的记录 内连接 内连接查询返回满足条件的所有记录,默认情况下没有指定任 ...

  5. Python之Django rest_Framework框架源码分析

    #!/usr/bin/env python # -*- coding:utf-8 -*- from rest_framework.views import APIView from rest_fram ...

  6. Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase

    上篇博客聊了<git分支管理之rebase 以及 cherry-pick相关操作>本篇博客我们就以Learning Git中的关卡进行展开.下方列举了LearningGit中的 merge ...

  7. CF341C. Iahub and Permutations [DP 排列]

    http://codeforces.com/contest/341/problem/C 题意: 有一个长度为n的排列a,其中有一些位置被替换成了-1.你需要尝试恢复这个排列,将-1替换回数字.求有多少 ...

  8. Linux内存机制以及手动释放swap和内存

    今天我们来谈谈Linux的内存机制. 首先我们理一下概念 一.什么是linux的内存机制? 我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成, ...

  9. VS2012以后版本MFC程序发布记录,支持XP

    ##概述 自从VS2012之后,增加了新的VC运行时库,而一般用户机器上不一定有对应的版本的运行时库,所以微软官方给出的方案是需要用户安装对应版本的VisualC++Redistributable P ...

  10. LeetCode - 627. Swap Salary

    Given a table salary, such as the one below, that has m=male and f=female values. Swap all f and m v ...