Docker系统四:Dcoker的镜像管理
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的镜像管理的更多相关文章
- ubuntu-docker入门到放弃(三)images镜像管理
docker虽然有公共的镜像管理hub,但是我们在日常的使用中,由于不同的业务场景,不同的架构,公共的镜像库不能满足需求,并且出于安全考虑,会搭建私有的docker hub镜像库来管理自己的image ...
- Docker笔记(四):Docker镜像管理
原文地址:http://blog.jboost.cn/2019/07/16/docker-4.html 在Docker中,应用是通过容器来运行的,而容器的运行是基于镜像的,类似面向对象设计中类与对象的 ...
- Devops(四):Docker 镜像管理
参考 <Docker中上传镜像到docker hub中> <Docker 镜像管理> <通过容器提交镜像(docker commit)以及推送镜像(docker push ...
- Docker(四)-Dcoker镜像
Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在本地, Docker 会从镜像仓库下载(默认是Docker Hub公共注册服务器中的仓库). Docker Hub:https://hub ...
- 004.Docker镜像管理
一 镜像基本操作 镜像是一个包含程序运行必要依赖环境和代码的只读文件,其本质是磁盘上一系列文件的集合.它采用分层的文件系统,将每一次改变以读写层的形式增加到原来的只读文件上.镜像是容器运行的基石. 1 ...
- Docker镜像管理基础篇
Docker镜像管理基础篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Docker Images Docker镜像还有启动容器所需要的文件系统及其内容,因此,其用于创建并启 ...
- Docker进阶之四:镜像管理
一.什么是镜像? 简单说,Docker镜像是一个不包含Linux内核而又精简的Linux操作系统. 二.镜像从哪里来? Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容 ...
- Docker 学习3 Docker镜像管理基础
一.docker 常用操作及原理 1.docker 常用操作 2.docker 机制 1.docker client端是通过http或者https与server端通信的.个 2.docker 镜像可以 ...
- Docker入门与应用系列(二)镜像管理
1.1 什么是镜像 简单说,Docker镜像是一个不包含Linux内核而又精简的Linux操作系统. 1.2 镜像从哪里来 Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容 ...
随机推荐
- SEO—Meta标签优化
Meta标签之一"标题": 标题是网站中很重要的一个标签,他在搜索引擎中是直接显示出来的,一般情况下要网站的核心关键词和网站名称都写进去,这样更有利于网站的排名.但是要注意标题的长 ...
- Centos7下Java开发基本环境搭建
一.Centos7安装JDK 首先查看自己的机器上是否已经自带openjdk,命令如下: rpm -qa | grep jdk 如果存在,则按照如下命令进行依次卸载: yum -y remove fi ...
- c#后台调用API
前两周赶上项目第一个版本上线,着实忙了一把,毕竟只有两个人负责.如今已完结,总算喘了一口气,现在任务就是写API.测API,许久之前写过JS前台调用 项目API,也写过后台调用开放的手机号归属地查询, ...
- Snort初探
Snort初探 概念: Snort是一款开源的网络入侵防御系统(IPS),可以实时分析和记录网络数据包,你可以通过执行协议分析.内容搜索和匹配,从而发现各种网络攻击和可疑的探测.例如,缓冲区溢出.端口 ...
- IIS6/7 配置问题
IIS7 / IIS6 HttpMoudles 在web.config 中不同的配置 原创 2011年04月25日 08:44:00 标签: iis / server 4357 昨天把我们写的程序布署 ...
- 【C++】bazel的使用
bazel的使用 bazel是google开源的构建工具,可以支持多种语言的构建.这里来尝试一下如何在C++项目中使用bazel构建. 安装就不介绍了,在官网很详细,输入bazel --help: U ...
- div仿td标签属性
链接:https://pan.baidu.com/s/1kW1At9d 密码:g0he 这里说的div是指固定大小的,动态往里面填充文字的时候,文字一直水平垂直居中(换行也是).就和td标签一样.当然 ...
- 原生JS实现图片轮播
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- xBIM 多个IFC文件合并
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...
- BZOJ 3550: [ONTAK2010]Vacation [单纯形法]
有3N个数,你需要选出一些数,首先保证任意长度为N的区间中选出的数的个数<=K个,其次要保证选出的数的个数最大. 好像都是费用流... 单纯性裸题呀... 注意每个数最多选1次 #include ...