linuxea:如何复现查看docker run参数命令

如果有这样以一个场景。我使用docker run启动了了一个redis容器,而docker run的参数有很多,由于时间太久,我已经忘记了当初的启动参数,也并没有使用docker-compose这样的编排工具。现在我如何进行重启,如何找回此前的启动命令?


  • 示例

使用docker run启动一个容器,

 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

I. docker COMMAND完整命令查看

首先,我们查看启动的脚本参数和完整的命令

使用 docker ps -a --no-trunc

docker ps -a --no-trunc可以打印docker ps -a的隐藏部分,但是这并不能看到我们run的参数

[[email protected]_25_50_250 ~]# docker ps -a --no-trunc
CONTAINER ID                                                       IMAGE                             COMMAND                CREATED             STATUS              PORTS               NAMES
c32bc1bba3a0f8d59e3bd96648838399287ee183ddbff1ca1293ccbc933c8ede   marksugar/redis:5.0.0             "/Initialization.sh"   8 minutes ago       Up 8 minutes                            linuxea_redis
1d848a10149325e6fb46ef5fa0624812ab12f28263535720d79aa564a5551e45   marksugar/nginx_createrepo:v0.2   "entrypoint.sh"        13 days ago         Up 13 days                              nginx_repo

II. docker inspect

此时,我们试图找回上述的docker run命令,使用docker inspect ,但是docker inspect打印的是json文件,我们需要挑选字段查看

[r[email protected]_25_50_250 ~]# docker inspect -f "{{.Name}} {{.Path}} {{.Args}} {{.Config.Cmd}} {{.Config.Env}} {{.Config.Volumes}} {{.Config.Entrypoint}} {{.NetworkSettings.Networks}}" $(docker ps -a -q)
/linuxea_redis /Initialization.sh [] [] [REDIS_CONF=on REQUIRE_PASS=OTdmOWI4ZTM4NTY1M2M4OTZh MASTER_AUTH=OTdmOWI4ZTM4NTY1M2M4OTZh MAXCLIENTS_NUM=30 MAXMEMORY_SIZE=1024M 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:0xc420182000]
/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:0xc42044c000]

这样的显示并不直观。好在我发现了rekcodrunlike这两个逆转docker run命令,参见本章介绍和使用。runlike更漂亮些

III. rekcod

借助rekcod打印出更易读的格式,docker inspect→docker run

docker run从现有容器(via docker inspect)反向设计命令。

rekcod可以将以下任何内容转换为docker run命令:

  1. 容器ID /名称(rekcod将调用docker inspect
  2. 包含docker inspect输出的文件的路径
  3. 原始JSON(docker inspect直接传递输出)

每个docker run命令都可用于复制容器。

这不是非常强大,但它应该涵盖所需的大多数参数。请参阅下面支持的字段

传递容器ID /名称时,此模块docker inspect直接调用,运行它的用户也应该能够。

开始安装

  • install rekcod
yum install npm -y
npm i -g rekcod
  • 如果您只安装了Docker:
$ docker pull nexdrew/rekcod
$ alias rekcod="docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nexdrew/rekcod"

或者你可以简单地运行它,不需要安装:

$ docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nexdrew/rekcod <container>

开始使用

以使用linuxea_redis容器为例,rekcod linuxea_redis,如下:

[[email protected]_25_50_250 ~]# docker ps -qa|rekcod

或者这样

[[email protected]_25_50_250 ~]#  rekcod linuxea_redis

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自动换行.见下文]

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

启动成功

[[email protected]_25_50_250 ~]# docker ps -a 
CONTAINER ID        IMAGE                             COMMAND                CREATED             STATUS              PORTS               NAMES
492f6cdc159c        marksugar/redis:5.0.0             "/Initialization.sh"   4 seconds ago       Up 3 seconds                            linuxea_redis
1d848a101493        marksugar/nginx_createrepo:v0.2   "entrypoint.sh"        13 days ago         Up 13 days                              nginx_repo
[[email protected]_25_50_250 ~]# docker logs linuxea_redis 
[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=1024M 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 

IV. runlike

我仍然要提一下runlike,和rekcod有一样的作用

本地安装使用

yum install python-pip
pip install runlike
  • 用法:
runlike <container-name>

这打印出你需要运行什么来获得类似的容器。你可以$(runlike container-name)一步完成其输出。如下:

[[email protected]_25_50_250 ~]# runlike linuxea_redis
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将命令行分解为漂亮漂亮的行。例如:

[[email protected]_25_50_250 ~]# runlike -p linuxea_redis
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镜像。

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
    assaflavie/runlike YOUR-CONTAINER

或者您可以使用别名运行它,例如,将其保存在~/.profile或中~/.bashrc

alias runlike="docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike"

然后您可以直接以本地命令运行

runlike YOUR-CONTAINER

V. docker-compose

事实上这样的方式,我并不推荐,你大可不必这样 麻烦,直接使用docker-compose就可以完成简单的编排,如下:

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=4096M
    volumes:
    - /etc/localtime:/etc/localtime:ro
#    - /etc/redis:/etc/redis
    - /data/redis-data:/data/redis:Z
    - /data/logs:/data/logs

VI. 学习更多

学习如何使用Docker CLI命令,Dockerfile命令,使用这些命令可以帮助你更有效地使用Docker应用程序。查看Docker文档和我的其他帖子以了解更多信息。


除非另有说明,否则本站上的内容根据以下许可进行许可: CC署名-非商业性使用-相同方式共享4.0国际许可协议4.0进行许可
本文作者:www.linuxea.com for Mark
文章链接:https://www.linuxea.com/2270.html (转载请注明本文出处和本章链接)

Turn a dedicated Kodi box into a Home Server using Docker

The Problem

Running OpenELEC/LibreELEC on a Raspberry Pi is a great way to get a minimum footprint Kodi box, with all the necessary OS performance tuning ready out of the box. However, wouldn’t it be great if we didn’t have to tie up a whole Raspberry Pi in this way, but also have the ability to run some additional services. In other words, can we turn our Kodi box into a Home Server as well?

For example, maybe we would like to also add a MySQL server to the box, for hosting kodi config on the network. Usually this would involve installing MySQL onto the box and setting up the required database configuration. Unfortunately, the problem with running a dedicated Kodi OS is that we don’t have access to tools like a package manager, which allow us to install additional software. Only the bare essentials needed to run Kodi are provided.

Continue reading “Turn a dedicated Kodi box into a Home Server using Docker”

在群晖Docker中安装Jellyfin媒体服务器

Jellyfin是一款媒体服务器软件,可在多个平台管理和播放流媒体文件。它是Emby和Plex之外的完美替代品,可通过多个应用程序从专用服务器向终端用户设备提供媒体。Jellyfin是Emby 3.5.2版本的后代,移植到.NET Core框架以得到完整的跨平台支持。最关键的是免费!没有任何附加条件。

Continue reading “在群晖Docker中安装Jellyfin媒体服务器”

reboot 后 Docker服务及容器自动启动设置

重启reboot操作系统后,发现docker 服务未启动,容器也未启动,天生反骨,怎么才能重启后自动启动呢

解决问题两个问题:

1、docker服务自动重启设置
systemctl enable docker.service

Continue reading “reboot 后 Docker服务及容器自动启动设置”

玩玩新意思之Ubuntu安装docker图形界面

用黑裙的docker跑ha hb等,感受到了docker的方便快捷。不过黑裙的docker有个问题我一直无法解决:DSM占用了80端口,用不了habridge。虽然囧帅大力指点,还是弄不定。后来听书记他们说,Ubuntu也是可以装docker的。刚好看到论坛有个教程,感觉装docker也非常方便,所以就干脆把东西挪到Ubuntu的docker上。
具体Ubuntu安装dockers,可以根据:xiaoguaileo大神提供的教程https://bbs.hassbian.com/thread-827-1-1.html。leo大神原文是为了安装Hassio的,如果你只用dockers,那只要用到:“下面开始做Hass.io安装前的环境准备”这一部分内容即可。
安装好了docker之后,我们可以通过一行简单命令来自动安装ha、hb、habridge、homebase等的容器。具体如下:
1.下载相关镜像 Continue reading “玩玩新意思之Ubuntu安装docker图形界面”

[教學] 使用 Openshift (v3) 架設 WordPress

之前有和大家分享過在 Openshift (v2)上架設 WordPress 的方法,改版之後,就沒那麼容易了

[教學] 在 Openshift 上架設 WordPress+自訂域名

比起第二版的 WordPress 部署方式,第三版目前尚無自動化安裝腳本,安裝起來稍微複雜些。不過,你不用擔心,以下的教學都將採用圖形介面操作,假如真的遇到問題,再去研究文字指令怎麼使用,文末也附上遇過的問題與大家分享。

溫馨提示:不推薦拿來做為正式用途,因為新版平台類似 Heroku,有 30分鐘休眠限制,且容器內部 IP可能會因為重新啟動而變更,您需要自行修改 YAML 檔,避開這樣的問題。

Continue reading “[教學] 使用 Openshift (v3) 架設 WordPress”

Docker详细的基础用法

Docker是一个用了一种新颖方式实现的超轻量虚拟机,在实现的原理和应用上还是和VM有巨大差别,专业的叫法是应用容器(Application Container)。(我个人还是喜欢称虚拟机)

Docker应用容器相对于 VM 有以下几个优点:
启动速度快,容器通常在一秒内可以启动,而 VM 通常要更久
资源利用率高,一台普通PC 可以跑上千个容器,你跑上千个 VM 试试
性能开销小, VM 通常需要额外的 CPU 和内存来完成 OS 的功能,这一部分占据了额外的资源

因为VM的Hypervisor需要实现对硬件的虚拟化,并且还要搭载自己的操作系统,自然在启动速度和资源利用率以及性能上有比较大的开销。

个人体会较深的两处优点:
1. 快速部署,传统的部署模式是:安装(包管理工具或者源码包编译)->配置->运行;Docker的部署模式是:复制->运行。
2. 可以保证线上与测试环境一致,计划以后上线就直接复制测试使用的docker容器

Continue reading “Docker详细的基础用法”