docker container/容器相关命令
容器相关命令
创建容器
使用 docker create [option]
命令创建一个容器,例如
$ docker create -it ubuntu:18.04
d25d8252253ad10f5c26dbc0b0bdf74b5135eb2eea539d196656d81a9061c0d2
# docker ps -a 查看容器
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d25d8252253a ubuntu:18.04 "bash" 24 seconds ago Created compassionate_black
新建的容器,status = Create,处于停止状态,可以使用 docker start
命令启动它。
create 命令常用的可选的参数有
- -a:是否绑定到标准输入、输出和错误
- -d:是否在后台运行容器,默认为否
- -i:保持标准输入打开,默认为false
- -P:是容器内部端口随机映射到主机的某端口
- -p:指定映射到本地端口,例如,-p 11234-11240:1234-1240
- -t:是否分配一个伪终端,默认为false
- -v:挂载主机上的文件卷到容器内
- --name:为容器指定名称
启动容器
使用 docker start container-id/container-name
命令启动一个刚刚创建的容器 ,例如
$ docker start d25d8252253a
d25d8252253a
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d25d8252253a ubuntu:18.04 "bash" 13 minutes ago Up 54 seconds compassionate_black
启动容器后,可以使用 docker ps
命令查看到容器 d25d8252253a 状态已经变成了启动
新建并启动容器
命令 docker run
命令等同于先执行 docker create
再执行 docker start
。例如,使用下面的命令输出 Hello World!,之后容器会自动停止。
$ docker run ubuntu /bin/echo 'Hello World!'
Hello World!
$ docker ps -a
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5f5b35152ed ubuntu:18.04 "/bin/echo 'Hello Wo…" 10 seconds ago Exited (0) 9 seconds ago stoic_elion
d25d8252253a ubuntu:18.04 "bash" 18 minutes ago Up 5 minutes compassionate_black
可以看到刚刚执行 echo 命令的容器,状态已经变成了 Exited
使用 docker run
命令,是按照以下的执行流程
- 如果镜像不存在,会先从共有仓库下载镜像
- 分配一个文件系统给容器,并在只读镜像层外挂载一层可读写层
- 从宿主主机的配置的网桥接口中桥接一个虚拟接口到容器中
- 从网桥的地址池中分配一个ip给容器
- 执行用户指定的应用程序
- 执行完毕容器自动停止
下面的命令,启动一个 bash 终端,允许用户进行交互
$ docker run -it ubuntu:18.04 /bin/bash
root@6b4389195232:/#
# -t:分配一个伪终端
# -i:保持标准输入打开
# 可以输入 Ctrl+d 或输入 exit 命令来退出程序
查看容器输出
使用 docker logs
命令获取容器输出,例如
$ docker logs e5f5b35152ed
Hello World!
$ docker logs 6b4389195232
root@6b4389195232:/# man docker-run
bash: man: command not found
root@6b4389195232:/# exit
exit
root@6b4389195232:/# pwd
/
root@6b4389195232:/# ls
bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
root@6b4389195232:/# ps
PID TTY TIME CMD
1 pts/0 00:00:00 bash
13 pts/0 00:00:00 ps
root@6b4389195232:/# exit
支持以下选项
- --details:打印详细信息
- -f:保持持续输出
- --since string:输出某个时间开始的日志,例如 --since 2021-01-01
- --tail string:输出最近的若干日志,例如 --tail 2
- -t:显示时间戳信息
- --until string:输出某个时间之前的日志
停止容器
暂停容器
例如,启动一个容器,将其暂停
$ docker run --name test --rm -it ubuntu bash
root@6d65107c8001:/#
# 打开一个新终端
$ docker pause test
test
# docker ps 查看
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6d65107c8001 ubuntu:18.04 "bash" 28 seconds ago Up 27 seconds (Paused) test
可以看到容器是启动并且暂停状态,且第一个终端无法处于无法输入的状态
# 使用该命令恢复暂停的容器
$ docker unpause test
恢复后,终端1恢复到可以输入的正常状态
终止容器
可以使用 docker stop[-t|--time[=10]
来终止一个运行的容器,该命令会首先向容器发送 SIGTERM 信号,等待一段时间后(默认为10秒),再发送 SIGKILL 信号来终止容器,例如
$ docker stop test
test
此外,可以使用 docker kill
直接发送 SIGKILL 信号来强行终止容器,docker restart
会先终止容器,再启动容器
进入容器
在启动容器时,使用 -d 选项,会使容器在后台运行,用户无法看到容器内的输入也无法进行操作,这是有两个命令可以进入容器,分别是 attach 和 exec 名命令
-
attach 命令
$ docker attach [option] container
这个命名主要支持三个选项,非别是:
- --detach-keys=[]:指定退出 attach 模式的快捷键序列,默认是 ctrl + q 和 ctrl + p
- --no-stdin=true|false:是否关闭标准输入,默认是false
- --sig-proxy=true|false:是否代理收到的系统信号给应用进程,默认为true
attach 有一个特点,当多个窗口使用 attach 进入同一个容器时,所有的窗口都会同步显示,当一个创建因为命令阻塞了,所有的窗口都会无法操作
-
exec 命令
$ docker exec [option] container
比较重要的选项有
- -d:在容器后台执行命令
- --detack-keys="":指定容器切回后台的按键
- -e,--env=[]:指定环境变了列表
- -i:打开标准输入接收用户输入的命令,默认为 false
- --privileged=true|false:是否给执行命令以最高权限,默认false
- -t:分配伪终端
- -t,--user:执行命令的用户名
例如,进入刚刚创建的容器
$ docker run --name test -itd ubuntu:18.04 1647d13558f7d8b7a03f7abbc27414e6f7befa5a6c64a3257210f6755fdcadc6 $ docker exec -it test bash root@1647d13558f7:/#
删除容器
使用 docker [container] rm [option]
命令来删除容器
支持的选项有
- -f:强制删除运行中的容器,会先发送 SIGKILL 信号给容器,再进行删除
- -l:删除容器的连接,但保留容器
- -v:删除容器挂载的数据卷
例如
$ docker create --name ubuntu-1 -it ubuntu:18.04
daf29b04546cbc2ce21b397c8ebbdec92458a6b40361fe1e3c6cc457a76cb5f8
$ docker rm ubuntu-1
ubuntu-1
导入和导出容器
导出容器
导出容器,是把一个已经创建的容器导出到一个文件中,命令为
$ docker export -o outputfile container
例如
$ create --name ubuntu-1 -it ubuntu:18.04
6294e0db7bf07f0a7e08f098bb44109e5635ec7e959b8340eb822f6236b2a66f
$ export -o ubuntu-1.tar ubuntu-1
$ ls -lh
-rw------- 1 linchangkun staff 56M 10 21 00:36 ubuntu-1.tar
导入容器
将导出的容器,可以复制到其他的机器上,导入后会变为镜像,命令为
$ docker import file REPOSITORY[:TAG]
例如
$ docker import ubuntu-1.tar test/u:0.1
sha256:9036cbb933c7dfa3e8e96ec1c5d54b55a9374930089a15198471903e506a6208
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/u 0.1 9036cbb933c7 3 minutes ago 56.6MB
导出容器再导入成为镜像,会丢失元信息和历史
查看容器
-
查看容器详情
使用
docker inspect container
查看容器详情,会以 json 格式返回容器id、创建时间、路径、状态等信息$ docker inspect ubuntu-1 [ { "Id": "6294e0db7bf07f0a7e08f098bb44109e5635ec7e959b8340eb822f6236b2a66f", "Created": "2021-10-20T16:35:38.685585044Z", "Path": "bash", "Args": [], "State": { "Status": "exited", "Running": false, "Paused": false, "Restarting": false, "OOMKilled": false, ......
-
查看容器内进程
使用
docker top container
查看容器内进程$ docker top ubuntu-1 UID PID PPID C STIME TTY TIME CMD root 3612 3587 0 07:46 ? 00:00:00 bash root 3650 3612 0 07:46 ? 00:00:00 top
-
查看统计信息
使用
docker stats container
可以查看统计信息,会显示cpu、内存、存储、网络等使用情况的统计信息$ docker stats ubuntu-1 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 6294e0db7bf0 ubuntu-1 0.00% 1.27MiB / 1.942GiB 0.06% 1.16kB / 0B 0B / 0B 2
其他容器命令
复制文件
使用 docker cp
可以在容器和物理机之间复制文件
$ ll
total 354488
-rw-r--r-- 1 linchangkun staff 0B 10 24 15:54 2.txt
# 复制本地文件到容器
$ docker cp ./2.txt ubuntu-1:/
# 进入容器查看
$ docker start -i ubuntu-1
root@6294e0db7bf0:/# ls
2 bin dev hello lib mnt proc run srv tmp var
2.txt boot etc home media opt root sbin sys usr
# 复制容器内文件到本地
$ docker cp ubuntu-1:/3.txt .
$ ls -l
total 354488
-rw-r--r-- 1 linchangkun staff 0 10 24 15:54 2.txt
-rw-r--r-- 1 linchangkun staff 0 10 24 15:57 3.txt
支持的选项有
- -L:跟随软连接。默认当原路径是软连接时,默认只复制链接信息,该选项会复制包含链接内容
查看容器变更
使用 docker diff container
查看容器内文件变更
$ docker diff ubuntu-1
A /3.txt
A /hello
A /2.txt
A /2
C /root
A /root/.bash_history
查看端口映射
使用 docker port container
命名可以查看容器端口映射
$ docker run --name ubuntu-2 -it -p 80:80 ubuntu:18.04
$ docker port ubuntu-2
80/tcp -> 0.0.0.0:80
更新容器配置
使用 docker update container
命令可以更新容器资源限制配置,比如,cpu核心数、允许使用内存大小、io速度等等