docker配置redis集群和scrapyd服务

Redis集群的配置方式我们上一篇已经介绍过了,而且使用Dockerfile配置文件我们也介绍了,不过介绍的并不详细,可能有些人看不明白,这篇我们再介绍一些Docker的一些常用命令。

Redis集群的Docker部署

我们已经有了Docker利器,环境部署自然是要使用了。那么让我们先思考一下,redis集群配置中需要绑定本机IP,而我们拉起容器时IP是随机的,那么我们必须要固定docker容器ID。

固定docker容器IP地址

首先我们要查看一下拉起的容器IP地址

查看docker容器IP
docker inspect 容器ID |grep IPA

要固定IP我们先了解一下Docker的网络模式
Docker安装后,默认会创建下面三种网络类型:

docker配置redis集群和scrapyd服务_第1张图片

bridge
host
none

启动 Docker的时候,用--net参数,可以指定网络类型,如:
docker run -itd --name redis-16379 --net bridge --ip 172.18.0.2 -p 16379:6379 scrapy_redis:latest /bin/bash

  • bridge:桥接网络
    默认情况下启动的Docker容器,都是使用 bridge,Docker安装时创建的桥接网络,每次Docker容器重启时,会按照顺序获取对应的IP地址,这个就导致重启下,Docker的IP地址就变了

  • none:无指定网络
    使用 --network=none ,docker 容器就不会分配局域网的IP

  • host: 主机网络
    使用 --network=host,此时,Docker 容器的网络会附属在主机上,两者是互通的,也就是Docker容器中的端口会自动映射到主机。
    例如,在容器中运行一个Web服务,监听8080端口,则主机的8080端口就会自动映射到容器中。

我们要通过创建自定义网络的方式来设置固定IP

创建自定义网络:(设置固定IP)
启动Docker容器的时候,使用默认的网络是不支持指派固定IP的,如下:

  • 步骤1: 创建自定义网络
    创建自定义网络,并且指定网段:172.18.0.0/16
    docker network create --subnet=172.18.0.0/16 mynetwork

  • 步骤2: 创建Docker容器
    docker run -itd --name redis-scrapyd-1 --net mynetwork --ip 172.18.0.2 -p 16379:6379 -p 16800:6800 scrapy_redis:latest /bin/bash
    --net使用我们创建的网络模式,--ip指定容器IP地址,-p指定端口映射

使用GitHub创建docker镜像

docker build命令用来拉取镜像,而且可以指定使用git地址来创建镜像。例如我的Git地址:https://github.com/xingxingzaixian/docker_scrapy_redis_python3.6.git,大家都可以使用一下命令来创建镜像

  1. 创建镜像
docker build -t scrapyd_redis https://github.com/xingxingzaixian/docker_scrapy_redis_python3.6.git

镜像创建好了,可以创建自定义网络

  1. 创建自定义网络
docker network create --subnet=172.18.0.0/16 mynetwork

使用以下命令拉起容器:

  1. 拉起容器
docker run -itd --name redis-16379 --net mynetwork --ip 172.18.0.2 -p 16379:6379 -p 16800:6800 scrapy_redis:latest /bin/bash

拉起容器后,我们要修改redis启动配置文件的绑定IP

  1. 修改redis启动配置
    我在git中上传的redis.conf文件中bind配置为localhost,方便替换
docker exec 容器ID sed -i "s/localhost/172.18.0.3/g" /app/redis.conf

启动容器内scrapyd和redis服务

  1. 启动scrapyd和redis服务
docker exec -d 容器ID redis-server /app/redis.conf
docker exec -d 容器ID scrapyd

六个容器都启动以后,就可以启动Redis集群

  1. 启动Redis集群
    随便进入一个容器,执行启动Redis集群命令
/app/redis-stable/src/redis-trib.rb create --replicas 1 ip1:port1 ip2:port2 ip3:port3 ip4:port4 ip5:port5 ip6:port6 

然后我们就可以在本地通过远程访问云服务器的地址来访问redis集群

注意:

使用git地址创建的镜像中redis的配置文件绑定地址是固定的,如果我们在不同的主机上进行部署,那么容器的固定IP写成一样的还是可以的,但是如果是在同一个机器上就一定要修改容器内的redis.conf的绑定地址。

安装上面的步骤启动的是redis集群服务,如果想使用单独的redis服务,只要把redis.conf文件中集群相关的配置注释即可

# cluster-enabled yes(启动集群模式)
#cluster-config-file nodes-7000.conf(7000和port要对应)
# cluster-node-timeout 15000

容器的其他命令介绍

容器启动时执行命令的三种方式:

CMD:https://docs.docker.com/engine/reference/builder/#cmd

The CMD instruction has three forms:

  • CMD ["executable","param1","param2"] (exec form, this is the preferred form)
  • CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
  • CMD command param1 param2 (shell form)
    There can only be one CMD instruction in a Dockerfile. If you list more than one CMD then only the last CMD will take effect.

翻译过来就是:
CMD指令有三种形式:

  • CMD ["executable","param1","param2"](执行形式,这是首选形式)
  • CMD ["param1","param2"](作为ENTRYPOINT命令的默认参数)
  • CMD command param1 param2(shell形式)
    Dockerfile中只能有一个CMD指令。 如果列出多个CMD,则只有最后一个CMD才会生效。

CMD是容器的默认的执行语句。也就是说,如果在docker run命令没有指定任何的执行命令或者dockerfile里面也没有ENTRYPOINT命令,那么,就会执行CMD的默认命令。同时也从侧面说明了entrypoint的含义,它才是真正的容器启动以后要执行命令。
一种执行方式就是执行命令带参数,第二种就是只有参数,而这些参数将作为ENTRYPOINT命令的参数,当以第二种方式使用的时候,Dockerfile文件中必须包含一条ENTRYPOINT命令

当以第一种方式使用的时候,只有在docker run没有指定命令,并且也没有ENTRYPOINT命令的时候才作为默认命令执行,如果以上两者有任何一种存在,就不会执行此命令

ENTRYPOINT:https://docs.docker.com/engine/reference/builder/#entrypoint

ENTRYPOINT has two forms:

  • ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred)
  • ENTRYPOINT command param1 param2 (shell form)

An ENTRYPOINT allows you to configure a container that will run as an executable.

翻译过来:
ENTRYPOINT有两种形式:
ENTRYPOINT ["executable", "param1", "param2"] (执行形式,首选)
ENTRYPOINT command param1 param2 (shell形式)

此命令是官方推荐的容器启动时命令,即使在docker run中有指定命令的情况下,它依然会被执行,一般情况下不会被覆盖,除非我们显示的在docker run命令中指定--entrypoint参数,这个命令才会被覆盖
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run命令主要使用后面的command arg来传递启动命令和参数,可以替换Dockerfile中的CMD命令。如果想要传递多条命令可以使用docker run xxx sh -c "cd /app && ls && xxx"

查看容器内进程

docker top 容器ID
此命令查询出的进程ID与在容器内执行ps aux查询的进程ID不同

向容器内发送命令

docker exec -d 容器ID COMMAND
-d表示在后台执行,就是执行结果不会有任何显示,不加-d会显示命令执行结果,比如ls /
有时候使用上面三次命令执行方式会产生未知的错误。那么这个时候docker exec命令就派上用场了,我们拉起一个容器,在后台运行,然后不用进入容器,直接使用docker exec命令向容器内发生命令,启动某些服务,比如:docker exec -d 容器ID scrapyd,启动scrapyd服务

以当前容器创建新镜像

docker commit 容器ID 新镜像名
这种容器创建的方式我一般只用在容器调试的时候使用,先拉去一个基础镜像,然后拉起一个容器,安装好我们需要的软件和配置文件,可以将安装命令等写入Dockerfile文件中,上传到GitHub,以后就可以使用docker build去创建特定环境的镜像了。docker commit可以用于本地临时创建镜像使用

主机与容器相互拷贝文件

# 主机文件拷贝到容器中
docker cp 主机文件 容器ID:/app/目标文件

# 容器文件拷贝到主机
docker cp 容器ID:/app/目标文件 主机文件

如果你觉得我的文章还可以,可以关注我的微信公众号,查看更多实战文章:Python爬虫实战之路
也可以扫描下面二维码,添加我的微信公众号

docker配置redis集群和scrapyd服务_第2张图片
公众号

你可能感兴趣的:(docker配置redis集群和scrapyd服务)