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文件,我们需要挑选字段查看

[[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 (转载请注明本文出处和本章链接)

docker 服务开机自启动,容器退出自动重启

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

解决两个问题:

1、docker服务自动重启设置

systemctl enable docker.service

2、docker容器自动启动设置

docker ps -a

使用一下命令对镜像从起: docker restart imageid

在运行docker容器时可以加如下参数来保证每次docker服务重启后容器也自动重启:

docker run --restart=always

如果已经启动了则可以使用如下命令:

docker update --restart=always 

重启系统后

docker  ps -a 

restart 参数

  • no : 容器退出时,不重启容器;
  • on-failure : 只有在非0状态退出时才从新启动容器;
  • always : 无论退出状态是如何,都重启容器;

在使用 on-failure 策略时,指定Docker将尝试重新启动容器的最大次数。 默认情况下,Docker将尝试永远重新启动容器。

sudo docker run --restart=on-failure:5 <image>

https://blog.csdn.net/wxb880114/article/details/82904765

https://www.zc0317.com/post/view?id=150

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”

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图形界面”

减小 vmware 虚拟机的硬盘容量,不是压缩

默认情况下,vmware 虚拟机的硬盘空间可以在 vmware 的虚拟机设置里调整大小,但只能『扩展』,却无法缩小。

当输入较小数字时,按钮变灰,无法点击。

Continue reading “减小 vmware 虚拟机的硬盘容量,不是压缩”

代替ESXI的虚拟机解决方案proxmox

proxmox官网

proxmox是什么?

开源虚拟化平台,在单一解决方案中进行计算、网络和存储
Proxmox VE是一个完整的开源平台,适用于包容性企业虚拟化,可在单一平台上紧密集成KVM管理程序和LXC容器,软件定义的存储和网络功能,并可在Web管理界面中轻松管理高可用性集群和灾难恢复工具。

企业级功能和100%基于软件使Proxmox VE成为虚拟化IT基础架构,优化现有资源以及以最低成本提高效率的完美选择。您甚至可以轻松虚拟化最苛刻的Linux和Windows应用程序工作负载,并随着需求的增长动态扩展您的计算和存储,从而确保适应未来数据中心的增长。

如何安装

proxmox是一个发行版,下载镜像,并制作成u盘启动,安装到服务器即可
下载页

安装参考
中文参考

在虚拟机重安装

与在虚拟机中安装linux系统一样,配置常用内存、硬盘、网络等,ISO选择下载的proxmox

Continue reading “代替ESXI的虚拟机解决方案proxmox”

在ubuntu开机启动vmware到虚拟机

在ubuntu中安装了vmware用来运行几个虚拟机。但是每次重新启动ubuntu都要手动启动vmware和虚拟机,很不方便。两种方法,一种是直接把命令写到/etc/rc.local中;另外一种是添加一个系统服务。下面记录添加服务的过程。

Continue reading “在ubuntu开机启动vmware到虚拟机”

解决Win7/8/10系统中的Hyper-V和VMware虚拟机软件共存问题

许多企业不是在丢弃基于VMware的现有系统,而是在慢慢向微软的Hyper-V虚拟机管理程序迁移。微软在简化管理这两个虚拟化平台的任务,因为最新版本的System Center 2012 R2虚拟机管理器(VMM)让你可以借助单一管理平台,管理VMware和Hyper-V。所以,现在你还可以使用VMM,将虚拟机从VMware平台迁移到Hyper-V平台。不过也可以等待Hyper-V vNext即可实现这些需求了。

【实际案例分析】vmware与hyper-v不能并存该怎么处理?win10系统在vmware workstation中安装虚拟机的时候遇到提示“WMware Workstation与Hyper-v不兼容,该怎么办呢? Continue reading “解决Win7/8/10系统中的Hyper-V和VMware虚拟机软件共存问题”