Docker基础(二): 基础命令


如题,本文将总结常用的Docker基础命令,包括但不限于:帮助启动类命名镜像命令容器命令


帮助启动类命令

启动docker:systemctl start docker

停止docker:systemctl stop docker

重启docker:systemctl restart docker

开即自启:systemctl enable docker

查看docker概要信息:docker info

docker帮助文档:docker --help

docker某一命令帮助文档:docker 命令 --help


镜像命令

列出本地主机上的镜像:

docker images

​ -a:列出本地全部的镜像(all)

​ -q:只显示镜像ID (quiet,静默模式)

​ 返回结果中,REPOSITORY代表仓库名,即镜像名,TAG指镜像的版本号。

去docker仓库中搜索镜像:

docker search 镜像名

返回结果有5个参数,分别指:

参数 说明
NAME 镜像名称
DESCRIPTION 镜像说明
STARS 点赞数量
OFFICIAL 是否官方
AUTOMATED 是否为自动构建的

拉取镜像:docker pull 镜像名,完整形式为:

docker pull [OPTIONS] 镜像名:TAG

如果只写了镜像名,则默认TAG为latest,即最新发布版。

删除指定本地镜像:

docker rmi [OPTIONS] 镜像名[:TAG]/ID

如果只写了镜像名,则默认TAG为latest,但如果你的本地没有该镜像的latest版本,就会删除失败。

删除单个:docker rmi 镜像名[:TAG]/ID

删除多个:docker rmi 镜像名1:TAG/ID 镜像名2:TAG/ID

强制删除:-f ,会直接删除镜像的所有容器

删除全部:docker rmi -f $(docker images -qa) ==> 小心坐牢


容器命令

新建+启动容器:

docker run [OPTIONS] 镜像 [COMMAND] [ARG]

其中,OPTIONS非常重要,几个最常用的有:

–name=”容器名字”: 为容器起名,不起的化随机

-i:以交互模式运行容器,通过与-t同时使用

-t:为容器重新分配一个伪输入终端,通过与-i同时使用

-it 也即交互式容器(前台有伪终端,等待交互)

-d:后台运行容器并返回容器ID,也即启动守护式容器(后台运行)

-p:指定端口映射,小写p,如-p 3306:3306指将主机的3306端口映射到该容器内的3306端口

-P:随机端口映射,大写P

-e:创建环境变量

注意,并不是所有的镜像都能够以-d来后台运行,比如ubuntu、centos这些交互式镜像,就需要有一个前台来交互,所以对他们而已,使用-d并不能使其持久化。但是,那些服务类的镜像,比如tomcat、mysql、redis等等,虽然镜像是构建在Linux文件系统上的,但是他们可以通过-d来后台运行。

另外,有镜像才能创建容器,当运行run时,会首先在本地寻找是否有该镜像,如果没有,就去docker仓库中将该镜像拉取到本地,然后在创建容器。

可以通过-e来在改容器中创建一个指定值的环境变量,之后每次进入该容器都可以直接使用,如:

docker run -d --name=r2 -e A=123 redis:6.0.8

列出当前所有在运行中的容器:

docker ps [OPTIONS]

-a:列出当前所有正在运行的容器+历史上运行过的容器(如果容器没被删除)

-l:显示最近创建的容器

-n:显示最近n个创建的容器

-q:只显示容器编号

停止容器:

docker stop 容器名/ID

启动停止的容器:

docker start 容器名/ID

重启容器:

docker restart 容器名/ID

从容器中退出:

1. exit:退出容器并使容器停止
2. ctrl+p+1:退出容器但容器不会停止

删除容器:

docker rm [OPTIONS] 容器名/ID

强制删除:-f,如果不加的化,只能删除停止的容器

删除全部容器:docker rm -f $(docker ps -a -q) ==> 小心坐牢

查看容器日志:

docker logs 容器名/ID

查看容器内的进程信息:

docker top 容器名/ID

注意,top查看的是容器中的进程在宿主机OS中的信息,比如查到的PID是该进程在宿主机上的PID,而不是在容器内部的信息,这就意味着这些信息是可以在宿主机的ps -ef中找到的:

[root@master test]# docker top redis2
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
polkitd             18650               18630               0                   15:41               ?                   00:00:00            redis-server *:6379
[root@master test]# ps -ef | grep 18650
polkitd   18650  18630  0 15:41 ?        00:00:00 redis-server *:6379
root      25347   7737  0 15:52 pts/0    00:00:00 grep --color=auto 18650

如果要查后者,用命令docker exec 容器名/ID ps -ef,不过前提是容器要安装ps。至于为什么一个进程会有不止一个信息,这就涉及到Container的进程管理机制了,主要为PID namespace,这个以后再说。

查看容器内部细节:

docker inspect 容器名/ID

在容器内部运行指令

docker exec [OPTIONS] 容器名/ID COMMAND [ARG...]

docker exec 会在容器内部运行COMMAND指令。实际上,容器就是个极小的Linux环境,它包含最必须的文件系统,因此实则时该Linux环境在执行这条命令。每个容器都会有一个默认的工作目录,该目录会在镜像的Dockerfile中指定,如果不另外指定的化,容器将在该目录下执行指令。

COMMAND should be an executable, a chained or a quoted command will not work. Example: docker exec -ti my_container "echo a && echo b" will not work, but docker exec -ti my_container sh -c "echo a && echo b" will.

比如,在mysql镜像构建的容器中使用命令date:

最关键的,之前有提到退出容器,那么退出容器后怎么再次进入呢?答案就是exec。进入容器,实际上就是使用容器的终端,因此首先要让容器打开一个终端,故将COMMAND设为/bin/bash或简写为bash。但是此时我们并不能进入这个终端,因为容器并不是交互时运行的,因此还需要使用OPTIONS-it来指定其为交互式运行,才能进入这个容器内的终端。故命令为:

# docker exec -it 容器名/ID /bin/bash
docker exec -it 容器名/ID bash

当然,类似于runexec也可以通过-e来在容器中创建一个环境变量。但是不同于前者,exec创建的环境变量只能在本次执行过程中使用,一旦退出容器,下次再进入就没有该变量了。

另一个非常重要的特性是,使用exec -it .. bash进入的容器,在exit退出之后,不会停止!与其相对应的,是attach命令,该命令也可也进入容器,但是用exit退出之后会导致容器的停止。

从容器内拷贝文件到主机上:

docker cp 容器名/ID:容器内路径 目的主机路径

该命令会将指令的容器内路径中的所有文件,全部拷贝到目的主机,是简单的备份方式。

导入和导出容器

export可以导出容器的内容留作一个tar归档文件。import可以从tar包中的内容创建一个新的文件系统再导入为镜像,注意,是生成镜像,而不是创建容器。

docker export 容器名/ID > 文件名.tar
cat 文件名.tar | docker import - [镜像用户/]镜像名[:TAG]


总结


文章作者: SrcMiLe
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 SrcMiLe !
评论
 上一篇
Docker基础(三): 容器数据卷 Docker基础(三): 容器数据卷
想象一下,你的公司使用docker在容器中部署了一个电商项目,数据全部存在容器中。现在,你一不小心把这个容器删了,里面的数据全没了,再也无法恢复。完了,公司的核心资产被你搞没了,猜猜你能在牢里蹲多久?
2022-01-23
下一篇 
Docker基础(一): 初识 Docker基础(一): 初识
假设你已经开发了一个Java项目,你所用的开发设备上已经配好了所有的相关环境,比如java8/mysql/redis等等。现在,你需要将你的源码交付给其他开发人员和测试人员或者直接打成jar包部署上线。问题来了,每个人机器上的环境都不一样,
2022-01-21
  目录