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 容器 db
的PID = 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 进程,没什么特别的。