Docker入门-docker容器常用命令

Docker容器操作

本篇主要介绍docker容器常用命令。

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

介绍-新建容器

docker create

可以使用docker [container] create命令新建一个容器

[root@localhost bin]# docker create -it halm-front:1.0
f8ced3d93f0c9d430fac23e1ed6b355fca0489420194c91e9a8a0504fc5e8920
[root@localhost bin]# docker ps -a
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                          PORTS               NAMES
f8ced3d93f0c        halm-front:1.0             "/usr/share/nginx/..."   6 seconds ago       Created  

docker start

使用docker [container] create命令新建的容器处于停止状态,可以使用docker [container] start命令来启动它。

[root@localhost bin]# docker start f8ced3d93f0c
f8ced3d93f0c
[root@localhost bin]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
f8ced3d93f0c        halm-front:1.0      "/usr/share/nginx/..."   About a minute ago   Up 50 seconds       80/tcp, 8080/tcp    keen_keller
[root@localhost bin]# 

docker run

除了创建容器后通过start命令来启动,也可以直接新建并启动容器。所需要的命令主要为docker [container] run,等价于先执行docker [container] create命令,再执行docker [container] start命令。

当利用docker [container] run来创建并启动容器时,Docker在后台运行的标准操作包括:

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

使用docker run命令,程序会一直在前台执行

[root@localhost bin]# docker stop f8ced3d93f0c
f8ced3d93f0c
[root@localhost bin]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost bin]# docker run halm-front:1.0

新开一个终端查看

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
ddf58365c93f        halm-front:1.0      "/usr/share/nginx/..."   44 seconds ago      Up 43 seconds       80/tcp, 8080/tcp    elastic_murdock
[root@localhost ~]# 

docker run -d

更多的时候,需要让Docker容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加-d参数来实现。

仍然以上面的docker run为例,容器启动后会返回一个唯一的id,也可以通过docker ps或docker container ls命令来查看容器信息

[root@localhost bin]# docker run -d halm-front:1.0
042b48379deff574e582152e79ae061e01e3c207e2f4892459579ec0ab68143d
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
042b48379def        halm-front:1.0      "/usr/share/nginx/..."   17 seconds ago      Up 15 seconds       80/tcp, 8080/tcp    gifted_fermat
[root@localhost ~]# 

docker logs

要获取容器的输出信息,可以通过docker[container] logs命令。

该命令支持的选项包括:

  • –details:打印详细信息;
  • -f, -follow:持续保持输出;
  • –since string:输出从某个时间开始的日志;
  • –tail string:输出最近的若干日志;
  • -t, --timestamps:显示时间戳信息;
  • –until string:输出某个时间之前的日志
[root@localhost ~]# docker logs 98a1eae8fb3f
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: error: /etc/nginx/conf.d/default.conf differs from the packaged version
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up

介绍-停止容器

主要介绍Docker容器的pause/unpause、stop和prune子命令。

docker pause

可以使用docker [container] pause CONTAINER[CONTAINER…]命令来暂停一个运行中的容器。

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

[root@localhost ~]# docker ps |grep nginx
98a1eae8fb3f        nginx:latest            "/docker-entrypoin..."   7 months ago        Up 6 minutes        80/tcp, 0.0.0.0:8080->8080/tcp                                                               nginx-server
[root@localhost ~]# docker pause nginx-server
nginx-server
[root@localhost ~]# docker ps |grep nginx
98a1eae8fb3f        nginx:latest            "/docker-entrypoin..."   7 months ago        Up 6 minutes (Paused)   80/tcp, 0.0.0.0:8080->8080/tcp                                                               nginx-server
[root@localhost ~]# 
[root@localhost ~]# docker unpause nginx-server
nginx-server
[root@localhost ~]# docker ps |grep nginx
98a1eae8fb3f        nginx:latest            "/docker-entrypoin..."   7 months ago        Up 8 minutes        80/tcp, 0.0.0.0:8080->8080/tcp                                                               nginx-server

docker stop

可以使用docker [container] stop来终止一个运行中的容器。该命令的格式为docker [container]stop [-t|–time[=10]] [CONTAINER…]。

该命令会首先向容器发送SIGTERM信号,等待一段超时时间后(默认为10秒),再发送SIGKILL信号来终止容器

此时,执行docker container prune命令,会自动清除掉所有处于停止状态的容器。此外,还可以通过docker [container] kill直接发送SIGKILL信号来强行终止容器。当Docker容器中指定的应用终结时,容器也会自动终止。

[root@localhost ~]# docker stop nginx-server
nginx-server
[root@localhost ~]# docker ps |grep nginx

docker start

用于启动一个关闭的容器

[root@localhost ~]# docker start nginx-server
nginx-server
[root@localhost ~]# docker ps |grep nginx
98a1eae8fb3f        nginx:latest            "/docker-entrypoin..."   7 months ago        Up 1 second         80/tcp, 0.0.0.0:8080->8080/tcp                                                               nginx-server
[root@localhost ~]#

docker restart

用于启动一个关闭/运行中的容器

[root@localhost ~]# docker restart nginx-server
nginx-server
[root@localhost ~]# docker ps |grep nginx
98a1eae8fb3f        nginx:latest            "/docker-entrypoin..."   7 months ago        Up 1 second         80/tcp, 0.0.0.0:8080->8080/tcp                                                               nginx-server
[root@localhost ~]#

介绍-进入容器

在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。

这个时候如果需要进入容器进行操作,推荐使用官方的attach或exec命令。

docker attach

使用attach命令有时候并不方便。当多个窗口同时attach到同一个容器的时候,所有窗口都会同步显示;当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

[root@localhost ~]# docker attach nginx-server

docker exec

该命令重要的参数:

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

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

[root@localhost ~]# docker exec -it nginx-server /bin/bash
root@98a1eae8fb3f:/# 

介绍-删除容器

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

支持的选项:

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

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

dockers rm

删除使用Dockerfile生成的镜像

[root@localhost ~]# docker ps -a|grep "halm-front"
ddf58365c93f        halm-front:1.0             "/usr/share/nginx/..."   23 hours ago        Exited (0) 23 hours ago                                                                                                  elastic_murdock
f8ced3d93f0c        halm-front:1.0             "/usr/share/nginx/..."   23 hours ago        Exited (0) 23 hours ago                                                                                                  keen_keller
[root@localhost ~]# docker ps -a|grep "halm-front"|awk '{print "docker rm",$1}'|bash
ddf58365c93f
f8ced3d93f0c
[root@localhost ~]# 

介绍-导入和导出容器

docker export

导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态。可以使用docker [container] export命令,该命令格式为docker export [-o|--output[=""]] CONTAINER其中,可以通过-o选项来指定导出的tar文件名,也可以直接通过重定向来实现

[root@localhost ~]# docker export -o test.tar 98a1eae8fb3f
[root@localhost ~]# ls *.tar
frontbase9.tar  test.tar
[root@localhost ~]# 

docker import

实际上,既可以使用docker load命令来导入镜像存储文件到本地镜像库,也可以使用docker[container] import命令来导入一个容器快照到本地镜像库。这两者的区别在于:容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积更大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。

可参考帮助docker import --help

[root@localhost ~]# docker import test.tar test/mynginx:v1.0
sha256:41310ee60a9c592df3eb3178b4af43f2414b0dab90b2a60c70ab1486621a6aa0
[root@localhost ~]# docker images
REPOSITORY                                        TAG                 IMAGE ID            CREATED             SIZE
test/mynginx                                      v1.0                41310ee60a9c        6 seconds ago       131 MB

介绍-查看容器

主要介绍Docker容器的inspect、top和stats子命令。

docker inspect

查看某容器的具体信息,会以json格式返回包括容器Id、创建时间、路径、状态、镜像、配置等在内的各项信息:

[root@localhost ~]# docker inspect 98a1eae8fb3f
[
    {
        "Id": "98a1eae8fb3f695fe97a7558c2cd4a426cf53952b8f942458dc1add742225c22",
        "Created": "2020-08-11T02:26:33.737014404Z",
        "Path": "/docker-entrypoint.sh",
....
]

docker top

查看容器内进程可以使用docker [container] top[OPTIONS] CONTAINER [CONTAINER…]子命令。

[root@localhost ~]# docker top 98a1eae8fb3f
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                11417               11400               0                   10:33               ?                   00:00:00            nginx: master process nginx -g daemon off;
101                 11485               11417               0                   10:33               ?                   00:00:00            nginx: worker process
[root@localhost ~]# 

docker stats

查看统计信息可以使用docker [container] stats[OPTIONS] [CONTAINER…]子命令,会显示CPU、内存、存储、网络等使用情况的统计信息。

  • -a, -all:输出所有容器统计信息,默认仅在运行中;
  • -format string:格式化输出信息;
  • -no-stream:不持续输出,默认会自动更新持续实时结果;
  • -no-trunc:不截断输出信息。
CONTAINER           CPU %               MEM USAGE / LIMIT       MEM %               NET I/O             BLOCK I/O           PIDS
98a1eae8fb3f        0.00%               1.391 MiB / 1.777 GiB   0.08%               656 B / 656 B       2.81 MB / 0 B       2

介绍-其他命令

主要介绍Docker容器的cp、diff、port和update子命令。

docker cp

docker cp命令支持在容器和主机之间复制文件。

支持的选项包括:

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

从容器内拷贝文件出来:

[root@localhost ~]# docker cp 98a1eae8fb3f:/etc/nginx/nginx.conf .
[root@localhost ~]# ls *.conf
nginx.conf

从外部拷贝至容器内:需注意容器再运行状态下,拷贝同名文件可能会报错。

[root@localhost ~]# docker cp ./nginx.conf 98a1eae8fb3f:/etc/nginx
Error response from daemon: Error processing tar file(exit status 1): remove /etc/nginx/nginx.conf: device or resource busy
[root@localhost ~]# mv nginx.conf nginx1.conf 
[root@localhost ~]# docker cp ./nginx1.conf 98a1eae8fb3f:/etc/nginx
[root@localhost ~]# docker exec -it 98a1eae8fb3f /bin/bash
root@98a1eae8fb3f:/# cd /etc/nginx/
root@98a1eae8fb3f:/etc/nginx# ls *.conf
nginx.conf  nginx1.conf
root@98a1eae8fb3f:/etc/nginx# 

docker diff

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

[root@localhost ~]# docker diff nginx-server
C /etc
C /etc/nginx
A /etc/nginx/nginx1.conf
C /root
A /root/.bash_history
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/proxy_temp/1
A /var/cache/nginx/proxy_temp/1/00
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp
C /run
A /run/nginx.pid
A /run/secrets
[root@localhost ~]# 

docker port

可以查看容器的端口映射情况。

[root@localhost ~]# docker port nginx-server
8080/tcp -> 0.0.0.0:8080
[root@localhost ~]# 

docker update

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

支持的选项包括:

  • -blkio-weight uint16:更新块IO限制,10~1000,默认值为0,代表着无限制;
  • -cpu-period int:限制CPU调度器CFS(Completely Fair 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 bytes:内存加上缓存区的限制,-1表示为对缓冲区无限制;
  • -restart string:容器退出后的重启策略。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值