Docker命令之容器命令_zy010101的博客-程序员秘密

技术标签: Docker  容器  运维  容器命令  docker  

容器命令

docker run

docker run会先找本地镜像,如果找不到,就自动去远程仓库拉取镜像(默认拉取latest版本),然后使用这个镜像来启动容器。命令详细格式如下:

sudo docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

一般常用的OPTIONS有下面的几个。

  • –name=“容器新名字” 为容器指定一个名称;
  • -i:以交互模式运行容器,通常与 -t 同时使用;
  • -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
    也即启动交互式容器(前台有伪终端,等待交互);
  • -P: 随机端口映射,大写P;-p: 指定端口映射,小写p
  • -d: 指定容器后台运行

启动交互式容器

因此,如果需要启动一个交互式ubuntu容器,那么通常如下所示:

sudo docker run -it ubuntu /bin/bash

/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。要退出终端,直接输入 exit

交互式方式启动的容器,在终端输入exit会导致容器停止,而按下ctrl+p+q退出,容器不会退出。

启动后台运行容器

通常,大多数时候,我们都是希望启动一个后台运行的容器。这时候的启动命令如下:

sudo docker run -d ubuntu

注意,这时候,你通过docker ps查看,会发现ubuntu并没有被启动,这是因为 Docker容器后台运行,就必须有一个前台进程。这样的容器后台启动后,会立即自杀因为他觉得他没事可做了。

因此,如果我们启动的是redis容器,那么它就不会立即退出,因为redis会被以前台进程的形式执行。所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行,常见就是命令行模式,表示我还有交互操作,不要停止掉容器。

docker start

该命令用来启动一个已经停止的docker容器,格式如下:

sudo docker start 容器名(NAMES)或者容器ID(CONTAINER ID)

例如,

b8a32c0d9edb   redis          "docker-entrypoint.s…"   12 minutes ago   Exited (0) 2 minutes ago              redis

我们使用名字来重新启动这个容器,

sudo docker start redis

在例如,

b3cc50a235cd   ubuntu         "/bin/bash"              27 minutes ago   Exited (0) 27 minutes ago              thirsty_hodgkin

我们使用容器ID来启动容器:

sudo docker start b3cc50a235cd

docker restart

该命令用来重启容器,格式如下:

sudo docker restart 容器名或者容器ID

docker stop

该命令用来停止同期,格式如下:

sudo docker stop 容器名或者容器ID

docker kill

该命令用来停止同期,格式如下:

sudo docker kill 容器名或者容器ID

docker kill和docker stop的区别是:docker stop,支持“优雅退出”。先发送SIGTERM信号,在一段时间之后(10s)再发送SIGKILL信号。Docker内部的应用程序可以接收SIGTERM信号,然后做一些“退出前工作”,比如保存状态、处理当前请求等。docker kill,发送SIGKILL信号,应用程序直接退出。

docker rm

删除已停止运行的容器,格式如下:

sudo docker rm 容器名或者容器ID

一次性删除所有容器:

sudo docker rm $(sudo docker ps -a -q)

docker logs

对于后台运行的容器,我们我们看到其终端打印的信息,因此docker提供了docker logs来查看日志。命令格式如下:

sudo docker logs 容器名或者容器ID

docker top

该命令用来查看容器内运行的进程。命令格式如下所示:

sudo docker top 容器名或者容器ID

docker inspect

该命令用来获取容器/镜像的元数据。命令格式如下所示:

sudo docker inspect 容器名或者容器ID

docker exec

该命令可以进入在后台运行的容器中,命令格式如下所示:

sudo docker [OPTIONS] 容器名或者容器ID [COMMAND]

常用的格式如下:

sudo docker exec -it f184ae /bin/bash

这时候会打开一个新的伪终端,然后我们就可以使用伪终端来进行交互操作。之后使用exit退出伪终端,也不会导致容器停止运行,因为这个伪终端是exec新打开的。

docker attach

该命令可以进入在后台运行的容器中,和exec不同的地方是,attach直接进入容器启动命令的终端,不会打开一个新的终端,这样你退出的时候,就会导致容器退出。因此,该命令不常用。命令格式如下:

sudo docker attach 容器名或者容器ID

docker cp

该命令可以用来在容器和宿主机之间进行文件拷贝。命令格式如下:

  1. 从宿主机到容器

     sudo docker cp 宿主机路径 容器ID:容器内路径
    
  2. 从容器到宿主机

     sudo docker cp 容器ID:容器内路径 宿主机路径
    

docker export

docker export是用来将container的文件系统进行打包的,容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。命令用法:

sudo docker export -o www.tar 9540a9d16597

上述命令将ID为9540a9d16597的容器打包成为www.tar的镜像包。也可以借助Linux的重定向操作,例如:

sudo docker export 9540a9d16597 > qqq.tar

docker import

该命令用于从docker export导出的文件中创建镜像。命令格式如下:

sudo docker import 打包文件 REPOSITORY:TAG

例如:

sudo docker import qqq.tar redis:1.0.1

docker commit

该命令用于提交容器副本,使之成为一个新的镜像。命令格式如下:

sudo docker commit -m="描述信息" -a="作者" 容器ID 要创建的镜像名:[标签名]

例如:

sudo docker commit -m="new_ubuntu" -a="zy010101" c08cf729f094 ubuntu:1.2.3

这样,就可以借助docker commit命令来生成功能更加强大的镜像。例如,你可以在容器中安装vim,然后使用docker commit提交容器副本,生成一个带有vim的新镜像。
这主要受益于Docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zy010101/article/details/123047816

智能推荐

24岁华为Java程序员工资表曝光,牛逼的人注定会牛逼_公众号-老炮说Java的博客-程序员秘密

周末和学弟一起吃了个饭,他比较牛逼的,没毕业几年已经进华为了,在他的朋友圈晒出了一年前的工资表。同样20来岁的年纪,为什么人家可以年入百万,一个项目奖金就比得上别人一年的工资?他经历就是...

Oracle trunc()函数的用法_Timegoeson的博客-程序员秘密

Oracle trunc()函数的用法TRUNC(for dates)  TRUNC函数为指定元素而截去的日期值。  其具体的语法格式如下:TRUNC(date[,fmt])其中:date 一个日期值,fmt 日期格式,该日期将由指定的元素格式所截去。忽略它则由最近的日期截去。  下面是该函数的使用情况:TRUNC(TO_DATE(‘24-Nov-1999 08:00 pm’...

【论文阅读#3】FLOWPRINT : Semi-Supervised Mobile-App Fingerprinting on Encrypted Network Traffic_Elivyxy的博客-程序员秘密

一、论文信息本文是发表在NDSS 2020上的一篇文章,作者在本文中提出了一种从加密的网络流量中提取移动应用程序指纹的半监督方法。该方法可以有效识别Android和iOS上的应用程序且不需要先验知识,并且工作效率可控,实验结果远超目前最先进的解决方案。1.1、摘要原文Mobile-application fingerprinting of network traffic is valu...

Linux和Windows脚本语言_dc030401的博客-程序员秘密

本文译自iSystemAdmin的 《List Of Popular Scripting Languages for Linux and Windows》。具备脚本知识的系统管理员与其他系统管理员有着明显的区别。脚本是一门“系统管理员”创造的艺术。这门艺术需要了解系统本身的相关知识,系统管理命令的语法,编程和算法知识以及至少一门脚本编程语言。对系统管理员来说编写脚本有很多选择,每...

css3动画 小球弹跳下降_发狂的桔子的博客-程序员秘密

效果如下:代码如下:<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>小球弹跳下降</title> <style> * { margin: 0; pad

随便推点

vue-element-admin我踩的坑(9)_nailgo的博客-程序员秘密

element-ui的transfer组件选项过长问题解决使用element-ui的transfer组件不可避免出现选项过长问题:我这里的解决方案是使用transfer的render-content自定义渲染函数,里面添加element-ui的tooltip组件,对超长的选项进行提示。1.绑定渲染函数<el-transfer :render-content="...

神奇的魔法数_LiuXingLong的博客-程序员秘密

神奇的魔法数Time Limit: 1000msMemory Limit: 32768KBThis problem will be judged on FZU. Original ID: 189664-bit integer IO format: %I64d      Java class name: MainPrev Submit Status Stati

==和equals_H3nry的博客-程序员秘密

一、==和equals的区别==它的作用是判断连个对象的地址是否相等。即判断两个对象是否同一个对象(基本数据类型比较值,引用数据类型比较内存地址)因为Java只有值传递,所以对于==来说,不管是比较基本数据类型,还是比较引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。equals()它的作用也是判断两个对象是否相等,它不能用于比较基本数据类型的变量。equals() 方法存在于 Object 类中,而 Object 类是所有类的直接或间接父类。public boo

Geek ? 什么是 Geek ? 谁是 Geek ?_Fenng的博客-程序员秘密


 Geek, 现在似乎是一个非常流行的词汇。国内有人翻译为”奇客”, 也有人翻译为”极客”。虽然很多次看到文章介绍 Geek,但还是有些模糊。究竟什么是 Geek ,什么人算是 Geek 呢?先看看金山词霸的”美国传统词典”中收录的定义:1)An odd or ridiculous person.(畸形人,怪人一个奇怪或不可思议的人)2)A carnival...

(快速幂) luogu P3197 [HNOI2008]越狱_EQSAN的博客-程序员秘密

若没了解过快速幂,请移至第数论第一篇题解 快速幂模板题目描述监狱有连续编号为 1…N1…N 的 N 个房间,每个房间关押一个犯人,有 M 种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱。输入输出格式输入格式:输入两个整数 M,N输出格式:可能越狱的状态数,模 100003 取余直接计算可能越狱的情况数很困难,所以我们转换思...

linux 服务 stop 实现,Linux上的avahi-daemon Service服务[转]_小诺1996的博客-程序员秘密

# $Id: avahi-daemon.conf 1155 2006-02-22 22:54:56Z lennart $## This file is part of avahi.## avahi is free software; you can redistribute it and/or modifyit# under the terms of the GNU Lesser General ...