03-Docker 容器相关命令

官方文档:https://docs.docker.com/reference/

docker run 运行容器

官方文档:https://docs.docker.com/engine/reference/commandline/run/

语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

# 常用 OPTIONS :
--name 容器新名字:为容器指定一个名称
-d: 后台运行容器并返回容器ID,即启动守护式容器(后台运行)

-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;也即启动交互式容器(前台有伪终端,等待交互);

-P: 随机端口映射,大写P
-p: 指定端口映射,小写p。示例 "-p 8000:3000":容器的 3000 端口映射到本机的 8000 端口

--rm:容器终止运行后自动删除容器文件。
--env env_key=env_value:向容器进程传入一个环境变量。示例" --env env_name=123456"

-v, --volume "$PWD/":/var/www/html:ro # 将当前目录($PWD)映射到容器的/var/www/html。因此,当前目录的任何修改,都会反映到容器里面,进而被外部访问到,可指定多个;
:ro # 只读
--volume /var/www/html # 在容器内部创建一个共享数据卷,数据卷只有在未被任何容器使用时才能被删除
--volume-from 容器ID # 挂载容器ID中的共享数据卷,实现在容器内部共享数据卷
--privileged=true # 获得宿主机root用户的权限,通常和 -v 结合使用

--link wordpressdb:mysql # 表示 WordPress 容器要连到wordpressdb容器,冒号表示该容器的别名是mysql,快要被废弃了。

--cpuset-cpus=0-3:设定容器可以使用哪些主机上的cpu核心,0-3:表示0核~3核,4个核心,1,2:表示1核和2
--memory=104857600:可以使用主机内存的上限,单位是B,这里表示100M 1024B * 1024B * 100

--restart=always:随着 Docker 服务的重启而重启

--user 指定容器内的用户。如果指定的用户在容器内不存在,Docker 会自动使用 root 用户创建用户。

--network [host|bridge|none|container:NAME]:指定网络模式。

--entrypoint: 重写 ENTRYPOINT 入口点。docker run --entrypoint=/bin/bash_you_image 注意:--entrypoint 不要放到命令的最后,放到最后会被当做 CMDMAND 参数。

# IMAGE
image 文件的名字(如果有标签,还需要提供标签,默认是 latest 标签)

# COMMAND
容器启动以后,内部第一个执行的命令。如 /bin/bash:启动 Bash,保证用户可以使用 Shell。

重要

-d 必须放到最后面,否则有时命令会失败。

示例

1
2
3
4
5
6
7
[lepeng@centos ~]# docker run -it centos /bin/bash

# 参数说明:
-i: 交互式操作。
-t: 终端。
centos : centos 镜像。
/bin/bash:放在镜像名后的是命令

其他

使用 docker run 命令来启动容器,docker 在后台运行的标准操作包括

  1. 检查本地是否存在指定的镜像,不存在则从公有仓库下载
  2. 使用镜像创建并启动容器
  3. 分配一个文件系统,并在只读的镜像层外面挂载一层可读可写层
  4. 从宿主主机配置的网桥接口中桥接一个虚拟接口道容器中去
  5. 从地址池分配一个ip地址给容器
  6. 执行用户指定的应用程序
  7. 执行完毕之后容器被终止

Docker 容器后台运行,就必须有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就会自动退出。

这个是 docker 的机制问题,比如你的 web 容器,我们以 nginx 为例,正常情况下,我们配置启动服务只需要启动响应的 service 即可。例如 service nginx start

但是这时 nginx 为后台进程模式运行,就导致 docker 前台没有运行的应用,这样的容器一旦启动,会立即自杀因为他觉得他没事可做了。

所以,最佳的解决方案是:将你要运行的程序以前台进程的形式运行,常见就是命令行模式,表示我还有交互操作,别中断。

docker ps 列出容器

官方文档:https://docs.docker.com/engine/reference/commandline/ps/

语法

1
2
3
4
5
6
docker ps [OPTIONS]

--all, -a: 列出当前所有正在运行的容器+历史上运行过的
--latest, -l: 显示最近创建的容器。
-n: 显示最近n个创建的容器。
--quiet, -q: 静默模式,只显示容器编号。

示例

1
[lepeng@centos ~]# docker ps -a

退出容器

退出容器有两种方式

  • exit:run 启动的容器,exit 退出,容器停止
  • ctrl+p+q:run 启动的容器,ctrl+p+q 退出,容器不停止

docker start 启动已停止运行的容器

官方文档:https://docs.docker.com/engine/reference/commandline/start/

语法

1
docker start [OPTIONS] CONTAINER [CONTAINER...]

示例

1
[lepeng@centos ~]# docker start my_container

docker restart 重启容器

官方文档:https://docs.docker.com/engine/reference/commandline/restart/

语法

1
docker restart [OPTIONS] CONTAINER [CONTAINER...]

示例

1
[lepeng@centos ~]# docker restart my_container

docker stop 停止容器

官方文档:https://docs.docker.com/engine/reference/commandline/stop/

语法

1
docker stop [OPTIONS] CONTAINER [CONTAINER...]

示例

1
[lepeng@centos ~]# docker stop my_container

docker kill 强制停止容器

官方文档:https://docs.docker.com/engine/reference/commandline/kill/

语法

1
docker kill [OPTIONS] CONTAINER [CONTAINER...]

示例

1
[lepeng@centos ~]#  docker kill my_container

docker rm 删除已停止的容器

官方文档:https://docs.docker.com/engine/reference/commandline/kill/

语法

1
2
3
4
docker rm [OPTIONS] CONTAINER [CONTAINER...]

--force , -f:强制删除,及时容器再运行,也会删除。
-v:删除容器挂载的数据卷,默认情况下删除容器不会删除数据卷,要删除一个数据卷,必须在删除最后一个挂载该数据卷的容器时使用 -v 参数。

示例

1
2
3
# 一次性删除多个容器实例
[lepeng@centos ~]# docker rm -f $(docker ps -a -q) # 删除全部容器
[lepeng@centos ~]# docker ps -a -q | xargs docker rm

docker exec 在运行的容器中执行命令,也可以进入容器(推荐)

官方文档:https://docs.docker.com/engine/reference/commandline/exec/

语法

1
2
3
4
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;也即启动交互式容器(前台有伪终端,等待交互);

示例

1
[lepeng@centos ~]# docker exec -it 容器ID /bin/bash

docker attach 重新进入容器

官方文档:https://docs.docker.com/engine/reference/commandline/attach/

语法

1
docker attach [OPTIONS] CONTAINER

示例

1
[lepeng@centos ~]# docker attach 容器ID

docker execdocker attach 重新进入容器的区别

  • attach 直接进入容器启动命令的终端,不会启动新的进程;用exit退出,会导致容器的停止。
  • exec 是在容器中打开新的终端,并且可以启动新的进程;用exit退出,不会导致容器的停止。
  • 推荐大家使用 docker exec 命令,因为退出容器终端,不会导致容器的停止。

docker logs 查看容器日志

官方文档:https://docs.docker.com/engine/reference/commandline/logs/

语法

1
docker logs [OPTIONS] CONTAINER

示例

1
2
3
4
5
6
[lepeng@centos ~]# docker run --name test -d busybox sh -c "while true; do $(echo date); sleep 1; done"

[lepeng@centos ~]# docker logs -f --until=2s test
Tue 14 Nov 2017 16:40:00 CET
Tue 14 Nov 2017 16:40:01 CET
Tue 14 Nov 2017 16:40:02 CET

docker top 显示容器内运行的进程

官方文档:https://docs.docker.com/engine/reference/commandline/top/

语法

1
docker top [OPTIONS] CONTAINER

示例

1
[lepeng@centos ~]#  docker top my_container

docker inspect 查看容器内部细节

官方文档:https://docs.docker.com/engine/reference/commandline/inspect/

语法

1
docker inspect [OPTIONS] NAME|ID [NAME|ID...]

示例

1
[lepeng@centos ~]# docker inspect my_container

docker cp 拷贝文件

官方文档:https://docs.docker.com/engine/reference/commandline/cp/

语法

1
2
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

示例

1
2
[lepeng@centos ~]# docker cp ./some_file CONTAINER:/work
[lepeng@centos ~]# docker cp CONTAINER:/var/logs/ /tmp/app_logs

03-Docker 容器相关命令
https://flepeng.github.io/042-云原生-01-Docker-21-命令-03-Docker-容器相关命令/
作者
Lepeng
发布于
2023年3月4日
许可协议