原文地址:https://www.linuxea.com/2270.html
如果有这样以一个场景。我使用docker run
启动了一个redis容器
,而docker run
的参数有很多,由于时间太久,我已经忘记了当初的启动参数,也并没有使用 docker-compose
这样的编排工具。现在我如何进行重启,如何找回此前的启动命令?
使用docker run
启动一个容器:
1 2 3 4 5 6 7 8 9 10 11 12 13 docker run \ --detach \ --env REDIS_CONF=on \ --env REQUIRE_PASS=OTdmOWI4ZTM4NTY1M2M4OTZh \ --env MASTER_AUTH=OTdmOWI4ZTM4NTY1M2M4OTZh \ --env MAXCLIENTS_NUM=30 \ --net=host \ --env MAXMEMORY_SIZE=1024M \ --publish 6379:6379 \ --volume linuxea_volume \ --name linuxea_redis \ --tty --interactive \ marksugar/redis:5.0.0
docker命令查看 首先,我们查看启动的脚本参数和完整的命令
使用 docker ps -a --no-trunc
docker ps -a --no-trunc
可以打印docker ps -a
的隐藏部分,但是这并不能看到我们run的参数
1 2 3 4 [root@LinuxEA-172 _25_50_250 ~] CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c32bc1bba3a0f8d59e3bd96648838399287ee183ddbff1ca1293ccbc933c8ede marksugar/redis:5.0 .0 "/Initialization.sh" 8 minutes ago Up 8 minutes linuxea_redis 1 d848a10149325e6fb46ef5fa0624812ab12f28263535720d79aa564a5551e45 marksugar/nginx_createrepo:v0.2 "entrypoint.sh" 13 days ago Up 13 days nginx_repo
docker inspect 此时,我们试图找回上述的docker run
命令,使用docker inspect
,但是docker inspect
打印的是json文件,我们需要挑选字段查看
1 2 3 [root@LinuxEA-172 _25_50_250 ~] /linuxea_redis /Initialization.sh [] [] [REDIS_CONF=on REQUIRE_PASS=OTdmOWI4ZTM4NTY1M2M4OTZh MASTER_AUTH=OTdmOWI4ZTM4NTY1M2M4OTZh MAXCLIENTS_NUM=30 MAXMEMORY_SIZE=1024 M PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin RS_VSON=5.0 .0 RS_USER=redis RS_VSON_URL=http://download.redis.io/releases/redis-5.0 .0 .tar.gz BATADIR=/usr/local/redis DATADIR=/data/redis DATALOG=/data/logs DATACIG=/etc/redis] map[linuxea_volume:{}] [/Initialization.sh] map[host:0 xc420182000] /nginx_repo entrypoint.sh [] [] [USERNAME=marksugar FTPPASSWD=123 FTPDATA=/data/wwwroot SERVER_NAME=meftp.ds.com NGINX_PORT=80 WELCOME="welome to linuxea.com" PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin version=1.14 .2 USER =www INSTALL_PATH=/usr/local WWWPATH=/data/wwwroot] map[/tmp/header.html:{} /data:{} /etc/localtime:{} /etc/nginx/nginx.conf:{} /etc/nginx/vhost:{} /tmp/footer.html:{}] [entrypoint.sh] map[host:0 xc42044c000]
这样的显示并不直观。好在我发现了rekcod
和runlike
这两个逆转docker run
命令,参见本章介绍和使用。runlike
更漂亮些
rekcod 借助rekcod
打印出更易读的格式,docker inspect
→ docker run
docker run
从现有容器(via docker inspect
)反向设计命令。
rekcod
可以将以下任何内容转换为docker run
命令:
容器ID /名称(rekcod
将调用docker inspect
)
包含docker inspect
输出的文件的路径
原始JSON(docker inspect
直接传递输出)
每个docker run
命令都可用于复制容器。
这不是非常强大,但它应该涵盖所需的大多数参数。请参阅下面支持的字段
传递容器ID /名称时,此模块docker inspect
直接调用,运行它的用户也应该能够。
开始安装
1 2 yum install npm -y npm i -g rekcod
1 2 $ docker pull nexdrew/rekcod $ alias rekcod="docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nexdrew/rekcod"
或者你可以简单地运行它,不需要安装:
1 $ docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nexdrew/rekcod <container>
开始使用 以使用linuxea_redis
容器为例,rekcod linuxea_redis
,如下:
1 [root@LinuxEA-172 _25_50_250 ~]
或者这样
1 2 3 [root@LinuxEA-172 _25_50_250 ~] docker run --name linuxea_redis --runtime runc -p 6379:6379/tcp --net host --restart no -h LinuxEA-Node172_25_50_250.cluster.com --expose 26379/tcp --expose 6379/tcp -e 'REDIS_CONF=on' -e 'REQUIRE_PASS=OTdmOWI4ZTM4NTY1M2M4OTZh' -e 'MASTER_AUTH=OTdmOWI4ZTM4NTY1M2M4OTZh' -e 'MAXCLIENTS_NUM=30' -e 'MAXMEMORY_SIZE=1024M' -e 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' -e 'RS_VSON=5.0.0' -e 'RS_USER=redis' -e 'RS_VSON_URL=http://download.redis.io/releases/redis-5.0.0.tar.gz' -e 'BATADIR=/usr/local/redis' -e 'DATADIR=/data/redis' -e 'DATALOG=/data/logs' -e 'DATACIG=/etc/redis' -d -t -i --entrypoint "/Initialization.sh" marksugar/redis:5.0.0
我将结果换行查看,并且进行启动 这里不得不说的是,在runlike中,可以使用-q自动换行 .见下文
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 docker run --name linuxea_redis \ -p 6379:6379/tcp \ --net host \ --restart no \ -h LinuxEA-Node172_25_50_250.cluster.com \ --expose 26379/tcp \ --expose 6379/tcp \ -e 'REDIS_CONF=on' \ -e 'REQUIRE_PASS=OTdmOWI4ZTM4NTY1M2M4OTZh' \ -e 'MASTER_AUTH=OTdmOWI4ZTM4NTY1M2M4OTZh' \ -e 'MAXCLIENTS_NUM=30' \ -e 'MAXMEMORY_SIZE=1024M' \ -e 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' \ -e 'RS_VSON=5.0.0' \ -e 'RS_USER=redis' \ -e 'RS_VSON_URL=http://download.redis.io/releases/redis-5.0.0.tar.gz' \ -e 'BATADIR=/usr/local/redis' \ -e 'DATADIR=/data/redis' \ -e 'DATALOG=/data/logs' \ -e 'DATACIG=/etc/redis' \ -d -t -i --entrypoint "/Initialization.sh" marksugar/redis:5.0.0
启动成功
1 2 3 4 [root@LinuxEA-172 _25_50_250 ~] CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 492 f6cdc159c marksugar/redis:5.0 .0 "/Initialization.sh" 4 seconds ago Up 3 seconds linuxea_redis1 d848a101493 marksugar/nginx_createrepo:v0.2 "entrypoint.sh" 13 days ago Up 13 days nginx_repo
1 2 3 4 5 6 7 8 9 [root@LinuxEA-172 _25_50_250 ~] [i] Start configuration /etc/redis [ok] /etc/redis/redis.conf config ready [ok] Start variable substitution REDIS_CONF=on [ok] Replace the maxclients=30 variable value [ok] Replace the maxmemory=1024 M variable value [ok] Replace the requirepass=OTdmOWI4ZTM4NTY1M2M4OTZh variable value [ok] Replace the masterauth=OTdmOWI4ZTM4NTY1M2M4OTZh variable value [i] Start up /usr/local/bin/redis-server /etc/redis/redis.conf
runlike 我仍然要提一下runlike ,和rekcod 有一样的作用
本地安装使用
1 runlike <container-name>
这打印出你需要运行什么来获得类似的容器。你可以$(runlike container-name)
一步完成其输出。如下:
1 2 [root@LinuxEA-172 _25_50_250 ~] docker run --name=linuxea_redis --hostname=LinuxEA-Node172_25_50_250.cluster.com --env =REDIS_CONF=on --env =REQUIRE_PASS=OTdmOWI4ZTM4NTY1M2M4OTZh --env =MASTER_AUTH=OTdmOWI4ZTM4NTY1M2M4OTZh --env =MAXCLIENTS_NUM=30 --env =MAXMEMORY_SIZE=1024M --env =PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin --env =RS_VSON=5.0.0 --env =RS_USER=redis --env =RS_VSON_URL=http://download.redis.io/releases/redis-5.0.0.tar.gz --env =BATADIR=/usr/local/redis --env =DATADIR=/data/redis --env =DATALOG=/data/logs --env =DATACIG=/etc/redis --volume=linuxea_volume --network=host -p 6379:6379 --restart=no --detach=true -t marksugar/redis:5.0.0
-p
将命令行分解为漂亮漂亮的行。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 [root@LinuxEA-172 _25_50_250 ~] docker run \ --name=linuxea_redis \ --hostname=LinuxEA-Node172_25_50_250.cluster.com \ --env =REDIS_CONF=on \ --env =REQUIRE_PASS=OTdmOWI4ZTM4NTY1M2M4OTZh \ --env =MASTER_AUTH=OTdmOWI4ZTM4NTY1M2M4OTZh \ --env =MAXCLIENTS_NUM=30 \ --env =MAXMEMORY_SIZE=1024M \ --env =PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \ --env =RS_VSON=5.0.0 \ --env =RS_USER=redis \ --env =RS_VSON_URL=http://download.redis.io/releases/redis-5.0.0.tar.gz \ --env =BATADIR=/usr/local/redis \ --env =DATADIR=/data/redis \ --env =DATALOG=/data/logs \ --env =DATACIG=/etc/redis \ --volume=linuxea_volume \ --network=host \ -p 6379:6379 \ --restart=no \ --detach=true \ -t \ marksugar/redis:5.0.0
docker使用 runlike
被封装为一个名为assaflavie / runlike 的Docker镜像。
1 2 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \ assaflavie/runlike YOUR-CONTAINER
或者您可以使用别名运行它,例如,将其保存在~/.profile
或中~/.bashrc
1 alias runlike="docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike"
然后您可以直接以本地命令运行
docker-compose 事实上这样的方式,我并不推荐,你大可不必这样 麻烦,直接使用docker-compose就可以完成简单的编排,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 version: '2' services: redis: image: marksugar/redis:5.0 .0 container_name: redis restart: always network_mode: "host" privileged: true environment: - REDIS_CONF=on - REQUIRE_PASS=OTdmOWI4ZTM4NTY1M2M4OTZh - MASTER_AUTH=OTdmOWI4ZTM4NTY1M2M4OTZh - MAXCLIENTS_NUM=600 - MAXMEMORY_SIZE=4096 M volumes: - /etc/localtime:/etc/localtime:ro - /data/redis-data:/data/redis:Z - /data/logs:/data/logs