GVKun编程网logo

docker 使用 dockerfile 构建 redis 镜像(docker制作redis镜像)

92

本文将分享docker使用dockerfile构建redis镜像的详细内容,并且还将对docker制作redis镜像进行详尽解释,此外,我们还将为大家带来关于dockerDockerfile学习---

本文将分享docker 使用 dockerfile 构建 redis 镜像的详细内容,并且还将对docker制作redis镜像进行详尽解释,此外,我们还将为大家带来关于docker Dockerfile学习---构建redis环境、docker history 查看docker镜像构建过程 还原dockerfile 查看启动参数、Docker | Docker技术基础梳理(八) - Dockerfile定制镜像浅析、Docker | 使用dockerfile生成镜像,清理docker空间的相关知识,希望对你有所帮助。

本文目录一览:

docker 使用 dockerfile 构建 redis 镜像(docker制作redis镜像)

docker 使用 dockerfile 构建 redis 镜像(docker制作redis镜像)

FROM redis
WORKDIR /data
VOLUME /data

EXPOSE 6379
RUN echo "success---------success"

ENTRYPOINT redis-server --appendonly yes

 

. 拉取镜像,redis:4.0

docker pull redis:4.0
2. 创建 redis 容器名 "redistest1",并开启持久化

docker run -d -p 6379:6379 --name redistest1 redis:4.0 redis-server --appendonly yes
参数说明:

--appendonly yes:开启持久化

 

 
挂载外部配置和数据安装
1. 创建目录和配置文件 redis.conf

mkdir /docker
mkdir /docker/redis
mkdir /docker/redis/conf
mkdir /docker/redis/data

创建 redis.conf 配置文件
touch /docker/redis/conf/redis.conf

redis.conf 文件内容自行添加:
切记注释掉:#daemonize yes 否则无法启动容器
重要话说三遍:注释掉 #daemonize yes,注释掉 #daemonize yes,注释掉 #daemonize yes
2. 创建启动容器,加载配置文件并持久化数据

docker run -d --privileged=true -p 6379:6379 -v /docker/redis/conf/redis.conf:/etc/redis/redis.conf -v /docker/redis/data:/data --name redistest2 redis:4.0 redis-server /etc/redis/redis.conf --appendonly yes
参数说明:

--privileged=true:容器内的 root 拥有真正 root 权限,否则容器内 root 只是外部普通用户权限

-v /docker/redis/conf/redis.conf:/etc/redis/redis.conf:映射配置文件

-v /docker/redis/data:/data:映射数据目录

redis-server /etc/redis/redis.conf:指定配置文件启动 redis-server 进程

--appendonly yes:开启数据持久化

docker Dockerfile学习---构建redis环境

docker Dockerfile学习---构建redis环境

1、创建项目目录并下载包及文件

mkdir centos_redis
cd centos_redis
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
wget http://mirrors.aliyun.com/repo/epel-7.repo
wget http://mirrors.163.com/.help/CentOS7-Base-163.repo

tar -zxf redis-5.0.5.tar.gz

 

2、编辑Dockerfile

FROM centos:latest

MAINTAINER xiaozhou (xiaozhou@docker.com)

LABEL Discription="基于centos的redis镜像" version="1.0"

RUN rm /etc/yum.repos.d/*
ADD redis-5.0.5 /data/usr/src/redis
ADD CentOS7-Base-163.repo /etc/yum.repos.d
ADD epel-7.repo /etc/yum.repos.d
RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 \
&& yum provides ''*/applydeltarpm'' && yum install deltarpm -y \
&& yum install -y gcc gcc-c++ automake autoconf libtool make \
&& cd /data/usr/src/redis \
&& make PREFIX=/data/usr/redis install MALLOC=libc \
&& mkdir /data/usr/redis/{run,conf,logs,data} \
&& cp /data/usr/src/redis/redis.conf /data/usr/redis/conf/ \
&& sed -i "s/bind 127.0.0.1/bind 0.0.0.0/" /data/usr/redis/conf/redis.conf \
&& sed -i "s/daemonize no/daemonize yes/" /data/usr/redis/conf/redis.conf \
&& sed -i "s#pidfile /var/run/redis_6379.pid#pidfile /data/usr/redis/run/redis_6379.pid#" /data/usr/redis/conf/redis.conf \
&& sed -i ''s#logfile ""#logfile "/data/usr/redis/logs/redis.log"#'' /data/usr/redis/conf/redis.conf \
&& sed -i "s#dir ./#dir /data/usr/redis/data#" /data/usr/redis/conf/redis.conf \
&& sed -i "s/# requirepass foobared/requirepass Redis2019\!/" /data/usr/redis/conf/redis.conf

ENV REDIS_HOME=/data/usr/redis
ENV PATH=$PATH:$REDIS_HOME/bin
View Code

 

3、构建镜像

docker build -t centos:redis .

 

4、启动容器

docker run --name redis -d -p 6379:6379 -it centos:redis

 

5、启动服务

进入容器

docker exec -it  container_id

redis-server /data/usr/redis/conf/redis.conf

docker history 查看docker镜像构建过程 还原dockerfile 查看启动参数

docker history 查看docker镜像构建过程 还原dockerfile 查看启动参数

介绍:

~]# docker history --help
Usage:  docker history [OPTIONS] IMAGE
Show the history of an image
Options:
      --format string   Pretty-print images using a Go template
      --help            Print usage
  -H,--human           Print sizes and dates in human readable format (default true)
      --no-trunc        Don't truncate output
  -q,--quiet           Only show numeric IDs

示例:

~]# docker history kubeguide/tomcat-app:v1
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
a29e200a18e9        2 years ago         /bin/sh -c #(nop) ADD dir:c5c3bddef49cbc9f...   992kB               
<missing>           2 years ago         /bin/sh -c #(nop) MAINTAINER bestme <bestm...   0B                  
<missing>           2 years ago         /bin/sh -c #(nop) CMD ["catalina.sh" "run"]     0B                  
<missing>           2 years ago         /bin/sh -c #(nop) EXPOSE 8080/tcp               0B                  
<missing>           2 years ago         /bin/sh -c set -e  && nativeLines="$(catal...   0B                  
<missing>           2 years ago         /bin/sh -c set -x   && curl -fSL "$TOMCAT_...   16.6MB              
<missing>           2 years ago         /bin/sh -c #(nop) ENV TOMCAT_TGZ_URL=https...   0B                  
<missing>           2 years ago         /bin/sh -c #(nop) ENV TOMCAT_VERSION=8.0.35     0B                  
<missing>           2 years ago         /bin/sh -c #(nop) ENV TOMCAT_MAJOR=8            0B                  
<missing>           2 years ago         /bin/sh -c set -ex  && for key in   05AB33...   114kB               
<missing>           2 years ago         /bin/sh -c apt-get update && apt-get insta...   7.18MB              
<missing>           2 years ago         /bin/sh -c {   echo 'deb http://httpredir....   172B                
<missing>           2 years ago         /bin/sh -c #(nop) ENV OPENSSL_VERSION=1.0....   0B                  
<missing>           2 years ago         /bin/sh -c #(nop) workdir /usr/local/tomcat     0B                  
<missing>           2 years ago         /bin/sh -c mkdir -p "$CATALINA_HOME"            0B                  
<missing>           2 years ago         /bin/sh -c #(nop) ENV PATH=/usr/local/tomc...   0B                  
<missing>           2 years ago         /bin/sh -c #(nop) ENV CATALINA_HOME=/usr/l...   0B                  
<missing>           2 years ago         /bin/sh -c set -x  && apt-get update  && a...   163MB               
<missing>           2 years ago         /bin/sh -c #(nop) ENV JAVA_DEBIAN_VERSION=...   0B                  
<missing>           2 years ago         /bin/sh -c #(nop) ENV JAVA_VERSION=7u101        0B                  
<missing>           2 years ago         /bin/sh -c #(nop) ENV JAVA_HOME=/usr/lib/j...   0B                  
<missing>           2 years ago         /bin/sh -c {   echo '#!/bin/sh';   echo 's...   87B                 
<missing>           2 years ago         /bin/sh -c #(nop) ENV LANG=C.UTF-8              0B                  
<missing>           2 years ago         /bin/sh -c apt-get update && apt-get insta...   1.17MB              
<missing>           2 years ago         /bin/sh -c apt-get update && apt-get insta...   44.3MB              
<missing>           2 years ago         /bin/sh -c #(nop) CMD ["/bin/bash"]             0B                  
<missing>           2 years ago         /bin/sh -c #(nop) ADD file:5d8521419ad6cfb...   125MB

如果要让CREATED BY 列完整显示,可以加上 --no-trunc 参数。直接在shell中看会比较乱,可以输出到文件查看,就比较直观了

以PHPmyadmin docker镜像为例,效果如下:

 

 

 

 

Docker | Docker技术基础梳理(八) - Dockerfile定制镜像浅析

Docker | Docker技术基础梳理(八) - Dockerfile定制镜像浅析

图片

什么是Dockerfile?

Dockerfile其实就是根据特定的语法格式撰写出来的一个普通的文本文件,可以使用docker build命令依次执行在Dockerfile中定义的一系列命令,最终生成一个新的镜像

如果你想要定制属于自己的镜像Dockerfile是你必不可少的工具。

docker build的使用

想要构建定制化的镜像,可以使用docker build运行Dockerfile构建镜像

命令格式: docker build [参数] PATH | URL

其中:

PATH 是Dockerfile所在路径

URL 是Dockerfile所在的URL

常用参数:

-t 为镜像设置名称和tag(不适用-t参数,创建出来的镜像名称以及版本为none)
-f 指定Dockerfile的路径(这是可以使用其他名称命名Dockerfile)

关于Dockerfile构建过程的浅析

在之前关于Docker镜像与容器的文章中,咸鱼对镜像的文件系统做了一个简单的解释,不熟悉的朋友可以再温习一下。

Docker | Docker技术基础梳理(四) - 深入理解镜像与容器

我们先看下可以直接使用的Dockerfile结构是什么样的:

图片

现在简单讲讲咸鱼对Dockerfile构建过程的理解:

Dockerfile的执行顺序是自上而下进行的,当第一次使用Dockerfile构建镜像时Dockerfile中的全部命令都会执行一遍最后构建为一个完整的镜像。

在构建的过程中,每执行一条命令Docker都会执行一次commit命令,接下来的每一条命令都是在前面所有命令集成的镜像基础上再次执行的。

这样的执行有什么好处呢,假设当你执行过一次的镜像构建后想要在Dockerfile中间部分添加一行Dockerfile的命令,那么在执行新的Dockerfile命令时,Docker只会执行新增命令(包括新增命令)之后的构建命令,大大减少了性能的损耗。

Dockerfile常用命令解析

接下来就是关于Dockerfile命令的介绍更多实例可以参考官方的Dockerfile实例:https://github.com/docker-library/docs

关于Dockerfile命令的介绍也可以参考:https://docs.docker.com/engine/reference/builder/#usage

RUN

构建镜像过程中需要执行的命令,可以执行多条

同时RUN命令后可以使用两种形式输入要执行的命令 exec与shell

当使用exec方式输入执行的命令时,命令格式是json格式的,命令在当前进程执行

当使用shell方式输入执行的命令时,命令在子进程中执行(推荐使用shell方式)

CMD与ENTRYPOINT

CMD是添加启动容器是需要执行的命令,多条命令只有最后一条生效,可以在启动容器事被覆盖和修改。
CMD命令格式有三种,exec、shell、默认提供给ENTRYPOINT的命令

  • 命令格式为shell形式,命令是以子进程的形式执行

  • 命令格式为json形式,命令在当前进程执行(推荐使用)

  • 命令格式为json形式,且所有json内容为参数形式,则默认提供给ENTRYPOINT

ENTRYPOINT的使用CMD与相同,但这个一定会被执行,且不会被覆盖和修改

LABEL与MAINTAINER

LABEL用于为镜像添加对应的数据

添加的数据格式为:LABEL key=value …. Key=value

MAINTAINER:用于表示镜像的作者(即将被遗弃使用)

ENV与ARG

ENV用于设置执行命令时的环境变量,并且在构建完成后,仍然生效

ARG用于设置只在构建过程中使用的环境变量,构建完成后消失

ADD与copY

ADD用于将本地文件或目录拷贝到镜像的文件系统中,且能解压特定格式文件,且能将URL作为要拷贝的文件(会先将URL的文件先下载下来再拷贝)

copY将本地文件或目录拷贝到镜像的文件系统中(推荐使用copY+RUN),因为ADD命令对于需要解压的文件支持的不是非常智能

VOLUME

添加数据卷

命令格式可以为数组格式,也可以直接接上路径,路径为容器或镜像中的路径
常用命令行格式为:

VOLUME [“/XXX”]

VOLUME /XXX

USER与workdir

USER指定以哪个用户的名义执行RUN,CMD和ENTRPOINT等命令

workdir设置工作目录

简单实例构建Kafka工作环境

version: '2'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    environment:
      ZOOKEEPER_CLIENT_PORT: 32181
      ZOOKEEPER_TICK_TIME: 2000

  kafka:
    image: confluentinc/cp-kafka:latest
    depends_on:
      - zookeeper
    ports:
      - 9092:9092
    environment:
      KAFKA_broKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:32181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
      KAFKA_LISTENER_Security_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_broKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

这里咸鱼有一个建议,如果当你需要构建某一工作环境但毫无头绪时,在Github上以“xxxt docker”为关键字搜索,希望结果能让你满意。

图片

图片

图片

咸鱼学Python

专注于Python商业化爬虫、Python数据科学的咸鱼

Docker | 使用dockerfile生成镜像,清理docker空间

Docker | 使用dockerfile生成镜像,清理docker空间

dockerfile生成镜像并挂载数据卷

编写dockerfile文件

  1. 创建dockerfile01 文件
# 基础镜像
FROM centos

VOLUME ["volume01", "volume02"]

CMD echo "-----end----"
  1. docker build 构建镜像
docker build -f ./dockerfile01 -t xiao-centos .

  1. 启动镜像
docker run -it 镜像ID /bin/bash

可以看到生成镜像时自动挂载的,数据卷目录

以上dockerfile方式属于匿名挂载数据卷

清理docker使用空间

我个人使用的是单核2G的云服务器,用了快三年了,内存、cpu严重吃紧,所以就尝试了清理docker使用空间,主要是删除未使用过的镜像、容器、数据卷、网络命令,具体如下:

官方文档链接 https://docs.docker.com/config/pruning/

  • 执行如下可以查看 Docker 的磁盘使用情况(类似于 Linux 上的 df 命令)
docker system df
  • 删除所有未使用过的镜像
docker image prune -a
  • 删除所有停止的容器

    docker container prune
    docker rm -f $(docker ps -aq)
  • 仅删除超过 24 小时的停止容器
docker container prune --filter "until=24h"
数据卷永远不会自动删除,因为这样做可能会破坏数据
  • 删除未使用的数据卷
docker volume prune
  • 删除没有使用过的网络
docker network prune
  • 删除所有未使用过的资源
docker system prune

手动删除/var/lib/docker/volumes的问题解决

当时清理docker使用空间的时候,清过头了,一下子把挂载的数据卷也给顺手清理了,真是自己给自己找事做。

错误信息

手动删除了挂载到宿主机上的所有数据卷,在启动容器挂载数据卷的时候就会报错

如下,重新运行容器,原先具名挂载数据卷juming-nginx,报错信息如下

docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx nginx

docker: Error response from daemon: open /var/lib/docker/volumes/juming-nginx/_data: no such file or directory.

尝试方法一(不建议使用):

  1. 删除所有容器
  2. 删除所有镜像
  3. 重新运行一个新的容器并挂载数据卷

    # 1
    docker rm -f $(docker ps -aq)
    
    # 2
    docker rmi -f $(docker images -aq)
    
    # 3.
    docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx nginx
    
    # 还是报错

结论:

无法解决问题,且删除所有容器、镜像存在的风险较大,不建议使用!

尝试方法二(推荐使用):

  1. 停止docker服务
  2. 重新启动docker服务
  3. 再次运行容器
# 1
systemctl stop docker

# 2
systemctl restart docker

# 3
docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx nginx

# 没有报错,docker ps查看 成功运行

结论

没有报错,docker ps查看,成功运行

docker volume ls 查看镜像,可以看到具名数据卷juming-nginx已显示出来了

docker volume ls
DRIVER    VOLUME NAME
local     a9b39215509378332ec9dfcdc3e10857b500694ea66efd9c2b7a6a9c55a2f10a
local     juming-nginx

我是 甜点cc

热爱前端,也喜欢专研各种跟本职工作关系不大的技术,技术、产品兴趣广泛且浓厚,等待着一个创业机会。本号主要致力于分享个人经验总结,希望可以给一小部分人一些微小帮助。

希望能和大家一起努力营造一个良好的学习氛围,为了个人和家庭、为了我国的互联网物联网技术、数字化转型、数字经济发展做一点点贡献。数风流人物还看中国、看今朝、看你我。

关于docker 使用 dockerfile 构建 redis 镜像docker制作redis镜像的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于docker Dockerfile学习---构建redis环境、docker history 查看docker镜像构建过程 还原dockerfile 查看启动参数、Docker | Docker技术基础梳理(八) - Dockerfile定制镜像浅析、Docker | 使用dockerfile生成镜像,清理docker空间等相关内容,可以在本站寻找。

本文标签: