文档章节

镜像的查找、使用和定制

无心灬快语
 无心灬快语
发布于 2017/06/29 17:45
字数 1503
阅读 18
收藏 0

1. 查找镜像

不要使用docker search查找镜像,search只能搜索到镜像名称,并不能找到所有的标签名,也无法得知镜像使用方法。应该前往官方镜像网站查找需要的镜像。

官方镜像网址:https://hub.docker.com/explore/

查找镜像可以使用搜索功能,只需要输入镜像名称即可,不要把标签也添加上,否则搜索不到结果。

镜像中有不同的标签,表明的软件的版本以及镜像的基础环境,例如redis镜像,有如下的版本: redis镜像列表

图中标识redis共有11个版本镜像,每个版本的镜像存在多个标签。包括3.0和3.2版本,32位和64位的使用环境,alpine和window等基础镜像环境等。

根据自身的需要选择合适自己的镜像

2. 帮助文档

使用镜像不是简单的run运行就可以,很多时候还需要添加一些必要的参数才能跑起来,如何找到这些参数应该如何配置呢?查看帮助文档,在镜像页面的下方通常都是帮助文档,镜像相关信息。下面是redis镜像的帮助文档

redis镜像使用帮助

3. 镜像源码

如果看帮助文档找不到自己想要看的帮助,或者想要知道镜像的整个构建使用过程,可以查看镜像的源码。

在镜像列表中,选择自己想要使用的镜像,点击旁边的Dockerfie连接,将会跳转到该镜像的git项目中。

在项目页面,我们可以看到redis的Dokcerfile文件,了解镜像做了什么操作,还可以找到镜像的启动脚本entrypoint.sh等

redis项目

下载源码,我们也可以自己编译redis镜像。

4. 定制自己的镜像

如果镜像官方的镜像不能满足你的特别要求,这时候你需要自己定制镜像,下面我拿我自己定制的redis镜像做个例子。

我的需求是redis可以配置maxclient,maxmemory等参数 首先参考官网的镜像帮助文档,redis的配置文件放在容器/usr/local/etc/redis/redis.conf文件夹下。

编写redis.conf文件

#daemonize yes

pidfile  /var/run/redis.pid 

port 6379

tcp-backlog 511

timeout  300

tcp-keepalive 300

loglevel notice

logfile ""

databases 16

save 900 1
save 300 10
save 60 10000

stop-writes-on-bgsave-error yes

rdbcompression yes

rdbchecksum yes

dbfilename dump.rdb

dir /data/

slave-serve-stale-data yes

slave-read-only yes

repl-disable-tcp-nodelay no

slave-priority 100

# maxmemory <bytes>

# maxmemory-policy volatile-lru

# maxmemory-samples 3

appendonly no

appendfilename "appendonly.aof"

appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

lua-time-limit 5000

slowlog-log-slower-than 10000

slowlog-max-len 128

notify-keyspace-events ""


hash-max-ziplist-entries 512
hash-max-ziplist-value 64


list-max-ziplist-entries 512
list-max-ziplist-value 64

set-max-intset-entries 512

zset-max-ziplist-entries 128
zset-max-ziplist-value 64

activerehashing yes

client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

hz 10
aof-rewrite-incremental-fsync yes

注意,redis.conf文件中有两个需要注意的地方:

  • daemonize参数设置为no 或者注释掉,如果设置为yes,则容器启动就会结束,因为没有前台进程。
  • bind 不要设置为127.0.0.1 注释掉,测试发现设置127.0.0.1会出现服务访问被拒绝的情况。

编写自己的启动脚本entrypoint.sh

在原redis镜像的entrypoint.sh做修改。

#!/bin/sh
set -e

# first arg is `-f` or `--some-option`
# or first arg is `something.conf`
if [ "${1#-}" != "$1" ] || [ "${1%.conf}" != "$1" ]; then
	set -- redis-server "$@"
fi

# allow the container to be started with `--user`
if [ "$1" = 'redis-server' -a "$(id -u)" = '0' ]; then
	chown -R redis .
	exec gosu redis "$0" "$@"
fi

#环境变量替换部分参数
set_config(){
	if   [  $TIMEOUT ]; then 
		sed -i 's/^timeout .*/timeout '"$TIMEOUT"'/g' /usr/local/etc/redis/redis.conf
	fi
	if   [  $DATABASES ]; then 
		sed -i 's/^databases .*/databases '"$DATABASES"'/g' /usr/local/etc/redis/redis.conf
	fi
	if   [  $MAX_CLIENTS ]; then 
		sed -i 's/^# maxclients.*/maxclients'"$MAX_CLIENTS"'/g' /usr/local/etc/redis/redis.conf
	fi

	#内存限制设置
	local limit_in_bytes=$(cat /sys/fs/cgroup/memory/memory.limit_in_bytes)
	if [ "$limit_in_bytes" -ne "9223372036854771712" ]; then
    		local limit_in_megabytes=$(expr $limit_in_bytes \/ 1048576)   	
		sed -i 's/^# maxmemory .*/maxmemory '"$limit_in_megabytes"'/g' /usr/local/etc/redis/redis.conf
		#开启内存限制最好指定清理策略
		if   [  $MAX_MEMORY_POLICY ]; 
			then 
				sed -i 's/^# maxmemory-policy.*/maxmemory-policy '"$MAX_MEMORY_POLICY"'/g' /usr/local/etc/redis/redis.conf
			else
				sed -i 's/^# maxmemory-policy.*/maxmemory-policy volatile-lru/g' /usr/local/etc/redis/redis.conf
		fi	
	fi
	if   [  $MAX_MEMORY ]; then 
		sed -i 's/^# maxmemory .*/maxmemory '"$MAX_MEMORY"'/g' /usr/local/etc/redis/redis.conf
		#开启内存限制最好指定清理策略
		if   [  $MAX_MEMORY_POLICY ]; 
			then 
				sed -i 's/^# maxmemory-policy.*/maxmemory-policy '"$MAX_MEMORY_POLICY"'/g' /usr/local/etc/redis/redis.conf
			else
				sed -i 's/^# maxmemory-policy.*/maxmemory-policy volatile-lru/g' /usr/local/etc/redis/redis.conf
		fi
	fi
}


set_config && exec "$@"

脚本中set_config方法是我进行参数替换的部分,通过传入环境变量替换配置文件中的参数。注意,这里会存在两个问题。

  • 容器重复启动,配置文件是否变化?entrypoint.sh是每次启动容器都会执行的脚本,第一次启动容器,和第n次启动容器,执行脚本的结果是否会导致配置文件不一样?
  • 权限问题,redis创建了一个redis用户用于执行redis进程,而dockerfile创建的文件夹是root权限的,那么sed命令无法在该文件夹下使用,因为redis用户无法在该文件夹下创建临时文件。(这个问题可以在Dockerfile中解决)

编写Dockfile文件

FROM redis:3.0.7
MAINTAINER shijieming@lutongnet.com
COPY redis.conf /usr/local/etc/redis/redis.conf
RUN chown -R redis /usr/local/etc/redis
COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
CMD [ "redis-server" , "/usr/local/etc/redis/redis.conf" ]
  1. 使用了redis:3.0.7作为基础镜像
  2. 添加本地的redis.conf文件到容器相应目录
  3. 修改配置文件所在文件夹权限
  4. 添加本地的启动脚本,这里会覆盖原有的docker-entrypoint.sh
  5. 启动命令 使用配置文件启动

执行下面的命令生成镜像

$ docker build .
Sending build context to Docker daemon 10.75 kB
Step 1/6 : FROM redis:3.0.7
 ---> c44fa74ead88
Step 2/6 : MAINTAINER shijieming@lutongnet.com
 ---> Using cache
 ---> bfdd1371df83
Step 3/6 : COPY redis.conf /usr/local/etc/redis/redis.conf
 ---> Using cache
 ---> 0933f3eeba04
Step 4/6 : RUN chown -R redis /usr/local/etc/redis
 ---> Using cache
 ---> e2cd58419d3b
Step 5/6 : COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
 ---> Using cache
 ---> 88413869eef5
Step 6/6 : CMD redis-server /usr/local/etc/redis/redis.conf
 ---> Using cache
 ---> 082aa959aa4f
Successfully built 082aa959aa4f
$ docker tag 082aa959aa4f myredis:3.0.7

通过命令生成了自己定义的myredis:3.0.7镜像。

当然除了基于官方镜像做修改,还可以使用直接修改官方的Dockerfile文件等,也可以自行编写Dockerfile文件。

© 著作权归作者所有

无心灬快语
粉丝 0
博文 11
码字总数 10418
作品 0
深圳
程序员
私信 提问
(2) Docker镜像和仓库

查看镜像列表: docker images 或者 docker image ls ; 2. 拉取(某版本)镜像(ubuntu为例): docker pull ubuntu:14.04 ; 3. 查找某个镜像(ubuntu为例): docker search ubuntu ; 4. 构建镜像: 两......

ouhoo
2018/10/29
29
0
Docker容器管理平台Humpback进阶-私有仓库

Docker私有仓库 在 中,当我们执行 的时候,可能会比较好奇, 会去哪儿查找并下载镜像呢? 它实际上是从 这个地址去查找,这就是Docker公司为我们提供的公共仓库,上面的镜像,大家都可以看到...

a1010256340
2018/05/10
0
0
Openstack 之 使用disk-image-builder(DIB)制作镜像

上面左边是我的个人微信,如需进一步沟通,请加微信。 右边是我的公众号“Openstack私有云”,如有兴趣,请关注。 Openstack中的centos和ubuntu操作系统的镜像可以直接从社区直接下载下来使用...

余伟兵
2018/06/28
0
0
docker commit 定制镜像

概念 镜像是容器的基础,每次执行 docker run 的时候都会指定哪个镜像作为容器运行的基础。在之前的例子中,我们所使用的都是来自于 Docker Hub 的镜像。直接使用这些镜像是可以满足一定的需...

china_lx1
2017/07/05
0
0
gradle使用maven镜像仓库的方法

使用maven镜像仓库的方法大体上有两种 修改build.gradle 使用构建的项目,在项目的根目录下都会有一个文件,存储着构建的配置,其配置语法使用,所以熟悉的用户可以很轻松上手配置,包括修改...

Feng_Yu
2016/11/08
5.8K
0

没有更多内容

加载失败,请刷新页面

加载更多

zk中leader和follower启动时信息交互

QuorumPeer中读取节点状态信息,不同状态下设置不同角色 1 Leader启动Follower接收器LearnerCnxAcceptor LearnerCnxAcceptor负责接收非leader连接请求,线程中创建LearnerHandler处理器 2 Le...

writeademo
15分钟前
2
0
完美的Linux之【navi】使用笔记

今天要说的是才上线才两天,就已经获得超过1000星。开发者是一位来自巴西的小哥Denis Isidoro。 开发的工具navi Linux用户的日常困惑 > 新命令 用完就忘 ? > 一时想不起来命令的单词怎么拼?...

我们都很努力着
17分钟前
2
0
iptables删除命令中的相关问题

最近在做一个V**N中间件的配置工作,在配置iptables的时候,当用户想删除EIP(即释放当前连接),发现使用iptables的相关命令会提示错误。iptables: Bad rule (does a matching rule exist ...

Linux就该这么学
29分钟前
2
0
ExtJS 4.2 评分组件

本文转载于:专业的前端网站➸ExtJS 4.2 评分组件 上一文章是扩展ExtJS自带的Date组件。在这里将创建一个评分组件。 目录 1. 介绍 2. 示例 3. 资源下载 1. 介绍 代码参考的是 Sencha Touch 2...

前端老手
37分钟前
4
0
springboot2.0.6启动解析(四)观察器、启动的错报告、Headless模式相关分析

解析SpringApplication的run方法观察器、启动的错报告、Headless模式、监听器相关分析 public ConfigurableApplicationContext run(String... args) { // 构造一个任务执行观察器(Jav...

小亮89
44分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部