1. Dcoker镜像初识

  1. $ docker images -a //查看当前所有镜像
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. cptactionhank/atlassian-jira latest 2fc2bea9b5ac 4 days ago 1.1GB
  4. mariadb latest afa0733d0c1b 4 days ago 387MB
  5. sameersbn/gitlab latest 77bfce5b3fc7 5 days ago 1.43GB
  6. sameersbn/redis latest d8f7b0e07097 6 days ago 203MB
  7. sameersbn/redmine latest 1741b9b25489 7 days ago 670MB
  8. wordpress latest f28808014819 9 days ago 406MB
  9. sameersbn/ubuntu 14.04.20170228 38b8a7a67dab 5 months ago 200MB
  10. sameersbn/postgresql latest 409a9e95e432 6 months ago 234MB
  11. hello-world latest 48b5124b2768 6 months ago 1.84kB

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

2. 镜像的分层

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



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

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

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

关于镜像分层的命令:

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

3. Dockerfile

看一个Dockerfile的例子:

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

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

  1. #!/bin/bash
  2. set -e
  3. REDIS_PASSWORD=${REDIS_PASSWORD:-}
  4. map_redis_uid() {
  5. USERMAP_ORIG_UID=$(id -u redis)
  6. USERMAP_ORIG_GID=$(id -g redis)
  7. USERMAP_GID=${USERMAP_GID:-${USERMAP_UID:-$USERMAP_ORIG_GID}}
  8. USERMAP_UID=${USERMAP_UID:-$USERMAP_ORIG_UID}
  9. if [ "${USERMAP_UID}" != "${USERMAP_ORIG_UID}" ] || [ "${USERMAP_GID}" != "${USERMAP_ORIG_GID}" ]; then
  10. echo "Adapting uid and gid for redis:redis to $USERMAP_UID:$USERMAP_GID"
  11. groupmod -g "${USERMAP_GID}" redis
  12. sed -i -e "s/:${USERMAP_ORIG_UID}:${USERMAP_GID}:/:${USERMAP_UID}:${USERMAP_GID}:/" /etc/passwd
  13. fi
  14. }
  15. create_socket_dir() {
  16. mkdir -p /run/redis
  17. chmod -R 0755 /run/redis
  18. chown -R ${REDIS_USER}:${REDIS_USER} /run/redis
  19. }
  20. create_data_dir() {
  21. mkdir -p ${REDIS_DATA_DIR}
  22. chmod -R 0755 ${REDIS_DATA_DIR}
  23. chown -R ${REDIS_USER}:${REDIS_USER} ${REDIS_DATA_DIR}
  24. }
  25. create_log_dir() {
  26. mkdir -p ${REDIS_LOG_DIR}
  27. chmod -R 0755 ${REDIS_LOG_DIR}
  28. chown -R ${REDIS_USER}:${REDIS_USER} ${REDIS_LOG_DIR}
  29. }
  30. map_redis_uid
  31. create_socket_dir
  32. create_data_dir
  33. create_log_dir
  34. # allow arguments to be passed to redis-server
  35. if [[ ${1:0:1} = '-' ]]; then
  36. EXTRA_ARGS="$@"
  37. set --
  38. fi
  39. # default behaviour is to launch redis-server
  40. if [[ -z ${1} ]]; then
  41. echo "Starting redis-server..."
  42. exec start-stop-daemon --start --chuid ${REDIS_USER}:${REDIS_USER} --exec $(which redis-server) -- \
  43. /etc/redis/redis.conf ${REDIS_PASSWORD:+--requirepass $REDIS_PASSWORD} ${EXTRA_ARGS}
  44. else
  45. exec "$@"
  46. fi

构建镜像的命令:

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

4. 项目中的镜像分层

如图:我们总结如下:

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

5. 定制私有的基础镜像

  • 使用debootstarp工具定mrhj自己需要的最小化的linux基出镜像:
  1. sudo apt-get install debootstarp
  2. sudo debootstrap --arch amd64 trusty ubuntu-trusty http://mirrors.163.com/ubuntu/
  3. cd ubuntu-trusty
  4. sudo cp usr/share/zoneinfo/Asia/Shanghai etc/localtime
  • 提交生成基础镜像
  1. cd ubuntu-trusty
  2. sudo tar -c ./docker import - ubuntu1404-baseimage:1.0
  • 查看新创建镜像
  1. docker images
  • 新建容器查看镜像是否可用
  1. 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. 定时任务schedule(spring boot )

    1. 定时任务实现方式:SpringBoot自带的Scheduled,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多,本文主要介绍. 执行方式:单线程(串行)多线程(并行) ...

  2. HTML5与css3权威指南(一)

    doctype声明: <!DOCTYPE html> 字符编码: <meta charset="utf-8"> 不允许写结束标记:area,base,br. ...

  3. Eclipse 配置运行Spark

    本文主要记录Spark 在 Eclipse中报 找不到主类的问题.在新建Spark工程,然后add external jars 选择 spark-assembly-1.4.0-hadoop2.6.0. ...

  4. js 判断一个文本框是否获得焦点

    1.js 判断一个文本框是否获得焦点 // 可以用document.activeElement判断 // document.activeElement表示当前活动的元素   // 查找你要判断的文本框 ...

  5. linux配置上网

    重装系统之后,配置虚拟机的网络问题花了我三个小时,忘记了网关是vmnet8的IP还是DNS了,搞了很久,后来碰运气碰对了. 寄宿机共享的网络是vmnet8,设置IP,DNS,是vmnet8 的IPv4 ...

  6. mkdir与mkdirs的区别

    mkdir与mkdirs的区别 项目中需要在代码中读取或创建文件保存路径,用到了mkdir,查看还有个mkdirs方法,这里记录一下两者的区别. 1.关于两者的说明如下: boolean mkdir( ...

  7. AOP 切面编程------JoinPoint ---- log日志

    AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件 ...

  8. BZOJ 3168: [Heoi2013]钙铁锌硒维生素 [线性基 Hungary 矩阵求逆]

    3168: [Heoi2013]钙铁锌硒维生素 题意:给一个线性无关组A,再给一个B,要为A中每个向量在B中选一个可以代替的向量,替换后仍然线性无关.判断可行和求字典序最小的解 PoPoQQQ orz ...

  9. BZOJ 3173: [Tjoi2013]最长上升子序列 [splay DP]

    3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1613  Solved: 839[Submit][St ...

  10. Matplotlib学习笔记(二)

    原  Matplotlib学习笔记 参考:Python数据科学入门教程 Python3.6.1 jupyter notebook .caret, .dropup > .btn > .car ...