docker-容器
文章目录
- docker-容器
- 运行容器
- 进入容器
- 容器用途分类
- 运行容器
- 常用操作
- 限制容器对内存的使用
- 限制容器对CPU的使用
- 容器导出导入
- docker save 和 docker export 对比
- 实现容器的底层技术
- cgroup
- namespace
运行容器
docker run=docker create + docker start
可用三种方式指定容器启动时 执行的命令
- CMD 指令。
- ENTRYPOINT 指令。
- 在 docker run 命令行中指定。
#使用ubuntu镜像创建容器[root@docker ~]# docker create ubuntueb1aa0ca86b2d49250ebe64913af50e88482ad68b9c3e61ef8f8da9c24b00f7a#create的容器状态时Created[root@docker ~]# docker ps -a[root@docker ~]# docker start eb1aa0ca86b2#查看容器状态,启动了又退出了[root@docker ~]# docker ps -a#使用ubuntu镜像创建容器并执行pwd命令[root@docker ~]# docker run ubuntu pwd /#查看所有正在运行中的容器[root@docker ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES# -a 看全部#让容器保存运行[root@docker ~]# docker run ubuntu /bin/bash -c "while true ; do sleep 1 ; echo hahaha; done"# -d 后台运行[root@docker ~]# docker run -d ubuntu /bin/bash -c "while true ; do sleep 1 ; echo hahaha; done"进入容器
#attach[root@docker ~]# docker run -d ubuntu /bin/bash -c "while true ; do sleep 1 ; echo I_am_in_container ; done"[root@docker ~]# docker attach dc508b94447f83b46080267580607569a187fcc7f780433f646e9d66949731a6I_am_in_container I_am_in_container I_am_in_container I_am_in_container#exec#格式:docker exec -it <container> bash|sh[root@docker ~]# docker exec -it dc508 bash#查看启动命令的输出[root@docker ~]# docker logs -f dc508b94447f容器用途分类
- 服务类容器以 daemon 的形式运行,对外提供服务。比如 web server,数据库等。通过 -d 以后 台方式启动这类容器是非常合适的。如果要排查问题,可以通过 exec -it 进入容器。
- 工具类容器:通常给能我们提供一个临时的工作环境,通常以 run -it 方式运行。
运行容器
[root@docker ~]# docker run -it busybox/#/# wget www.baidu.comConnecting to www.baidu.com(223.109.82.6:80)saving to'index.html'index.html100%|********************|23810:00:00 ETA'index.html'saved /#/# exit[root@docker ~]#常用操作
stop/start/restart
- stop:容器在 docker host 中实际上是一个进程, docker stop 命令本质上是向该进程发送一个 SIGTERM 信 号。如果想快速停止容器,可使用 docker kill 命令,其作用是向容器进程发送 SIGKILL 信号。
- 对于处于停止状态的容器,可以通过 docker start 重新启动。会保留容器的第一次启动时的所有参数。
- docker restart 可以重启容器,其作用就是依次执行 docker stop 和 docker start 。容器可能会因某种错误而停止运行。对于服务类容器,我们通常希望在这种情况下容器能够自动重启。 启动容器时设置 --restart 就可以达到这个效果。 如果docker run -d httpd不加–restart=always参数,attach进去ctrl+c不会重启。
- 只有当容器的启动进程 退出 时, --restart 才生效。
- 有时我们只是希望暂时让容器暂停工作一段时间,比如要对容器的文件系统打个快照,或者 dcoker host 需要使用 CPU,这时可以执行 docker pause 。
- 处于暂停状态的容器不会占用 CPU 资源,直到通过 docker unpause 恢复运行。
#举例#基于httpd镜像创建容器httpd11,重启策略配置为always[root@docker ~]# docker run -d --restart=always --name httpd11 httpd7671267fabf6aafe49fe74256af8d0af07cd65e4af4222933385f3203bc0228e#查看发现多了个httpd11容器[root@docker ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7671267fabf6 httpd"httpd-foreground"3seconds ago Up2seconds80/tcp`httpd11`27359e7cf87e httpd"httpd-foreground"About a minute ago Up About a minute80/tcp eager_northcutt#登陆到容器httpd11,然后执行ctrl_c退出容器(会触发--restart=always参数)[root@docker ~]# docker attach httpd11^C[Mon Nov1707:48:31.5827312025][mpm_event:notice][pid1:tid1]AH00491: caught SIGTERM, shutting down#发现httpd11重启了[root@docker ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7671267fabf6 httpd"httpd-foreground"32seconds ago Up2seconds80/tcp httpd11 27359e7cf87e httpd"httpd-foreground"2minutes ago Up About a minute80/tcp eager_northcutt#管理员停止httpd11(不会触发重启)[root@docker ~]# docker stop httpd11httpd11#发现httpd11没有重启[root@docker ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7671267fabf6 httpd"httpd-foreground"51seconds ago Exited(0)1second ago httpd11 27359e7cf87e httpd"httpd-foreground"2minutes ago Up2minutes80/tcp eager_northcutt限制容器对内存的使用
cgroup( Control Groups):docker 通过 cgroup 来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面,基本覆盖了常见的 资源配额和使用量控制。
#stress模拟压力测试的工具[root@docker dockerfile]# vim DockerfileFROM ubuntu MAINTAINER xxx"123@qq.com"RUNapt-get-y update&&apt-get-yinstallstress ENTRYPOINT["/usr/bin/stress"]# 以服务或进程的形式运行[root@docker ~]# docker build -t ubuntu-with-stress .[root@docker ~]# docker run -it -m 200M --memory-swap=300M ubuntu-with-stress --vm 1 --vm-bytes 280M -v#如果在启动容器时只指定 -m 而不指定 --memory-swap ,那么 --memory-swap 默认为 -m 的两倍。限制容器对CPU的使用
Docker 可以通过 -c 或 --cpu-shares 设置容器使用 CPU 的权重。如果不指定,默认值为 1024。
[root@docker ~]# docker run --name "container_A" -it -c 1024 ubuntu-withstress --cpu 4 -v#使用如下命令,创建容器,则最终生成的 cgroup 的 CPU 份额配置可以下面的文件中找到。[root@docker ~]# cat /sys/fs/cgroup/cpu/docker/<容器长ID>/cpu.shares1024#再开一个窗口,启动 container_B,cpu share 为 512[root@docker ~]# docker run --name "container_B" -it -c 512 ubuntu-withstress --cpu 4 -v[root@docker ~]# cat /sys/fs/cgroup/cpu/docker/<容器长ID>/cpu.shares512#top命令查看总比例是2:1#或者再开一个窗口看cpu使用率[root@docker docker]# docker stats#现在暂停 container_A观察cpu[root@docker ~]# docker pause container_A#top 显示 container_B 在 container_A 空闲的情况下能够用满整颗 CPU容器导出导入
#将容器导出为一个tar包#不管此时这个容器是否处于运行状态,都可以导出为文件# 创建容器httpd1用于测试[root@docker ~]# docker run -d --name httpd1 httpde4f0a329c4df50ef0afb0bf21e22edc20e5a24c03ae64c6340aa2992d6e32525[root@docker ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e4f0a329c4df httpd"httpd-foreground"3minutes ago Up3minutes80/tcp httpd1[root@docker ~]# docker export httpd1 -o myhttpd.tar[root@docker ~]# lsmyhttpd.tar[root@docker ~]# docker import myhttpd.tarsha256:9ae4699fa217a7240c73a50e93a8c1d359d22cf60869d350c8aab8b3c02aabcf[root@docker ~]# docker import myhttpd.tar myweb:v1sha256:9fcb90561d2014130ef19f9dd8af5efd7a0a4a2154907bc818ac6b887f13755c[root@docker ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE myweb v1 9fcb90561d203seconds ago 146MB<none><none>9ae4699fa21732seconds ago 146MB httpd latest 90f191b9781e11days ago 148MB hello-world latest 74cc54e27dc46months ago10.1kBdocker save 和 docker export 对比
- docker save :将镜像保存为文件,save会保存该镜像的所有元数据和历史记录。
- docker export :将容器导出为文件,文件会丢失所有元数据和历史记录,仅保存容器当时的状 态,再次导入会当作全新的镜像。
- docker save导出的文件可以使用docker import导入。
实现容器的底层技术
- cgroup 实现资源限额。
- namespace 实现资源隔离。
cgroup
#在 /sys/fs/cgroup 中找到cgroup[root@docker docker]# docker run -it --cpu-shares 512 ubuntu-with-stress -c 1 -v#在 /sys/fs/cgroup/cpu/docker 目录中,Linux 会为每个容器创建一个 cgroup 目录,以容器长ID 命名。namespace
#UTS namespace 让容器有自己的 hostname, -h简写#User namespace 让容器能够管理自己的用户,host 不能看到容器中创建的用户。[root@docker ~]# docker exec -it a80f1f8b692c bashroot@a80f1f8b692c:/#root@a80f1f8b692c:/# useradd gaoqd #容器中创建用户gaoqdroot@a80f1f8b692c:/#root@a80f1f8b692c:/# exitexit[root@docker ~]# su - gaoqd #宿主机中并没有用户gaoqdsu: user gaoqd does not exist#在容器中创建了用户 gaoqd,但 host 中并不会创建相应的用户。92c bash
root@a80f1f8b692c:/#
root@a80f1f8b692c:/# useradd gaoqd #容器中创建用户gaoqd
root@a80f1f8b692c:/#
root@a80f1f8b692c:/# exit
exit
[root@docker ~]# su - gaoqd #宿主机中并没有用户gaoqd
su: user gaoqd does not exist
#在容器中创建了用户 gaoqd,但 host 中并不会创建相应的用户。