docker到底与一般的虚拟机有什么不同呢?
我们知道一般的linux系统即GNU/Linux系统包括两个部分,linux系统内核+GNU提供的大量自由软件,而centos就是众多GNU/Linux系统中的一个。
虚拟机会在宿主机上虚拟出一个完整的操作系统与宿主机完全隔离,是一个重量级的系统,而doker利用linux系统的namespace等特性使用宿主机的内核+自己的GNU外壳虚拟出一个轻量级的linux系统,也能实现与宿主机的隔离。所以,我们使用docker pull下来的操作系统例如centos pull下来的只有GNU外壳,不包含linux内核,所以体积很小。
镜像分层的一大好处就是共享资源,例如有多个镜像都来自与同一个base镜像,那么在docker host值需要存储一份base镜像。内存中之需要加载一份host,即可为多个容器服务。即使多个容器共享一个base镜像,当某个容器修改了base镜像,如修改了/etc/下的配置文件,其他容器也不会受到影响,这就是容器的写时复制机制。
当容器启动后,一个新的可写层容器层被加载岛镜像的顶部,,所有对容器的修改动作,都只会发生在容器层,只有容器层是可写的,其余镜像层都是只读的。
文件操作 | 说明 |
---|---|
添加文件 | 在容器中创建文件是,新文件会被添加到容器层 |
读取文件 | 在容器中读取某个文件时,Dokcer会自上而下依次再各镜像中查找此文件,一旦找到,立即将其复制到容器层 |
修改文件 | 在容器中修改已存在的文件时,Docker会自上而下依次在各镜像层中查找此文件,一旦找到,就会将其复制到容器层,然后修改 |
删除文件 | 在容器中删除文件时,Docker也是从上往下依次在镜像层中查找此文件,找到后,会在容器层记录下此操作 |
主要组成部分:
基本指令:
使用
docker run ${image}
来运行容器,使容器处于前台运行状态,但是如果容器内什么事情也没有做,会自动退出。
如:
daitian@DaiT-Home:~$ docker run centos
daitian@DaiT-Home:~$ docker ps -a | grep centos
b62dde459b45 centos "/bin/bash" 4 minutes ago Exited (0) 4 minutes ago objective_darwin
14193bbb3f25 centos "/bin/bash" 7 hours ago Exited (127) 7 hours ago friendly_euler
可以看出容器直接exited。
但是像nginx这种,会直接将服务运行在前台
daitian@DaiT-Home:~$ docker run nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2023/05/14 10:53:00 [notice] 1#1: using the "epoll" event method
2023/05/14 10:53:00 [notice] 1#1: nginx/1.23.4
2023/05/14 10:53:00 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
2023/05/14 10:53:00 [notice] 1#1: OS: Linux 5.15.79.1-microsoft-standard-WSL2
2023/05/14 10:53:00 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2023/05/14 10:53:00 [notice] 1#1: start worker processes
2023/05/14 10:53:00 [notice] 1#1: start worker process 29
2023/05/14 10:53:00 [notice] 1#1: start worker process 30
2023/05/14 10:53:00 [notice] 1#1: start worker process 31
2023/05/14 10:53:00 [notice] 1#1: start worker process 32
2023/05/14 10:53:00 [notice] 1#1: start worker process 33
2023/05/14 10:53:00 [notice] 1#1: start worker process 34
2023/05/14 10:53:00 [notice] 1#1: start worker process 35
2023/05/14 10:53:00 [notice] 1#1: start worker process 36
2023/05/14 10:53:00 [notice] 1#1: start worker process 37
2023/05/14 10:53:00 [notice] 1#1: start worker process 38
2023/05/14 10:53:00 [notice] 1#1: start worker process 39
2023/05/14 10:53:00 [notice] 1#1: start worker process 40
2023/05/14 10:53:00 [notice] 1#1: start worker process 41
2023/05/14 10:53:00 [notice] 1#1: start worker process 42
2023/05/14 10:53:00 [notice] 1#1: start worker process 43
2023/05/14 10:53:00 [notice] 1#1: start worker process 44
2023/05/14 10:53:00 [notice] 1#1: start worker process 45
2023/05/14 10:53:00 [notice] 1#1: start worker process 46
2023/05/14 10:53:00 [notice] 1#1: start worker process 47
2023/05/14 10:53:00 [notice] 1#1: start worker process 48
使用exec进入正在运行的容器
docker exec ${容器名称} command(ex:bash)
tips:直接用root用户进入容器
docker exec -ti --user root {容器名} /bin/bash
容器化时代,容器大规模部署,导致其难以维护,因此出现了k8s
参考视视频:添加链接描述