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. SEO—Meta标签优化

    Meta标签之一"标题": 标题是网站中很重要的一个标签,他在搜索引擎中是直接显示出来的,一般情况下要网站的核心关键词和网站名称都写进去,这样更有利于网站的排名.但是要注意标题的长 ...

  2. Centos7下Java开发基本环境搭建

    一.Centos7安装JDK 首先查看自己的机器上是否已经自带openjdk,命令如下: rpm -qa | grep jdk 如果存在,则按照如下命令进行依次卸载: yum -y remove fi ...

  3. c#后台调用API

    前两周赶上项目第一个版本上线,着实忙了一把,毕竟只有两个人负责.如今已完结,总算喘了一口气,现在任务就是写API.测API,许久之前写过JS前台调用 项目API,也写过后台调用开放的手机号归属地查询, ...

  4. Snort初探

    Snort初探 概念: Snort是一款开源的网络入侵防御系统(IPS),可以实时分析和记录网络数据包,你可以通过执行协议分析.内容搜索和匹配,从而发现各种网络攻击和可疑的探测.例如,缓冲区溢出.端口 ...

  5. IIS6/7 配置问题

    IIS7 / IIS6 HttpMoudles 在web.config 中不同的配置 原创 2011年04月25日 08:44:00 标签: iis / server 4357 昨天把我们写的程序布署 ...

  6. 【C++】bazel的使用

    bazel的使用 bazel是google开源的构建工具,可以支持多种语言的构建.这里来尝试一下如何在C++项目中使用bazel构建. 安装就不介绍了,在官网很详细,输入bazel --help: U ...

  7. div仿td标签属性

    链接:https://pan.baidu.com/s/1kW1At9d 密码:g0he 这里说的div是指固定大小的,动态往里面填充文字的时候,文字一直水平垂直居中(换行也是).就和td标签一样.当然 ...

  8. 原生JS实现图片轮播

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. xBIM 多个IFC文件合并

    目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...

  10. BZOJ 3550: [ONTAK2010]Vacation [单纯形法]

    有3N个数,你需要选出一些数,首先保证任意长度为N的区间中选出的数的个数<=K个,其次要保证选出的数的个数最大. 好像都是费用流... 单纯性裸题呀... 注意每个数最多选1次 #include ...