运行容器
标签(空格分隔): docker
三种启动容器时执行命令的方法
1、CMD
2、ENDPOINT
3、docker run
# docker run ubuntu pwd
启动容器时执行pwd命令 返回容器中的当前目录 然后容器就退出运行状态 Exited
# docker ps -a
# docker container ls
#查看所有运行状态的容器
让容器长期运行
容器的生命周期依赖于启动时执行的命令,只要该命令不结束,容器就不会退出
# docker run -d ubuntu /bin/bash -c "while true; do sleep 1;done"
CONTAINER ID 容器的短ID
NAMES字段显示容器的名字 在启动容器时通过 --name
参数指定容器名 容器默认自动分配容器名
通过while 启动的容器虽然能保持运行,但实际上没有任何意义。容器的用途是运行后台服务
进入容器
# docker attach
可以到容器启动的终端(附着
# docker exec
# docker exec -it ubuntu /bin/bash
交互模式打开 执行bash ,打开了一个bash终端
进入容器,容器的hostname就是其短ID
可以像linux中一样执行命令
执行exit退出容器
1、attach直接进入容器 启动命令的终端,不会产生新的进程
2、exec 是在容器中打开新的终端
3、如果想直接在终端中查看启动命令的输出,用attach 其他情况使用exec
4、只是为了查看启动命令的输出可以使用 docker logs命令
最佳实践
两类:服务类和工具类
1、服务类以daemon的形式运行,对外提供服务 web 数据库等 通过-d以后台方式启动这类容器
2、工具类容器通常能给我们提供一个临时工作环境
# docker run -it busybox
容器运行相关
1、当CMD或Entrypoint或docker run 命令行指定的命令运行结束时,容器停止
2、通过-d参数在后台启动容器
3、通过-exec -it 进入容器 并打开一个新的终端
指定容器的三方法
1、短ID
2、长ID
3、容器名称 可通过docker rename 重命名
docker stop
停止运行的容器
容器在docker host中只是一个进程。如果想快速停止容器可以使用docker kill
命令
docker start
运行停止的容器
保留容器的第一次启动时的所有参数
docker restart
可以重启容器,其作用是依次执行 stop、start
--restart=always
意味着无论容器因何种原因退出(包括正常退出)就立即重启
—-restart=on-failure:3
如果启动进程退出代码非0,则重启容器,最多3次
docker pause
让容器暂停工作一段时间 这时候容器不会占用CPU资源 STATUS 状态会显示 pause
docker unpause
恢复暂停的容器
docker rm
删除容器 rm可以一次指定多个容器
docker rm -v $(docker ps -aq -f status=exited)
删除全部退出状态的容器
1、容器可以先创建,而不启动
docker create
命令创建的容器处于created状态
2、使用 docker start
启动容器 docker run 其实是 create 和 start 的组合命令
3、只有当容器命令退出时 --restart 才生效
容器退出分为正常退出和非正常退出 docker 会根据--restart 的策略判断是否需要重启容器
限制容器对资源的使用
内存限额
容器可使用的内存分为 物理内存和swap
-m --memory 参数设置物理内存的使用量
--memory-swap 设置物理内存和swap内存的使用总量
# docker create --memory 200M --memory-swap 300M --network=my_net0 ubuntu bash -c "while true; do sleep 1;done"
限制物理内存的使用量为200M swap为300-200M
默认不指定的情况下 上面两组参数为 -1 即不做限制
# docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 199M
--vm 1 启动一个内存工作进程
--vm-bytes 199M 每个进程分配199M内存
云主机没有swap分区,超过200M启动失败
stress: FAIL: [1] (422) kill error: No such process
stress: FAIL: [1] (452) failed run completed in 0s
如果在启动容器时只指定 -m 而不指定 --memory-swap,那么 --memory-swap 默认为 -m 的两倍,内存和swap相同量
CPU限额
默认设置下所有容器平等的使用cpu资源
-c --cpu-shares 设置容qin器使用cpu的权重。默认为1024
按权重分配cpu只会发生在cpu资源紧张的情况下、在cpu空闲状态 被限制的容器也可以获取到全部cpu资源
# docker run --name container_A -it -c 1024 progrium/stress --cpu 1
# docker run --name container_B -it -c 512 progrium/stress --cpu 1
--cpu 用来限制工作线程的数量
block IO权重
默认情况下,所有容器能平等地读写磁盘
--blkio-weight 参数来改变容器 block IO 的优先级
--blkio-weight 和 --cpu-shares类似,设置的是相对权重值 默认为500
docker run -it --name con_A --blkio-weight 600 ubuntu
bps和iops
bps 是 byte per second,每秒读写的数据量。
iops 是 io per second,每秒 IO 的次数
--device-read-bps,限制读某个设备的 bps
--device-write-bps,限制写某个设备的 bps
--device-read-iops,限制读某个设备的 iops
--device-write-iops,限制写某个设备的 iops
docker run -it --device-write-bps /dev/sda:30MB ubuntu
cgroup 全称 control group linux操作系统通过cgroup可以设置进程使用CPU、MEM、IO资源的限制
# docker run -d --cpu-shares 512 centos bash -c "while true; do sleep 1;done"
/sys/fs/cgroup
/sys/fs/cgroup/cpu/docker 目录中包含所有与 cpu 相关的 cgroup 配置
/sys/fs/cgroup/memory/docker
/sys/fs/cgroup/blkio/docker
namespace
每个容器中,都有文件系统、网卡 每个容器都会认为自己有独立的物理设备 她使容器更像一个独立的计算机
linux实现这种方式的技术是namespace。 namespace掌管着host中的全部资源,并让每个容器都觉的自己独占使用它
namespace实现了容器间资源隔离
- mount namespace 让容器看上去拥有全部文件系统 让容器拥有根文件系统
- UTS namespace 让容器有自己的hostname 默认情况下hostname是他的短ID
- IPC namespace 让容器拥有自己的共享内存和信号量semaphore来实现进程间通信 而不会和host和其他容器的IPC混在一起
- PID namespace 让容器拥有一套自己的PID
ps axf
可以看到容器的进程和容器内自己的子进程 - Network namespace 让容器拥有自己独立的网卡、IP、路由
- User namespace 让容器管理自己的用户,和宿主机进行隔离
网友评论