Docker container 是啥?

本文详细解析了容器的本质,揭示其如何作为普通Linux进程运作,通过实例展示如何使用docker操作容器,以及通过ps, pidof, pstree和/proc/pid理解容器内部结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Containers are just normal Linux Processes with additional configuration applied.
容器只是有附加配置的 Linux 进程。

以 redis:alpine 镜像为例

docker run 运行一个容器

$ docker run -d --name=db redis:alpine # --name 指定容器名称
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redis               alpine              c1949ec48c51        3 days ago          31.1MB
$ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
318daf6d400f        redis:alpine        "docker-entrypoint.s…"   22 seconds ago      Up 22 seconds       6379/tcp            db
$

一个容器就是一个进程

ps 查找启动的 redis-server 进程

$ ps aux | grep redis-server
999       2423  0.2  1.2  28956 12884 ?        Ssl  08:33   0:01 redis-server
root      2666  0.0  0.0  14220  1008 pts/0    R+   08:41   0:00 grep --color=auto redis-server

可以看到本次启动的 redis 容器 dbPID = 2423。进程名是 redis-server

pidof 根据进程名查找 PID

$ pidof redis-server
2423

pstree 查看进程层级关系

$ pstree -c -p -A $(pgrep dockerd) #-c --compact ; -p --show-pids
dockerd(698)-+-docker-containe(741)-+-docker-containe(2409)-+-redis-server(2423)-+-{bio_aof_fsync}(2459)
             |                      |                       |                    |-{bio_close_file}(2458)
             |                      |                       |                    |-{bio_lazy_free}(2460)
             |                      |                       |                    `-{jemalloc_bg_thd}(2461)
             |                      |                       |-{docker-containe}(2410)
             |                      |                       |-{docker-containe}(2411)
             |                      |                       |-{docker-containe}(2412)
             |                      |                       |-{docker-containe}(2413)
             |                      |                       |-{docker-containe}(2415)
             |                      |                       `-{docker-containe}(2416)
             |                      |-{docker-containe}(744)
             |                      |-{docker-containe}(745)
             |                      |-{docker-containe}(746)
             |                      |-{docker-containe}(750)
             |                      |-{docker-containe}(751)
             |                      |-{docker-containe}(752)
             |                      |-{docker-containe}(759)
             |                      |-{docker-containe}(1827)
             |                      |-{docker-containe}(2721)
             |                      `-{docker-containe}(2722)
             |-{dockerd}(734)
             |-{dockerd}(736)
             |-{dockerd}(737)
             |-{dockerd}(738)
             |-{dockerd}(742)
             |-{dockerd}(762)
             |-{dockerd}(763)
             |-{dockerd}(764)
             `-{dockerd}(767)

/proc/pid 中查看

$ DBPID=$(pgrep redis-server)
$ echo Redis is $DBPID
Redis is 2423
$ ls /proc
1    132  2     2423  3    53   64   741   buddyinfo    fb           kpagecgroup  pagetypeinfo   sysvipc
10   133  20    25    33   54   641  757   bus          filesystems  kpagecount   partitions     thread-self
11   134  208   257   34   55   65   766   cgroups      fs           kpageflags   sched_debug    timer_list
12   135  21    26    35   56   66   8     cmdline      interrupts   loadavg      schedstat      timer_stats
124  144  217   2604  36   57   68   837   consoles     iomem        locks        scsi           tty
126  15   22    27    460  58   697  839   cpuinfo      ioports      mdstat       self           uptime
127  16   223   2700  471  583  698  85    crypto       irq          meminfo      slabinfo       version
128  169  23    2726  486  59   7    86    devices      kallsyms     misc         softirqs       version_signature
129  17   2396  274   488  60   719  87    diskstats    kcore        modules      stat           vmallocinfo
13   170  24    28    5    61   72   9     dma          keys         mounts       swaps          vmstat
130  18   240   2831  502  62   729  949   driver       key-users    mtrr         sys            zoneinfo
131  19   2409  29    52   63   739  acpi  execdomains  kmsg         net          sysrq-trigger

$ ls /proc/$DBPID
attr        cmdline          environ  io         mem         ns             pagemap      schedstat  stat     timers
autogroup   comm             exe      limits     mountinfo   numa_maps      personality  sessionid  statm    uid_map
auxv        coredump_filter  fd       loginuid   mounts      oom_adj        projid_map   setgroups  status   wchan
cgroup      cpuset           fdinfo   map_files  mountstats  oom_score      root         smaps      syscall
clear_refs  cwd              gid_map  maps       net         oom_score_adj  sched        stack      task
$ cat /proc/$DBPID/environ  # 环境变量
HOSTNAME=318daf6d400fSHLVL=2REDIS_DOWNLOAD_SHA=dc2bdcf81c620e9f09cfd12e85d3bc631c897b2db7a55218fd8a65eaa37f86ddHOME=/home/redisPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binREDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.0.9.tar.gzREDIS_VERSION=6.0.9PWD=/data

$ docker exec -it db env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=318daf6d400f
TERM=xterm
REDIS_VERSION=6.0.9
REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.0.9.tar.gz
REDIS_DOWNLOAD_SHA=dc2bdcf81c620e9f09cfd12e85d3bc631c897b2db7a55218fd8a65eaa37f86dd
HOME=/root

综上可知,容器(Container) 就是一个 Linux 进程,没什么特别的。

References

  1. what is a container?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值