docker-容器
文章目录
运行容器
docker run=docker create + docker start
可用三种方式指定容器启动时 执行的命令
- CMD 指令。
- ENTRYPOINT 指令。
- 在 docker run 命令行中指定。
bash
#使用ubuntu镜像创建容器
[root@docker ~]# docker create ubuntu
eb1aa0ca86b2d49250ebe64913af50e88482ad68b9c3e61ef8f8da9c24b00f7a
#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 ps
CONTAINER 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"
进入容器
bash
#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 dc508b94447f83b46080267580607569a187fcc7f780433f646e9d66949731a6
I_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 方式运行。
运行容器
bash
[root@docker ~]# docker run -it busybox
/ #
/ # wget www.baidu.com
Connecting to www.baidu.com (223.109.82.6:80)
saving to 'index.html'
index.html 100% |********************| 2381 0: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 恢复运行。
bash
#举例
#基于httpd镜像创建容器httpd11,重启策略配置为always
[root@docker ~]# docker run -d --restart=always --name httpd11 httpd
7671267fabf6aafe49fe74256af8d0af07cd65e4af4222933385f3203bc0228e
#查看发现多了个httpd11容器
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
7671267fabf6 httpd "httpd-foreground" 3 seconds ago Up 2 seconds
80/tcp `httpd11`
27359e7cf87e httpd "httpd-foreground" About a minute ago Up About a
minute 80/tcp eager_northcutt
#登陆到容器httpd11,然后执行ctrl_c退出容器(会触发--restart=always参数)
[root@docker ~]# docker attach httpd11
^C[Mon Nov 17 07:48:31.582731 2025] [mpm_event:notice] [pid 1:tid 1] AH00491:
caught SIGTERM, shutting down
#发现httpd11重启了
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
7671267fabf6 httpd "httpd-foreground" 32 seconds ago Up 2 seconds
80/tcp httpd11
27359e7cf87e httpd "httpd-foreground" 2 minutes ago Up About a minute
80/tcp eager_northcutt
#管理员停止httpd11(不会触发重启)
[root@docker ~]# docker stop httpd11
httpd11
#发现httpd11没有重启
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
7671267fabf6 httpd "httpd-foreground" 51 seconds ago Exited (0) 1
second ago httpd11
27359e7cf87e httpd "httpd-foreground" 2 minutes ago Up 2 minutes
80/tcp eager_northcutt
限制容器对内存的使用
cgroup( Control Groups):docker 通过 cgroup 来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面,基本覆盖了常见的 资源配额和使用量控制。
bash
#stress模拟压力测试的工具
[root@docker dockerfile]# vim Dockerfile
FROM ubuntu
MAINTAINER xxx "123@qq.com"
RUN apt-get -y update && apt-get -y install stress
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。
bash
[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.shares
1024
#再开一个窗口,启动 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.shares
512
#top命令查看总比例是2:1
#或者再开一个窗口看cpu使用率
[root@docker docker]# docker stats
#现在暂停 container_A观察cpu
[root@docker ~]# docker pause container_A
#top 显示 container_B 在 container_A 空闲的情况下能够用满整颗 CPU
容器导出导入
bash
#将容器导出为一个tar包
#不管此时这个容器是否处于运行状态,都可以导出为文件
# 创建容器httpd1用于测试
[root@docker ~]# docker run -d --name httpd1 httpd
e4f0a329c4df50ef0afb0bf21e22edc20e5a24c03ae64c6340aa2992d6e32525
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
e4f0a329c4df httpd "httpd-foreground" 3 minutes ago Up 3 minutes
80/tcp httpd1
[root@docker ~]# docker export httpd1 -o myhttpd.tar
[root@docker ~]# ls
myhttpd.tar
[root@docker ~]# docker import myhttpd.tar
sha256:9ae4699fa217a7240c73a50e93a8c1d359d22cf60869d350c8aab8b3c02aabcf
[root@docker ~]# docker import myhttpd.tar myweb:v1
sha256:9fcb90561d2014130ef19f9dd8af5efd7a0a4a2154907bc818ac6b887f13755c
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myweb v1 9fcb90561d20 3 seconds ago 146MB
<none> <none> 9ae4699fa217 32 seconds ago 146MB
httpd latest 90f191b9781e 11 days ago 148MB
hello-world latest 74cc54e27dc4 6 months ago 10.1kB
docker save 和 docker export 对比
- docker save :将镜像保存为文件,save会保存该镜像的所有元数据和历史记录。
- docker export :将容器导出为文件,文件会丢失所有元数据和历史记录,仅保存容器当时的状 态,再次导入会当作全新的镜像。
- docker save导出的文件可以使用docker import导入。
实现容器的底层技术
- cgroup 实现资源限额。
- namespace 实现资源隔离。
cgroup
bash
#在 /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
bash
#UTS namespace 让容器有自己的 hostname, -h简写
#User namespace 让容器能够管理自己的用户,host 不能看到容器中创建的用户。
[root@docker ~]# docker exec -it a80f1f8b692c 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 中并不会创建相应的用户。
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 中并不会创建相应的用户。 ``` ```