docker容器

docker-容器

文章目录

运行容器

docker run=docker create + docker start

可用三种方式指定容器启动时 执行的命令

  1. CMD 指令。
  2. ENTRYPOINT 指令。
  3. 在 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

容器用途分类

  1. 服务类容器以 daemon 的形式运行,对外提供服务。比如 web server,数据库等。通过 -d 以后 台方式启动这类容器是非常合适的。如果要排查问题,可以通过 exec -it 进入容器。
  2. 工具类容器:通常给能我们提供一个临时的工作环境,通常以 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

  1. stop:容器在 docker host 中实际上是一个进程, docker stop 命令本质上是向该进程发送一个 SIGTERM 信 号。如果想快速停止容器,可使用 docker kill 命令,其作用是向容器进程发送 SIGKILL 信号。
  2. 对于处于停止状态的容器,可以通过 docker start 重新启动。会保留容器的第一次启动时的所有参数。
  3. docker restart 可以重启容器,其作用就是依次执行 docker stop 和 docker start 。容器可能会因某种错误而停止运行。对于服务类容器,我们通常希望在这种情况下容器能够自动重启。 启动容器时设置 --restart 就可以达到这个效果。 如果docker run -d httpd不加--restart=always参数,attach进去ctrl+c不会重启。
  4. 只有当容器的启动进程 退出 时, --restart 才生效。
  5. 有时我们只是希望暂时让容器暂停工作一段时间,比如要对容器的文件系统打个快照,或者 dcoker host 需要使用 CPU,这时可以执行 docker pause 。
  6. 处于暂停状态的容器不会占用 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 中并不会创建相应的用户。 ``` ```

相关推荐
海鸥812 小时前
k8s 国内无法下载docker images的分析
docker
一人の梅雨2 小时前
亚马逊SP-API商品评论接口实战:情感分析+商业洞察挖掘的差异化方案
运维·前端·数据库
养乐多q.♡2 小时前
docker镜像的nginx配置证书SSL,单独配置单个localtion使用证书,其他nginx配置不影响
nginx·docker·ssl
FED_AF2 小时前
rsync远程文件同步实用指南
运维·rsync
Y.O.U..2 小时前
Kurbenetes-Service(1)
容器·kubernetes
Q16849645152 小时前
知识点-创建、查看和编辑文本文件
linux·运维
小宇的天下2 小时前
Calibre 3Dstack --每日一个命令days11【dangling_ports】(3-11)
linux·运维·服务器
HIT_Weston3 小时前
97、【Ubuntu】【Hugo】搭建私人博客:搜索功能(二)
linux·运维·ubuntu
安科瑞小许3 小时前
分布式光伏车棚的智慧化运维:从数据采集到AI赋能
运维·人工智能·分布式·能源·光伏