博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Docker系统四:Dcoker的镜像管理
阅读量:4511 次
发布时间:2019-06-08

本文共 4527 字,大约阅读时间需要 15 分钟。

1. Dcoker镜像初识

$ docker images -a  //查看当前所有镜像REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZEcptactionhank/atlassian-jira   latest              2fc2bea9b5ac        4 days ago          1.1GBmariadb                        latest              afa0733d0c1b        4 days ago          387MBsameersbn/gitlab               latest              77bfce5b3fc7        5 days ago          1.43GBsameersbn/redis                latest              d8f7b0e07097        6 days ago          203MBsameersbn/redmine              latest              1741b9b25489        7 days ago          670MBwordpress                      latest              f28808014819        9 days ago          406MBsameersbn/ubuntu               14.04.20170228      38b8a7a67dab        5 months ago        200MBsameersbn/postgresql           latest              409a9e95e432        6 months ago        234MBhello-world                    latest              48b5124b2768        6 months ago        1.84kB

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

2. 镜像的分层

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

517566-20170731115210786-1958598906.png
517566-20170731115244458-600131356.png

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

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

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

517566-20170731115227286-1128372889.png

关于镜像分层的命令:

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

3. Dockerfile

看一个Dockerfile的例子:

FROM sameersbn/ubuntu:14.04.20170228MAINTAINER sameer@damagehead.comENV REDIS_USER=redis \    REDIS_DATA_DIR=/var/lib/redis \    REDIS_LOG_DIR=/var/log/redisRUN 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.shRUN chmod 755 /sbin/entrypoint.shEXPOSE 6379/tcpVOLUME ["${REDIS_DATA_DIR}"]ENTRYPOINT ["/sbin/entrypoint.sh"]
  • FROM:构建开始于哪个基础镜像
  • MAINTAINER: 镜像作者
  • ENV: 设置环境变量
  • RUN: 运行shell命令,多条以“&&”相连
  • COPY:奖编译机本地文件拷贝到镜像文件系统中
  • EXPOSE:指定监听端口
  • ENTRYPOINT: 预执行命令,创建镜像时不执行,创建容器时执行

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

#!/bin/bashset -eREDIS_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_uidcreate_socket_dircreate_data_dircreate_log_dir# allow arguments to be passed to redis-serverif [[ ${1:0:1} = '-' ]]; then  EXTRA_ARGS="$@"  set --fi# default behaviour is to launch redis-serverif [[ -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. 项目中的镜像分层

517566-20170731115311068-992211589.png

如图:我们总结如下:

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

5. 定制私有的基础镜像

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

转载于:https://www.cnblogs.com/Terry-Wu/p/7262422.html

你可能感兴趣的文章
MAGENTO 与 reindexer
查看>>
数字,字符串,列表及其内置方法
查看>>
iOS遍历数组的同时删除元素
查看>>
小强的HTML5移动开发之路(16)——神奇的拖放功能
查看>>
zookeeper FastLeaderElection
查看>>
Jquery AJAX如何使用Promise/Deferred实现顺序执行?
查看>>
进度条
查看>>
maven 常用命令
查看>>
用户画像
查看>>
HTTP报文(面试会问开发时常用的报文头格式)
查看>>
机器学习从业人员到底做什么?
查看>>
word发表博客的方法
查看>>
Programming Erlang_CHAPTER2_Basic Erlang 学习笔记(2)。
查看>>
Linux基础
查看>>
【模板】高精度
查看>>
弱弱的玩下Javascript
查看>>
二叉树相关操作
查看>>
在webstorm开发微信小程序之使用阿里自定义字体图标
查看>>
序列化模块/模块/包
查看>>
eclipse maven plugin 插件 安装 和 配置
查看>>