docker 容器基础操作

容器创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
docker run [option] image [cmd]
option:
-d:以守护进程方式运行
-p:指定映射端口 本机端口:r
-P:随机映射端口
-i:保持标准输入打开
-t:分配一个伪终端
-v:设置挂载文件到主机上
--rm:当容器关闭时自动删除
--name:为启动的容器设置一个名字
--network:指定使用哪个网络
-e:设置容器中的环境变量
--link:链接到另一个容器
-h:指定容器内的主机名

查看容器

1
2
3
4
5
6
docker ps [option]
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
容器id 镜像名 命令 创建时间 状态 端口号 容器名称

option:
-a:全部容器,包括停止的

停止容器

1
2
3
docker终止容器是首先向容器发送SIGTERM信号,等待一段时间超时后(默认10秒),再发送SIGKILL信号来终止容器。
docker stop [container id]/[names]

进入容器

attach

1
2
docker attach [container id]/[names]
attach是最早docker官方推出的进入容器的命令了,不过使用该命令有一个问题。当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作,当所有窗口退出时,容器结束

exec

1
2
3
4
5
6
7
8
docker exec [options] [container id]/[names] [command]
既attach之后,exec是官方推出的有一个新的进入容器的命令,这个命令相当于在容器中执行一个命令。
options:
-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端
eg:
docker exec -it 2f9f406173da /bin/bash

nsenter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
是一个轻量级的软件,我们可以使用这个软件进入容器之中,一般配合docker inspect使用

docker inspect -f {{.State.Pid}} [container id]/[names] 获取容器的pid
nsenter
-t, --target pid:指定被进入命名空间的目标进程的pid
-m, --mount[=file]:进入mount命令空间。如果指定了file,则进入file的命令空间
-u, --uts[=file]:进入uts命令空间。如果指定了file,则进入file的命令空间
-i, --ipc[=file]:进入ipc命令空间。如果指定了file,则进入file的命令空间
-n, --net[=file]:进入net命令空间。如果指定了file,则进入file的命令空间
-p, --pid[=file]:进入pid命令空间。如果指定了file,则进入file的命令空间
-U, --user[=file]:进入user命令空间。如果指定了file,则进入file的命令空间
-G, --setgid gid:设置运行程序的gid
-S, --setuid uid:设置运行程序的uid
-r, --root[=directory]:设置根目录
-w, --wd[=directory]:设置工作目录

ssh

1
在生产环境中排除了使用 docker attach 命令进入容器之后,相信大家第一个想到的就是 ssh。在镜像(或容器) 中安装 SSH Server,这样就能保证多人进入容器且相互之间不受干扰了,相信大家在当前的生产环境中(没有 使用 Docker 的情况)也是这样做的。但是使用了 Docker 容器之后不建议使用 ssh 进入到 Docker 容器内。

删除容器

1
2
3
docker rm [options] [container id]/[name]
options
-f:强制删除

容器的文件复制

1
2
3
4
5
将容器内的文件复制出来
docker cp [container id]/name:容器内路径 本地路径

将宿主机的文件复制到容器中
docker cp 本地路径 [container id]/name:容器内路径