docker 容器管理

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

1.创建容器

docker的容器十分轻量级,可以随时创建或删除容器

主要命令: create,start,run,wait和logs 

1.1 创建容器

docker create    #新建容器
[root@kubernetes /docker]# docker images 
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
yunwei                       latest              ba1fe2957df1        40 minutes ago      237MB
test                         latest              84130a579e4b        43 minutes ago      237MB

[root@kubernetes /docker]# docker create -it yunwei:latest
8fc5c62bcb1a0d8731918ccb509ee3094fc41e878d026157b6a3b5dd4bd0ea24

[root@kubernetes /docker]# docker ps -a 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
8fc5c62bcb1a        yunwei:latest       "/bin/bash"         8 seconds ago       Created                                 naughty_proskuriakova

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

[root@ybsrv1 /data]# docker start distracted_mclean
distracted_mclean

参数:

-a, --attach= []  是否绑定到标准输入,输出和错误

-d, --deach=true|false  是否在后台运行容器,默认为否

-i, --interachive=true|false 保持标准输入打开,默认为false

-t, --tty=true|false  是否分配一个伪终端,不能和-d同时使用

-w, --workdir=""  容器内的默认工作目录

-e, --env=[]  指定容器内环境变量

-h, --hostname=""  指定容器内的主机名

-l, --label=[]: 以键值对方式指定容器的标签信息;

--label-file=[]: 从文件中读取标签信息

1.2 新建并启动容器

启动容器有两种方式,一种是基于新建一个容器并启动,另一个是将在终止状态(stopped)的容器重新启动。所需要的命令主要为docker run,等价于先执行docker createt 命令,在执行docker start 命令。

输入‘hello world’之后容器自动终止

[root@ybsrv1 /data]# docker run test /bin/echo 'hello world'
hello world

当利用docker run 来创建并启动容器时,docker在后台运行标准

1.检查本地是否存在指定的镜像,不存在的就从公有仓库下载

2. 利用镜像创建并启动一个容器

3. 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层

4. 从宿主主机配置的网桥接口中桥接一个虚拟接口道容器中去

5.从地址池配置一个ip地址给容器

6. 执行用户指定的应用程序

7.执行完毕后容器被终止

1.2.1 启动 一个bash终端,允许用户交互

[root@ybsrv1 ~]# docker run -t -i data:latest /bin/bash
root@181687bdedc2:/# 

参数:

-t #docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上

-i #让容器输入保持打开
root@181687bdedc2:/# pwd 
/
root@181687bdedc2:/# ls 
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@181687bdedc2:/# ps   #ps查看进程只有bash
  PID TTY          TIME CMD
    1 ?        00:00:00 bash
   17 ?        00:00:00 ps
root@181687bdedc2:/# exit  #退出
exit
[root@ybsrv1 ~]# 

exit之后容器处于终止状态,这是因为对docker容器来说,当运行的应用(此处为bash)退出后,容器没有必要运行

某些时候,执行docker [container] run时候因为名利无法正常执行容器会出现直接退出,此时可以查看退出的错误代码

默认情况下,常见的错误代码包括:

125 Docker daemon 执行出错,例如指定了不支持的Doker命令参数

126 所指定命令无法执行,例如权限出错

127 容器内命令无法找到

1.2.2 守护状态运行

守护进程运行是通过添加-d参数

运行容器

[root@ybsrv1 ~]# docker run -d data /bin/sh -c "while true; do echo hello world; sleep 1 ;done"
e3bab27b60e174dd2fe91880c3a5fe38ccda04ede7404610bd03fc65523bd683

查看容器信息使用docker ps 或docker container ls 

[root@ybsrv1 ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
e3bab27b60e1        data                "/bin/sh -c 'while t   17 seconds ago      Up 16 seconds                           happy_hawking      

查看容器输出

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

该命令支持的选项包括

-details: 打印详细信息

-f -follow: 持续保持输出

-since string: 输出从某个时间开始的日志;

-tail string: 输出最近的若干日志

-t -tamestamps: 显示时间戳信息

-until string: 输出某个时间之前的日志

查看容器输出信息

[root@ybsrv1 ~]# docker logs e3b
hello world
hello world
...

2.1 暂停容器

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

暂停容器

[root@kubernetes /docker]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
66a1fe0de9f8        yunwei              "/bin/sh -c 'while t…"   About a minute ago   Up About a minute                       keen_mestorf
8fc5c62bcb1a        yunwei:latest       "/bin/bash"              42 minutes ago       Up 40 minutes                           naughty_proskuriakova
[root@kubernetes /docker]# docker pause keen_mestorf
keen_mestorf

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

 docker unpause keen_mestorf

2.2终止容器

docker stop [-t] --time[=10]

默认10s后发送停止信息

[root@ybsrv1 ~]# docker stop e3b
e3b

查看容器信息

[root@ybsrv1 ~]# docker ps -a -q
e3bab27b60e1
181687bdedc2
86971d5dab4a
f70d606f1e44
2705c7d53909
90a1c9ed8d1d

处于停止的容器可以他通过docker start 命令启动

[root@ybsrv1 ~]# docker start  e3b
e3b
[root@ybsrv1 ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
e3bab27b60e1        data                "/bin/sh -c 'while t   9 minutes ago       Up 13 seconds                           happy_hawking 

restart可以让容器停止启动

[root@ybsrv1 ~]# docker restart  e3b
e3b
[root@ybsrv1 ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
e3bab27b60e1        data                "/bin/sh -c 'while t   13 minutes ago      Up 3 seconds                            happy_hawking       

2.3 限制资源

-m  设置内存
docker run -d  -m="128m" -p 8080:80 -e Mem=128 -h web1 --name=web nginx

查看资源使用

docker stats web

允许容器最多使用500M内存和100M的swap,并禁用 OOM Killer:

docker run -d --name web01 -m="500m" --memory-swap="600m" --oom-kill-disable nginx

允许容器最多使用1个半的CPU;

docker run -d --name web04 --cpus="1.5" nginx

允许容器最多使用50%的cpu:

docker run -d --name web02 --cpus=".5" nginx

更新内存资源

docker update -m="128m" web01

3. 进入容器

使用-d参数容器启动后会进入后台,用户无法看到容器信息,如果需要进入容器操作,很多种方法,包括使用docker attach命令,docker exec命令,以及nsenter 工具

3.1 attach命令

格式为:

docker [container] attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER

这个命令支持三个主要选项:

--detach-keys[=[]] : 指定退出attach模式的快捷键序列,默认是CTRL-p CTRL-q;

--no-stdin=true|false : 是否关闭标准输入,默认是保持打开;

--sig-proxy=true|false: 是否代理收到的系统信号给应用进程,默认为true
[root@ybsrv1 ~]# docker run -idt data
5c56956c579075b12b41c82c3b70c6fb6115427bcf4599297d16e5660911951a
[root@ybsrv1 ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
5c56956c5790        data                "/bin/bash"         2 seconds ago       Up 2 seconds                            kickass_mclean      
[root@ybsrv1 ~]# docker attach kickass_mclean
root@5c56956c5790:/# 

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

3.2 exec 命令

[root@ybsrv1 ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
5c56956c5790        data                "/bin/bash"         2 hours ago         Up 3 seconds                            kickass_mclean      
[root@ybsrv1 ~]# docker exec -ti 5c56956c5790 /bin/bash
root@5c56956c5790:/# 

3.3 nsenter 工具

nsenter工具在util-linux.包2.23版本后包含

若没有则源码安装:

cd /data/

wget https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v2.30/util-linux-2.30.tar.gz 

tar xf util-linux-2.30.tar.gz

cd util-linux-2.30

./configure --without-ncurses

make nsenter && cp nsenter /usr/local/bin

使用nsenter链接到容器,还需要获得容器的pid

docker inspect --format "{{.State.Pid}}" < containner>

nsenter --target $PID --mount --uts --ipc --net --pid

例子

[root@ybsrv1 /data]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
8760e806d0c3        data                "/bin/bash"         About an hour ago   Up About an hour                        sharp_swartz        
[root@ybsrv1 /data]# docker inspect -f {{.State.Pid}} 8760e806d0
21957
[root@ybsrv1 /data]# nsenter --target 21957 --mount --uts --ipc --net --pid
root@8760e806d0c3:/# 

3.4 删除容器

使用docker rm 命令删除处于终止状态的容器其格式为docker rm [OPTIONS]  CONT AINER [CONTAINER...]

-f  #--force=false强行终止并删除一个运行 的容器

-l  #--link=false删除容器的链接,但保留容器

-v  #--volumes=false删除容器挂载的数据卷 

例子

[root@ybsrv1 /data]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                         PORTS               NAMES
8760e806d0c3        data                "/bin/bash"            About an hour ago   Exited (0) 45 seconds ago                          sharp_swartz        
5c56956c5790        data                "/bin/bash"            4 hours ago         Exited (0) About an hour ago                       kickass_mclean      
e3bab27b60e1        data                "/bin/sh -c 'while t   4 hours ago         Exited (137) 4 hours ago                           happy_hawking       
181687bdedc2        data:latest         "/bin/bash"            4 hours ago         Exited (0) 4 hours ago                             romantic_wilson     
86971d5dab4a        data                "/bin/echo 'hello wo   4 hours ago         Exited (0) 4 hours ago                             berserk_bardeen     
90a1c9ed8d1d        ubuntu              "echo 'i see world'"   29 hours ago        Exited (127) 29 hours ago                          angry_hodgkin       
[root@ybsrv1 /data]# docker rm 90a1c9ed8d1d
90a1c9ed8d1d

删除运行中的容器添加 -f

[root@ybsrv1 /data]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
8760e806d0c3        data                "/bin/bash"         About an hour ago   Up 2 minutes                            sharp_swartz        
[root@ybsrv1 /data]# docker rm 876
Error response from daemon: Cannot destroy container 876: Conflict, You cannot remove a running container. Stop the container before attempting removal or use -f
Error: failed to remove containers: [876]
[root@ybsrv1 /data]# docker  rm -f 876
876

3.5 导入导出容器

导出一个容器时指导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,可以使用docker export 命令,该命令格式为docker export CONTAINER

-o参数用来指定导出的tar文件名,也可以直接重定向实现

导出容器:

[root@kubernetes /docker]# docker ps -a 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
991157dab7e8        centos              "/bin/bash"              10 minutes ago      Exited (0) 10 minutes ago                       nervous_driscoll
66a1fe0de9f8        yunwei              "/bin/sh -c 'while t…"   25 minutes ago      Up 6 minutes                                    keen_mestorf
8fc5c62bcb1a        yunwei:latest       "/bin/bash"              About an hour ago   Up About an hour                                naughty_proskuriakova

[root@kubernetes /docker]# docker export -o nervous_driscoll.tar.gz 66a1fe

[root@kubernetes /docker]# docker export 8fc5c > ceshi.tar.gz

[root@kubernetes /docker]# ll
total 717644
-rw-r--r-- 1 root root 244944896 Mar 19 16:14 ceshi.tar.gz
-rw------- 1 root root 244944896 Mar 19 16:14 nervous_driscoll.tar.gz
-rw------- 1 root root 244967424 Mar 19 14:45 yunwei.tar.gz

导入容器

导出的文件又可以使用docker import 命令导入,成为镜像

[root@ybsrv1 /data]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
test                latest              2defae56a525        24 hours ago        188.1 MB
data                latest              a3158aa0a86b        28 hours ago        188.1 MB
centos              latest              ee2526f4865b        12 days ago         201.8 MB
ubuntu              14.04               cd44af56e7ce        2 weeks ago         188.1 MB
ubuntu              latest              9989c6003fac        2 weeks ago         88.91 MB
[root@ybsrv1 /data]# cat data_stop.tar |docker import - nis/centos:v1.0
d3a820195ca5efd6dbdc5aace51fbeaf55b7443f760e776881a243d68311fe52
[root@ybsrv1 /data]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
nis/centos          v1.0                d3a820195ca5        9 seconds ago       175.2 MB
test                latest              2defae56a525        24 hours ago        188.1 MB
data                latest              a3158aa0a86b        28 hours ago        188.1 MB
centos              latest              ee2526f4865b        12 days ago         201.8 MB
ubuntu              14.04               cd44af56e7ce        2 weeks ago         188.1 MB
ubuntu              latest              9989c6003fac        2 weeks ago         88.91 MB

[root@kubernetes /docker]# docker import ceshi.tar -- nis/ceshi:v1.0
sha256:55880038b3c2b1214b6f1469da14cd0875f53f3d8bc61e25e307655e2dd673cc
[root@kubernetes /docker]# docker images 
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
nis/ceshi                    v1.0                55880038b3c2        5 seconds ago       237MB

3.6 查看容器

1. 查看容器详情

可以使用docker container inspect [OPTIONS] CONTAINER [CONTAINER...]子命令

[root@kubernetes /docker]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
66a1fe0de9f8        yunwei              "/bin/sh -c 'while t…"   48 minutes ago      Up 29 minutes                           keen_mestorf
8fc5c62bcb1a        yunwei:latest       "/bin/bash"              About an hour ago   Up About an hour                        naughty_proskuriakova
[root@kubernetes /docker]# docker container inspect keen_mestorf

2. 查看容器进程

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

这个子命令类似于Linux 系统中的top命令,打印出进程信息,包括PID,用户,时间,命令等

[root@kubernetes /docker]# docker top keen_mestorf 
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                17041               17025               0                   16:06               ?                   00:00:00            /bin/sh -c while true; do echo hello world; sleep 1;done --name test
root                19254               17041               0                   16:38               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1

3. 查看统计信息

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

-a, -all: 输出所有容器统计信息,默认尽在运行中;

-format string: 格式化输出信息

-no-stream: 不支持输出,默认会自动更新持续实时结果;

-no-trunc: 不截断输出信息
[root@kubernetes /docker]# docker stats keen_mestorf

3.7 容器命令

1.复制文件

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

-a, -archive:打包模式,复制文件会带有原始的uid/gid信息;

-L, -follow-link: 跟随软连接。当原路径为软连接时,默认只复制连接信息,使用该选项会复制连接的目标内容
docker cp tmp.QGPPSFbjtn/ keen_mestorf:/tmp

2. 查看变更

container diff查看容器内文件系统的变更

命令格式为:

docker [container] diff CONTAINER

查看容器数据修改

[root@kubernetes /tmp]# docker container diff keen_mestorf
C /root
C /root/.bash_history
C /tmp
A /tmp/tmp.QGPPSFbjtn

3. 查看厑映射

container port 命令可以查看容器端口映射情况。命令格式为

docker container port CONTAINER [PRIVATE_PORT[/PROTO]]

查看容器端口映射情况

[root@onetree-test001 ~]# docker container port memcached 
11211/tcp -> 0.0.0.0:11222

4. 更新配置

container 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个数l

-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: 内存加上缓存区的限制, -l表示为对缓冲区无限之;

-restart string: 容器退出后重启策略

如: 限制总配额为1s,容器test所占用时间为10%,如下

[root@kubernetes /tmp]# docker update --cpu-quota 1000000  keen_mestorf
keen_mestorf
[root@kubernetes /tmp]# docker update --cpu-period 100000  keen_mestorf
keen_mestorf

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值