Docker入门4 - 容器 - 基本命令操作

103 阅读10分钟

容器

容器是Docker的另一个核心概念。简单来说,容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态。

创建容器 create
docker [container] create

[root@yz117 ~]# docker create -it ubuntu:18.04 6468ff36a16c2b3489f20d032baa9390250b009e275b10ff439d0807563baeeb

其他参数
-l, --label=[]:以键值对方式指定容器的标签信息;
--label-file=[]:从文件中读取标签信息

image.png

create命令与容器运行模式相关的选项

image.png create命令与容器环境和配置相关的选项

image.png create命令与容器资源限制和安全保护相关的选项

image.png

启动容器 start
docker [container] start

[root@yz117 ~]# docker start 6468ff36a16c 6468ff36a16c

新建+启动 run
docker [container] run

docker run ubuntu:18.04

run的执行过程

检查本地是否存在指定的镜像,不存在就从公有仓库下载;
利用镜像创建一个容器,并启动该容器;
分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去;
从网桥的地址池配置一个IP地址给容器;
执行用户指定的应用程序;
执行完毕后容器被自动终止。

run常见错误代码

125:Docker daemon执行出错,例如指定了不支持的Docker命令参数;
126:所指定命令无法执行,例如权限出错;
127:容器内命令无法找到。

守护状态运行 run -d
docker [container] run -d

[root@yz117 ~]# docker run -d ubuntu:18.04 e81e730cf619cdf8c118eea0ed1a95bd64ee00837785a3b5fbf80139a0070614

查看容器输出 logs
docker [container] logs

[root@yz117 ~]# docker logs 6468ff36a16c

其他参数
-details:打印详细信息;
-f, -follow:持续保持输出;
-since string:输出从某个时间开始的日志;
-tail string:输出最近的若干日志;
-t, -timestamps:显示时间戳信息;
-until string:输出某个时间之前的日志。

停止容器 pause
docker [container] pause CONTAINER[CONTAINER...]

[root@yz117 ~]# docker pause 6468ff36a16c 6468ff36a16c

Tips:
处于paused状态的容器,可以使用docker [container]unpause CONTAINER [CONTAINER...]命令来恢复到运行状态。

终止容器 stop
docker [container] stop [-t|--time[=10]][CONTAINER...]。

[root@yz117 ~]# docker stop 6468ff36a16c 6468ff36a16c

Tips:
可以用docker ps -qa命令看到所有容器的ID
此时,执行docker container prune命令,会自动清除掉所有处于停止状态的容器。
还可以通过docker [container] kill直接发送SIGKILL信号来强行终止容器。
处于终止状态的容器,可以通过docker [container] start命令来重新启动
docker [container] restart命令会将一个运行态的容器先终止,然后再重新启动

进入容器
在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。这个时候如果需要进入容器进行操作,推荐使用官方的attach或exec命令

1.attach
进入一个容器

后台启动容器
[root@yz117 ~]# docker run -itd ubuntu:18.04 84dacd44b2393d8b631903bae5179b73b0a7357f0c4fd0b7a03f564f77a3fd7b

[root@yz117 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
        84dacd44b239 ubuntu:18.04 "bash" 16 seconds ago Up 15 seconds zen_feynman

进入容器
[root@yz117 ~]# docker attach zen_feynman root@84dacd44b239:/#

支持参数
--detach-keys[=[]]:指定退出attach模式的快捷键序列,默认是CTRL-p CTRL-q;
--no-stdin=true|false:是否关闭标准输入,默认是保持打开;
--sig-proxy=true|false:是否代理收到的系统信号给应用进程,默认为true

2.exec
直接对运行中的容器运行命令

[root@yz117 ~]# docker exec f47c90e4088e echo "hello exec" 
hello exec

支持参数
 -d, --detach:在容器中后台执行命令;
 --detach-keys="":指定将容器切回后台的按键;❑ -e, --env=[]:指定环境变量列表;
 -i, --interactive=true|false:打开标准输入接受用户输入命令,默认值为false--privileged=true|false:是否给执行命令以高权限,默认值为false;
 -t, --tty=true|false:分配伪终端,默认值为false;
 -u, --user="":执行命令的用户名或ID。

Tips: 通过指定-it参数来保持标准输入打开,并且分配一个伪终端。通过exec命令对容器执行操作是最为推荐的方式。

删除容器 rm
可以使用docker [container] rm命令来删除处于终止或退出状态的容器,命令格式为docker [container] rm [-f|--force] [-l|--link] [-v|--volumes] CONTAINER [CONTAINER...]。

[root@yz117 ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS                       PORTS     NAMES
f47c90e4088e   ubuntu:18.04   "bash"                   2 minutes ago   Up 2 minutes                           objective_beaver
84dacd44b239   ubuntu:18.04   "bash"                   7 minutes ago   Exited (130) 2 minutes ago             zen_feynman
e81e730cf619   ubuntu:18.04   "bash"                   5 days ago      Exited (0) 5 days ago                  elated_vaughan
b9b7f9992c38   ubuntu:18.04   "bash"                   5 days ago      Exited (0) 5 days ago                  jovial_mendel
6468ff36a16c   ubuntu:18.04   "bash"                   5 days ago      Exited (0) 5 days ago                  jolly_keldysh
3c6c63ffef8b   7da38d446d3d   "/bin/sh -c 'yum -y …"   5 days ago      Exited (1) 5 days ago                  cranky_cartwright
2da5ea8fb995   ubuntu:18.04   "/bin/bash"              5 days ago      Exited (127) 5 days ago                jovial_goldwasser

[root@yz117 ~]# docker rm 3c6c63ffef8b
3c6c63ffef8b

支持参数
-f, --force=false:是否强行终止并删除一个运行中的容器;
-l, --link=false:删除容器的连接,但保留容器;
-v, --volumes=false:删除容器挂载的数据卷。

Tips: 默认情况下,docker rm命令只能删除已经处于终止或退出状态的容器,并不能删除还处于运行状态的容器。如果要直接删除一个运行中的容器,可以添加-f参数。Docker会先发送SIGKILL信号给容器,终止其中的应用,之后强行删除:

[root@yz117 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND   CREATED         STATUS         PORTS     NAMES
f47c90e4088e   ubuntu:18.04   "bash"    4 minutes ago   Up 4 minutes             objective_beaver

[root@yz117 ~]# docker rm -f f47c90e4088e
f47c90e4088e

导入与导出容器
1.导出容器 export 导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态。可以使用docker [container]export命令

[root@yz117 ~]# docker export -o test_export.tar 84dacd44b239

2.导入容器 import

[root@yz117 ~]# docker import test_export.tar  test/ub
sha256:186579a7a5eabfa2073923990391f1dbc4fed32af30b37fcc0aea13387554d27
[root@yz117 ~]# docker images
REPOSITORY                                                    TAG                 IMAGE ID       CREATED         SIZE
test/ub                                                       latest              186579a7a5ea   6 seconds ago   63.2MB

查看容器 inspect 查看容器详情可以使用docker container inspect [OPTIONS]CONTAINER [CONTAINER...]子命令。 1.查看容器详情

root@yz117 ~]# docker inspect test/ub
[
    {
        "Id": "sha256:186579a7a5eabfa2073923990391f1dbc4fed32af30b37fcc0aea13387554d27",
        "RepoTags": [
            "test/ub:latest"
        ],
        "RepoDigests": [],
        "Parent": "",
        "Comment": "Imported from -",
        "Created": "2022-05-18T09:35:23.114194541Z",
        "Container": "",
        "ContainerConfig": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": null,
            "Cmd": null,
            "Image": "",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": null
        },
        "DockerVersion": "20.10.15",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": null,
            "Cmd": null,
            "Image": "",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": null
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 63153709,
        "VirtualSize": 63153709,
        "GraphDriver": {
            "Data": {
                "MergedDir": "/var/lib/docker/overlay2/286ef4b240e13a12adf4c4f7704f679b4c64a1e1fa4fa49c70785958917d4426/merged",
                "UpperDir": "/var/lib/docker/overlay2/286ef4b240e13a12adf4c4f7704f679b4c64a1e1fa4fa49c70785958917d4426/diff",
                "WorkDir": "/var/lib/docker/overlay2/286ef4b240e13a12adf4c4f7704f679b4c64a1e1fa4fa49c70785958917d4426/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:10b22687031a650664b2987102c37a98f9c234aab4bdb31c38fa53d6d99ed9ba"
            ]
        },
        "Metadata": {
            "LastTagTime": "2022-05-18T17:35:23.116540778+08:00"
        }
    }
]

2.查看容器内进程 top

[root@yz117 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND   CREATED         STATUS         PORTS     NAMES
35b6a054af07   ubuntu:18.04   "bash"    4 seconds ago   Up 4 seconds             admiring_johnson
[root@yz117 ~]# docker top 35b6a054af07
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                29950               29930               0                   17:41               pts/0               00:00:00            bash

3.查看统计信息 stats

[root@yz117 ~]# docker stats -a

支持参数
-a, -all:输出所有容器统计信息,默认仅在运行中;
-format string:格式化输出信息;
-no-stream:不持续输出,默认会自动更新持续实时结果;
-no-trunc:不截断输出信息。

其他容器命令
1.复制文件
container cp命令支持在容器和主机之间复制文件。命令格式为docker [container] cp [OPTIONS] CONTAINER:SRC_PATHDEST_PATH|-。

将data 复制到 test容器中tmp的目录中
docker cp data test:/tmp/

支持参数

-a, -archive:打包模式,复制文件会带有原始的uid/gid信息;
-L, -follow-link:跟随软连接。当原路径为软连接时,默认只复制链接信息,使用该选项会复制链接的目标内容。

2.查看变更
container diff查看容器内文件系统的变更。命令格式为docker[container] diff CONTAINER。\

查看test容器内的修改
docker container diff test

3.查看端口映射
container port命令可以查看容器的端口映射情况。命令格式为docker container port CONTAINER[PRIVATE_PORT[/PROTO]]\

查看test容器的端口映射情况
docker container port admiring_johnson 9000/tcp

4.更新配置 container update命令可以更新容器的一些运行时配置,主要是一些资源限制份额。命令格式为docker [container] update[OPTIONS] CONTAINER [CONTAINER...]

docker update -cpu-perio 100000 test

支持参数
-blkio-weight uint16:更新块IO限制,10~1000,默认值为0,代表着无限制;
-cpu-period int:限制CPU调度器CFS(CompletelyFair Scheduler)使用时间,单位为微秒,最小1000;
-cpu-quota int:限制CPU调度器CFS配额,单位为微秒,最小1000;
-cpu-rt-period int:限制CPU调度器的实时周期,单位为微秒;
-cpu-rt-runtime int:限制CPU调度器的实时运行时,单位为微秒;
-c, -cpu-shares int:限制CPU使用份额;❑ -cpus decimal:限制CPU个数;
-cpuset-cpus string:允许使用的CPU核,如0-3,0,1;❑ -cpuset-mems string:允许使用的内存块,如0-3,0,1;
-kernel-memory bytes:限制使用的内核内存;
-m, -memory bytes:限制使用的内存;
-memory-reservation bytes:内存软限制;
-memory-swap by