一、说明
docker的四个要素是:本地的Docker-engine、网上(本地)的仓库、镜像images、容器;初学者必须了解这是个概念的关系。但是,真正重要的概念是容器,因为,只有掌握了容器,才能具备一定创造力,才能用Docker构建项目,才能最后实现Docker真实价值。
本篇讲述当Docker安装完成后,在engine服务、image命令都掌握后,对容器进行的由浅入深的操作过程。
二、容器和Docker其它要素的关系
docker的是个要素和它们之间的关系:
- 仓库:是用来存放镜像的数据库,一般在远端官方服务器上,客户可以用registry建立本地仓库,这是后话。
- 镜像:镜像相当于图纸,是用于生成容器这种产品的模板。
- 引擎:是管理本地dacker运作的服务软件,包括:客户端、通信模块、用户指令管理、拉起各种app实现运行等。
- 容器:容器是在本地真正参与项目的独立隔间、每个隔间内有操作系统、各种目的的进程;可以与容器之外的对象通信,比如:容器和容器通信。
在以上四个方面,容器是重中之重,也是最复杂、最关键的Docker内容,本文下面将详细解释容器的种种操作指令。
三、容器指令
3.1 命令格式
注意:docker命令有两种,一种是docker manager 命令,另一种是docker命令;docker管理层命令只是增加了中间层,表明该命令是针对哪些对象,比如:
docker pull nginx 和 docker image pull nginx 一样的。
docker run nginx 和 docker container run nginx 一样的。
3.2 容器种类
容器种类有多种,根据不同容器,需要对容器内部的进程进行输入、输出操作,因此选择的命令参数不同。
提示:容器从运行方式上存在多种,现说明三种:
- <1> 运行一次就退出:此容器不驻留内存,执行一遍就退出进程。无需参数。
- <2> 守护进程,该容器相当于服务进程被拉起,驻留内存,无交互模式。需要-it参数
- <3> 交互式守护进程:可以与终端进行交互,驻留内存,需要 -d参数。
- <4> 网络进程:是网络进程,就需要端口映射这样的参数,-p 或 -P。
因为以上的不同,参数选项也不同,因此,存在用错参数的可能性,务必注意。
3.3 容器命令总览
命令 | 描述 |
docker container attach | 将本地标准输入、输出和错误流附加到正在运行的容器 |
docker container commit | 从容器的更改创建新镜像 |
docker container cp | 在容器和本地文件系统之间复制文件/文件夹 |
docker container create | 创建一个新容器 |
docker container diff | 检查容器文件系统上文件或目录的更改 |
docker container exec | 在正在运行的容器中运行命令 |
docker container export | 将容器的文件系统导出为 tar 存档 |
docker container inspect | Display detailed information on one or more containers |
docker container kill | Kill one or more running containers |
docker container logs | Fetch the logs of a container |
docker container ls | List containers |
docker container pause | Pause all processes within one or more containers |
docker container port | List port mappings or a specific mapping for the container |
docker container prune | Remove all stopped containers |
docker container rename | Rename a container |
docker container restart | Restart one or more containers |
docker container rm | Remove one or more containers |
docker container run | Run a command in a new container |
docker container start | Start one or more stopped containers |
docker container stats | Display a live stream of container(s) resource usage statistics |
docker container stop | Stop one or more running containers |
docker container top | Display the running processes of a container |
docker container unpause | Unpause all processes within one or more containers |
docker container update | Update configuration of one or more containers |
docker container wait | Block until one or more containers stop, then print their exit codes |
四、命令用法和案例
4.1 docker run命令
这是第一个容器命令,创建一个新的容器并运行一个命令。docker run 相当于执行了两API:
- /containers/create 生成
- /containers/(id)/start 启动
1 命令形式:
docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
此命令从image复制一个容器,并启动;因此,不可长期执行,否则复制出一堆相同的容器,ID号不同。
2 option选项参数
options | 说明 |
-i | 以交互模式运行容器,通常与 -t 同时使用 |
-t | 启动容器后,为容器分配一个命令行,通常与 -i 同时使用 |
-v | 目录映射,容器目录挂载到宿主机目录,格式: <host目录>:<容器目录> |
-d | 守护进程,后台运行该容器 |
-p | 指定端口映射,格式:主机(宿主)端口:容器端口 |
-P | 随机端口映射,容器内部端口随机映射到主机的端口(49153起始 49153到65535) |
–name | “nginx-lb” 容器名字 |
-m, | --memory bytes 设置容器使用内存最大值 |
-h, | --hostname string 指定容器的 host name |
–dns | 8.8.8.8 指定容器 dns 服务器 |
-e | username=“ritchie” 设置环境变量 |
–restar | t Docker 重启Docker-Engine后,容器是否自动重启 |
–privileged | 容器内是否使用真正的 root 权限 |
-u | 以什么用户身份创建容器 |
3 参数用法案例
示例1: -it 选项和交互式容器
执行一个docker命令:
docker run ubuntu:20.04
再用docker ps查看,发现没有容器执行,这是因为像ubuntu这样的容器,一定是交互式的,因此用交互式参数才能启动。
docker run -it ubuntu:20.04 bash
可以看到,进入容器内部提示符号。两种退出交互容器方式:
- exit退出容器交互,容器退出。用docker ps看不到ubuntu容器。
- ctl+p+q退出容器交互,容器驻留。用docker ps看到ubuntu容器。
示例2: -d 选项和后台运行
同样的命令加-d后:
docker run -it -d ubuntu:20.04 bash
ubuntu将在后台启动,通过docker ps可以看到,这里提出新问题,如何进入ubuntu?
示例3: -name 选项
docker run -it -d --name myubuntu ubuntu:20.04 bash
这里用--name给容器起名,否则的话,系统随意起了个名字。
4.2 docker exec命令
这是进入容器内部操作系统的命令。必须带-it交互终端的参数。
- 命令格式:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
- 命令意义:
进入已经后台启动的docker容器中。由于可进入容器必须是交互式容器,因此,这里必须是-it选项,bash或/bin/bash启动shell对话。
注意: exec命令后面必跟-it参数!
- 命令案例1
docker exec -it ubuntu:20.04 bash
进入已经后台运行的ubuntu中。注意,此时用exit退出后,容器依然在运行,这和run 指令不同。注意:这里-it 和后面的bash是固定搭配。
4.3 docker ps 命令
语法:
docker ps [OPTIONS]
参数有,OPTIONS说明:
-
-a :显示所有的容器,包括未运行的。
-
-f :根据条件过滤显示的内容。
-
--format :指定返回值的模板文件。
-
-l :显示最近创建的容器。
-
-n :列出最近创建的n个容器。
-
--no-trunc :不截断输出。
-
-q :静默模式,只显示容器编号。
-
-s :显示总的文件大小。
案例1:-a查看所有
docker ps -a
将显示运行的,暂停的容器。
案例2:-q查看容器编号显示
docker ps -q
此命令显示所有在启动容器编号。
案例3:--no-trunc :不截断输出。
docker ps --no-trunc
显示容器的全信息,包括status,如图:
4.4 docker rm 命令
docker rm :删除一个或多个容器。
语法
docker rm [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS说明:
-
-f :通过 SIGKILL 信号强制删除一个运行中的容器。
-
-l :移除容器间的网络连接,而非容器本身。
-
-v :删除与容器关联的卷。
案例1:强制删除容器 db01、db02:
docker rm -f db01 db02
案例2:移除容器 nginx01 对容器 db01 的连接,连接名 db:
docker rm -l db
案例3:删除容器 nginx01, 并删除容器挂载的数据卷:
docker rm -v nginx01
案例4:删除所有已经停止的容器:
docker rm $(docker ps -a -q)
案例5:删除某镜像生成的所有容器
删除所有imaeID= cae5f8e9bd47的容器
docker rm $(docker ps -a | grep cae5f8e9bd47 | awk '{print $1}')
解释:这里用到shell的命令,grep,awk,意思是:
1)将docker ps -a 的结果看成一个文件,该文件内满足grep和awk的项目被挑选出。
2)grep意义:将一个输入文本文件,将文中有某字段(以上cae5f8e9bd47)的行挑选出来。
3)awk意义:将文件中所有行的第n列挑选出来。上面的'{print $1}'就是指的第一列。
4.5 docker commit命令
docker commit :从容器创建一个新的镜像。也就是从某个容器返回镜像的操作:
语法
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS说明:
-
-a :提交的镜像作者;author作者。
-
-c :使用Dockerfile指令来创建镜像;
-
-m :提交时的说明文字;memory即记号的意思。
-
-p :在commit时,将容器暂停。
案例1:提交镜像
docker commit -a "runoob.com" -m "my apache" a404c6c174a2 mymysql:v1
注意:这里的mymysql:v1是【镜像名字:tag】如果不给出v1,tag默认为latest。
4.6 docker cp命令
docker cp :用于容器与主机之间的数据拷贝。
语法
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
OPTIONS说明:
-
-L :保持源目标中的链接
案例1:
- 将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下。
docker cp /www/runoob 96f7f14e99ab:/www/
- 将主机/www/runoob目录拷贝到容器96f7f14e99ab中,目录重命名为www。
docker cp /www/runoob 96f7f14e99ab:/www
- 将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中。
docker cp 96f7f14e99ab:/www /tmp/
五、后记
并不是说docker的容器命令就是完结,而是这里只罗列第一批应该掌握的命令,以后内容将很多,那将在本文的续篇讨论。