容器是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