Docker部署Redis集群----第二节(docker安装centos和指令讲解)

发布时间 2023-10-27 16:25:55作者: 我是小太阳,发光

1、安装docker

 

在安装前:先讲下,因为我们是在云服务上部署的,有时候会出现短时间不操作就会断开ssh远端连接记得加个心跳:
[root@instance-rttngj1u ~]# vim /etc/ssh/sshd_config
在末尾添加这两行代码
ClientAliveInterval 60
ClientAliveCountMax 3
再重启ssh就ok了。

1、更新yum源到最新版本执行update
  [root@instance-rttngj1u ~]# yum update
2、如果我们服务器上已经安装了,需要卸载老版本的docker
  [root@instance-rttngj1u ~]# yum  remove docker  docker-common docker-selinux  docker-engine
  *这里会出现  否继续?[y/N]:y 记得选择y
3、安装需要的软件包
  [root@instance-rttngj1u ~]# yum install -y yum-utils  device-mapper-persistent-data lvm2
4、设置yum源【解释下:docker有两个版本CE和EE,CE是社区版本(免费支持的周期是7个月),EE是企业版本
强调的是安全,付费使用,支持24个月,功能上要比CE多一点。这里呢我们选择免费版本CE】
  [root@instance-rttngj1u ~]# sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
5、查看docker版本
  [root@instance-rttngj1u ~]# yum list docker-ce --showduplicates|sort -r  
6、选择版本进行安装docker
  [root@instance-rttngj1u ~]# yum  install  docker-ce-18.03.1.ce -y
7、启动docker
  [root@instance-rttngj1u ~]# systemctl start docker
8、加入开机自启
  [root@instance-rttngj1u ~]# systemctl enable docker
9、配置国内镜像【这里我们选择阿里云】
  [root@instance-rttngj1u ~]# vi /etc/docker/daemon.json
  {
       "registry-mirrors": ["http://hub-mirror.c.163.com"]
  }
  退出保存
10、查看我们安装好的docker版本
  [root@instance-rttngj1u ~]# docker --version
到此我们的docker就安装成功了,是不是很简单呢?这里提供官方的Docker安装方法

官方Docker安装方法

2、docker安装后,正式开始学习docker指令

在讲指令前先介绍下Dockerfile,我们都是知道Docker是分层存储,而镜像的定制实际上就是定制每一层所添加的配置和文件,我们可以把每一层修改、安装、构建、操作的命令都写入到一个脚本中,并用这个脚本来构建、定制镜像。而Dockerfile的与生俱来的强大功能最适合构建镜像了。

构建镜像的命令:docker build [选项参数] <上下文路径/URL/>
例如后面我们将要学习构建redis-cluster集群的redis镜像:docker build -t redis-cluster .
在这里大家要理解docker build的命令最后面有一个点表示当前目录,首先得理解docker build 的工作原理
Docker在运行时就是服务端守护进程;当构建的时候,用户会指定构建镜像上下文的路径,docker命令在得知
这个路径后,会将路径下的所有内容【也就是Dockerfile同级目录下的文件内容】进行打包,然后上传到
Docker引擎,当Docker引擎收到这些上下包文件后,展开就会获得构建镜像所需要的一切文件。-----这么说
不知道还能不能理解。

 

下面开始介绍docker的十六大指令

1、RUN指令:RUN指令在定制镜像时是最常用的的指令之一
其有两种格式:
1、shell格式:RUN <命令> 就像直接在命令行输入命令一样
例如:docker run echo "hello Docker!"
2、exec格式:RUN ["可执行的文件","参数1",”参数2”…]
例如:RUN ["/bin/bash", "-c", "echo hello”]

注意:Dockerfile中的每一个指令都会建立一层,其run也是一样,每个run的行为都会在上一层命令的基础之上再次构建一层,我们要明白Docker是分层存储,层与层之间是相互耦合在一起的,我们自己在构建镜像的时候要保证所产出的镜像是纯净而不是臃肿非常多层次的,因为这样会大大增加部署时间同时也会很容易错误,一旦某个层崩了可以说整个镜像就是瘫了。切记。

2、COPY:复制文件,该指令将从构建的上下文目录中,<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置。<源路径>可以是多个,甚至是通配符,其通配符规则要满足GO的规则:
格式:COPY <源路径>…<目标路径>
     COPY ["源路径"]
例如:COPY package.json /usr/src/app/
     COPY hom* /mydirs/  ========>COPY上下文中所有以hom开头的文件
     COPY hom?.php /mydirs/  =====>COPY上下文中所有hom.php的文件如hom1.php、hom2.php

注意:<目标路径>可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以用WORKDIR指令来指定)。目标路径不需要事先创建,如果目录不在,COPY指令在复制文件前会先创建缺失的目录。其中COPY指令,源文件的各种元数据信息都会被复制。比如读、写、执行等权限和文件时间。

3、ADD:高级复制指令,ADD指令的性质和COPY基本上是一样的,只不过呢是在COPY指令的基础之上增加了一些功能,<源路径>可以是URL,此时Docker引擎会试图去下载这个链接中的文件放到<目标路径>中去。其下载后的文件权限自动设置为600,如果想更改权限需要RUN加一层进行权限调整。蛋疼的是如果下载的是压缩包,需要进行解压的话同样也需要加一层RUN进行解压,前面已经说过了,多一个RUN就会多一层构建累赘,不如直接使用RUN配合wget或curl。
格式:ADD <源路径>…<目标路径>
例如:ADD package.json /usr/src/app/
     ADD https://package.json /usr/src/app/

注意:若源路径为一个tar的压缩文件其压缩格式为gzip、bzip2、xz的情况,将会自动解压到目标路径。

4、CMD:容器启动命令,这里需要纠正一个问题,Docker不是虚拟机,是容器,而容器就是进程,既然是进程,在启动容器时,就需要指定运行的程序以及参数,而CMD指令就是用于指定默认的容器主进程的启动命令的。在运行时,同样也可以指定新的命令来代替镜像默认中的的命令如:docker run -it centos cat /etc/redhat-release。就是用cat /etc/redhat-release命令替换默认的 /bin/bash命令了,来输出系统的版本信息。
格式:shell 格式:CMD <命令>
     exec格式【推荐使用】:CMD ["可执行的文件","参数1",”参数2"…]
例如:CMD echo $HOME 在实际执行中就会变成下面的的格式
     CMD ["sh","-c",echo $HOME]

注意:在解析时会被解析为JSON数组,顾必须使用双引号""不能使用单引号,其中在使用exec时,实际的命令会被包装为sh -c的参数形式进行执行。通常有学者会将CMD写成 :

CMD service nginx start

然后发现执行了就立即退出了,就是因为没有理解容器和虚拟机的概念和差异,其实不难理解CMD service nginx start 相当于 CMD ["sh","-c","service nginx start"],由此可见主进层就是sh,当service nginx start 结束后,sh主进程也就结束了。自然容器退出了就不觉得奇怪了。正确的做法是直接执行nginx可执行文件,并且以前台的形式运行如

CMD ["nginx","-g","daemon off;”] 
或
CMD service nginx start && cat 这样写的目的是把命令卡在前台不让结束(有点暴力)
5、ENTRYPOINT:入口点,格式与CMD一样分为shell和exec格式,都是在指定容器启动程序及参数,ENTRYPOINT在运行时也可以被替代,单相比CMD要略显复杂繁琐点,需要通过dokcer run 的参数--entrypoint来指定。

注意:当指定了ENTRYPOINT后,CMD的含义就发生了改变,不再是直接的运行其命令,而是将CMD的内容作为参数传给ENTRYPOINT指令换而言之,其实际的执行将变成

<ENTRYPOINT> "<CMD>"
6、ENV:设置环境变量,环境变量一旦设定,后面所有运行时的应用都可以直接使用这里定义的环境变量
格式:ENV <key> <value>
     ENV <key1>=<value1> <key2>=<value2>…
例如:ENV VERSION=1.0 DEBUG=on \
     NAME="Happy Feet”

注意:当设置了环境变量以后,后面的一切指令,都可以直接使用这里定义的环境变量。

7、ARG:构建参数和ENV一样设置环境变量,不同的是,ARG所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。Dockerfile中的ARG指令是定义参数名称,以及定义其默认值,该默认值可以再构建命令docker build中--build-arg <参数名>=<值> 来覆盖。
格式:ARG <参数名>[=<默认值>]
例子:FROM centos:latest
     ARG CONT_IMG_VER
     ENV CONT_IMG_VER v1.0.0
     RUN echo $CONT_IMG_VER
     构建镜像时使用docker build —build-arg CONT_IMG_VER=v2.0.1 Dockerfile .
     在这种情况中,RUN指令解析CONT_IMG_VER变量的值为v1.0.0而不是ARG设置并由用户传递过来的v2.0.1
     如果想使用v2.0.1使用以下格式ARG和ENV的配合使用:
     FROM centos:latest
     ARG CONT_IMG_VER
     ENV CONT_IMG_VER ${CONT_IMG_VER:-v1.0.0}
     RUN echo $CONT_IMG_VER
     RG不像ENV,其值一直存在于镜像中

注意:不能使用ARG保存密码之类信息,因为docker history还是可以看到所有的值

8、VOLUME:定义匿名卷。
格式:VOLUME ["<路径1>", "<路径2>”…]
     VOLUME <路径>
例如:VOLUME /data

容器是基于镜像创建的,容器的文件系统包括镜像的只读层+可写层,容器中的进程操作的数据持久化都是保存在容器的
可写层上,一旦容器删除了数据自然就删除了;多个容器间数据还可以共享例如:
Docker run -d -v mydata:/data xxxx 
使用mydata这个命名卷挂载到 /data这个位置,替换了dockerfile中定义的匿名卷的挂载配置。 
9、EXPOSE:设置端口号
格式:EXPOSE <端口号1>
例如:EXPOSE 5379

是声明运行时容器提供服务端口,只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。 用处1:帮助镜像使用者理解这个镜像服务的守护端口,以便配置映射 用户2:运行时使用随机端口映射时,就是docker run -p 时,会自动随机映射EXPOSE的端口。

10、WORKDIR:指定工作目录,当工作目录被指定了,其后面各层的当前目录就被改成了指定的目录,如果目录不存在,该指令帮你创建目录
格式:WORKDIR <工作目录路径>
例如:WORKDIR /config
解释:当启动容器后,容器的工作目录就会定在/config目录中。就是用来指定工作目录,以后各层的当前目录就被改成指定的目录,如果该目录不存在,WORKDIR会帮你建立目录。
11、USER:指定当前用户
格式:USER <用户名>
例如:USER redis
解释:和WORKDIR一样,USER 改变之后层的执行RUN、CMD、ENTRYPOINT这类命令的身份,且USER必须在执行动作命令之前就建立好设定,否则无法进行切换。
12、HEALTHCHECK:健康检查
格式:HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
     HEALTHCHECK NONE:若基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
               --interval=<间隔>:两次健康检查的间隔,默认值为30秒;
               --timeout=<时长>:健康检查命令运行时间,超过设定时间视为失败,默认30秒
               --retries=<次数>:当连续失败指定次数后,则容器状态视为失败unhealthy,默认3次
例如:HEALTHCHECK —interval=5s —timeout=3s \
     CMD curl -fs http://localhost/ || exit 1
     这里是设置5秒检查一次(实际上该时间相对较长),如果健康检查命令超过3秒没有项目就视为失败并且使用curl -            fs http://localhost/ || exit 1 作为健康检查命令。
解释:健康检查 检查结果:健康healthy 反之不健康unhealthy
13、ONBUILD:一个乐于助人的指令
格式:ONBUILD <其他指令>
例如:ONBUILD COPY ./package.json /app
解释:特殊指令它后面跟的其他指令,比如RUN,COPY 等等,这些指令在当前镜像构建时并不会被执行,只有以当前镜像为基础镜像,去 构建下一级镜像的时候才会被执行。
    使用场景:需要构建多个镜像:可以把相同执行命令放在基础镜像中,然后再次进行构建,保证dockerfile 文件的唯一性为后面的维护做好基础。
14、MAINTAINER:定义镜像的作者
 格式:MAINTAINER <name>
15、STOPSIGNAL:当容器退出是给系统发送什么样的指令
格式:STOPSIGNAL docker already stop
16、LABEL:为镜像指定标签 LABEL会继承基础镜像的标签,当遇到相同的key,则会被覆盖。
格式:LABEL <key>=<value> …
例子:LABEL description="this is a \
     dog”