-
在学习使用docker过程中会遇到镜像和容器,两者之间的区别是什么?一.什么是image镜像可以看成是由多个镜像层叠加起来的一个文件系统(通过UnionFS与AUFS文件联合系统实现),镜像层也可以简单理解为一个基本的镜像,而每个镜像层之间通过指针的形式进行叠加。镜像是一堆只读层的统一视角,除了最底层没有指向外,每一层都指向它的父层。统一文件系统( Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在。在用户的角度看来,只存在一个文件系统。镜像每一层都是不可写的,都是只读层。二.什么是容器?容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。要点:容器 = 镜像 + 读写层,并且容器的定义并没有提及是否要运行容器。总结:Image与Container之间的区别和联系? 镜像由一层层只读层堆在一起,容器为镜像只读层+读写层,运行态容器为由一个可读写的文件系统「静态容器」+ 隔离的进程空间和其中的进程构成。 镜像的概念更多偏向于一个环境包,这个环境包可以移动到任意的Docker平台中去运行;而容器就是你运行环境包的实例。你可以针对这个环境包运行N个实例。换句话说container是images的一种具体表现形式。你也可以认为镜像与你装载操作系统iso镜像是一个概念,容器则可理解为镜像启动的操作系统。一个镜像可以启动任意多个容器,即可以装载多个操作系统。
-
首先拉镜像root@ecs-385f:~/gitlab# docker pull beginor/gitlab-ce:11.0.1-ce.011.0.1-ce.0: Pulling from beginor/gitlab-ceb234f539f7a1: Pull complete 55172d420b43: Pull complete 5ba5bbeb6b91: Pull complete 43ae2841ad7a: Pull complete f6c9c6de4190: Pull complete e6597e975df6: Pull complete 73dc92c66025: Pull complete 5282194f87d6: Pull complete df88dfe59bb1: Pull complete dffab5bd4f6d: Pull complete 945907026b4f: Downloading [==================================> ] 304.8MB/443.6MBc2fd3f9dce0a: Download complete dcd61611748b: Download complete 18b2c0be8c67: Download complete 1e1d10273471: Download complete 58c783f2b859: Download complete 2ac94cbcc08d: Download complete 6c10cd924130: Download complete 1df14ac85b55: Download complete 同时另开一个终端,准备好一会儿要用的目录和命令:Last login: Tue Jun 29 15:57:02 2021 from 61.139.x.xroot@ecs-385f:~# mkdir -p /mnt/gitlab/etcroot@ecs-385f:~# mkdir -p /mnt/gitlab/logroot@ecs-385f:~# mkdir -p /mnt/gitlab/dataroot@ecs-385f:~# docker run \> --detach \> --publish 8443:443 \> --publish 8090:80 \> --name gitlab \> --restart unless-stopped \> -v /mnt/gitlab/etc:/etc/gitlab \> -v /mnt/gitlab/log:/var/log/gitlab \> -v /mnt/gitlab/data:/var/opt/gitlab \> beginor/gitlab-ce:11.0.1-ce.0等待镜像拉取完毕,在第二个终端敲回车。修改vim /mnt/gitlab/etc/gitlab.rb文件写入external_url 'x.x.x.x'修改vim /mnt/gitlab/data/gitlab-rails/etc/gitlab.yml ## Web server settings (note: host is the FQDN, do not include http://) host: x.x.x.x port: 8090 https: false浏览器访问 http://x.x.x.x:8090
-
docker-Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 docker-Compose,可以使用 YML 文件来配置应用程序需要的所有服务。通过使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。docker-compose up -d 构建启动容器docker-compose exec 容器 bash 登录到容器中docker-compose down 删除所有nginx容器,镜像docker-compose ps 显示所有容器docker-compose restart 容器 重新启动容器docker-compose build 容器 构建容器镜像docker-compose logs 容器 查看容器的日志docker-compose logs -f 容器 查看容器的实时日志最常用的是加黑部分,其余容器控制相关的命令也可以通过docker完成,这样就可以少记一点了。
-
CMD用法:• CMD[ “executable”,"param1”,“param2”]:exec形式(首选)python形式的语法,参数必须用双引号包裹,是官方推荐的形式。• CMD["param1”,“param2”]:作为ENTRYPOINT的默认参数•CMD command param1 param2: Shell形式shell形式参数可以传变量,而exec形式则不能直接传递变量参数。ENTRYPOINT用法:• ENTRYPOINT ["executable","param1","param2"]• ENTRYPOINT command paraml param2dockerfile的基本命令中,CMD和ENTRYPOINT都用来表示进入容器默认执行的命令。ENTRYPOINT提供了更加灵活的命令行输入接口,可以方便的传参。docker build 命令的最后,可以用CMD 参数覆盖CMD方式的默认命令,而对于ENTRYPOINT则需要使用参数--entrypoint 来覆盖。
-
修改Dockerfile:LABEL maintainer lteCOPY run.sh /usr/binENV NAME=lteEXPOSE 80CMD ["run.sh","lte"] //传递参数lte给run.shrun.sh文件:root@ecs-385f:~# cat run.sh#!/bin/bashecho hello $1sleep 6000root@ecs-385f:~# root@ecs-385f:~# docker rm -f $(docker ps -aq)6603ecc631b8root@ecs-385f:~# docker run -d test1427aaeaddc0e5d8b0966e34f9bd83b192de4c0b7b00b94376b2fc19960029e5froot@ecs-385f:~# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES427aaeaddc0e test1 "run.sh lte" 13 seconds ago Up 12 seconds 80/tcp keen_williamsroot@ecs-385f:~# docker logs 427aaeaddc0e hello lteroot@ecs-385f:~#
-
root@ecs-385f:~# vi DockerfileLABEL maintainer lteADD b.tar.gz /optFROM centos:7LABEL maintainer lteCOPY run.sh /usr/binADD b.tar.gz /optENV ABC=123ENV NAME=lteEXPOSE 80CMD ["sleep","360000"] "Dockerfile.txt" [New] 8L, 132C written root@ecs-385f:~# lsDockerfile no.txt ping.sh run.sh wwwroot yes.txtroot@ecs-385f:~# touch b.txtroot@ecs-385f:~# tar zcvf b.tar.gz b.txtb.txtdocker build 默认用Dockerfile,所以下面的命令行直接省略了。root@ecs-385f:~# docker build -t test .Sending build context to Docker daemon 171kBStep 1/8 : FROM centos:7 ---> 8652b9f0cb4cStep 2/8 : LABEL maintainer lte ---> Using cache ---> 0a62f05ce5f6Step 3/8 : COPY run.sh /usr/bin ---> Using cache ---> 5f057319688aStep 4/8 : ADD b.tar.gz /opt ---> e152028ed4d5Step 5/8 : ENV ABC=123 ---> Running in 58a13d507448Removing intermediate container 58a13d507448 ---> b31ca78cbd1eStep 6/8 : ENV NAME=lte ---> Running in cbb46739feb2Removing intermediate container cbb46739feb2 ---> 59b595ef9371Step 7/8 : EXPOSE 80 ---> Running in b474deed0eecRemoving intermediate container b474deed0eec ---> a15479d1a743Step 8/8 : CMD ["sleep","360000"] ---> Running in 40ca216469f3Removing intermediate container 40ca216469f3 ---> 1fffd8e4497fSuccessfully built 1fffd8e4497fSuccessfully tagged test:latestroot@ecs-385f:~# lsb.tar.gz b.txt Dockerfile no.txt ping.sh run.sh wwwroot yes.txtroot@ecs-385f:~# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEtest latest 1fffd8e4497f 2 minutes ago 204MBnginx latest d1a364dc548d 4 weeks ago 133MBcentos 7 8652b9f0cb4c 7 months ago 204MB已经生成了名为test的镜像。root@ecs-385f:~# docker run -d test6d126ba03081675e0be60aeb1d0819229cbcd36f1029925ee580a23daf9cf039root@ecs-385f:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES6d126ba03081 test "sleep 360000" 7 seconds ago Up 6 seconds 80/tcp friendly_shaw9163cb94ed42 nginx "/docker-entrypoint.…" 24 hours ago Up 24 hours 80/tcp stupefied_jenningsroot@ecs-385f:~# docker exec -it 6d126ba03081 bash [root@6d126ba03081 /]# echo $ABC123[root@6d126ba03081 /]#
-
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。Dockerfile指令:FROM:构建新镜像是基于哪个镜像LABEL:标签RUN:构建镜像时运行的Shell命令copy:拷贝文件或目录到镜像中ADD:解压压缩包并拷贝ENV:设置环境变量USER:为RUN、CMD和ENTRYPOINT执行命令指定运行用户EXPOSE:声明容器运行的服务端口WORKDIR:为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录CMD:运行容器时默认执行,如果有多个CMD指令,最后一个生效ENTRYPOINT:如果与CMD一起用,CMD将作为ENTRYPOINT的默认参数,如果有多个ENTRYPOINT指令,最后一个生效镜像分类:1、基础镜像,例如centos、ubuntu、alpine2、环境镜像,例如java、php、go3、项目镜像,将项目项目与环境镜像打包一起的镜像
-
另一种挂接容器到宿主机卷的方式:bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中.首先清空所有容器root@ecs-385f:~# docker rm -f $(docker ps -aq)33d6458086be502e44434e1e8b08a7730f5d02fb52595488467de1cc12a40cd03030a99f直接挂接到宿主机的目录卷:root@ecs-385f:~# docker run -d -v $PWD/wwwroot:/usr/share/nginx/html nginx9163cb94ed4257f003dd589eb88266f71dd011f64b2040a4690760e9084ecdbdroot@ecs-385f:~# lswwwrootroot@ecs-385f:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES9163cb94ed42 nginx "/docker-entrypoint.…" 17 seconds ago Up 15 seconds 80/tcp stupefied_jenningsroot@ecs-385f:~# docker inspect 9163cb94ed42 "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:11:00:02", "DriverOpts": null } } } }]root@ecs-385f:~# curl 172.17.0.2<html><head><title>403 Forbidden</title></head><body><center><h1>403 Forbidden</h1></center><hr><center>nginx/1.21.0</center></body></html>报错403是因为,目录里面没有默认的文件:root@ecs-385f:~# lsroot@ecs-385f:~# cd wwwrootroot@ecs-385f:~/wwwroot# lsroot@ecs-385f:~# echo 1234 > wwwroot/index.htmlroot@ecs-385f:~# curl 172.17.0.2 1234root@ecs-385f:~# bind mounts的方式1.如果源文件/目录没有存在,则生成;如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏。2.不会自动生成文件,会抛出一个错误。
-
容器保存数据的三种方式:volumes: Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes) .保存数据的最佳方式。bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中.tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统,如果不希望将数据持久存储在任何位置,可以使用tmpfs,同时避免写入容器可写层提高性能。前两种方式较为常用,内存保存数据的方式不常见。管理卷:# docker volume create nginx-vol# docker volume ls# docker volume inspect nginx-volroot@ecs-385f:~# docker volume --helpUsage: docker volume COMMANDManage volumesCommands: create Create a volume inspect Display detailed information on one or more volumes ls List volumes prune Remove all unused local volumes rm Remove one or more volumesroot@ecs-385f:~# docker volume lsDRIVER VOLUME NAMEroot@ecs-385f:~# docker volume create nginx-volnginx-volroot@ecs-385f:~# docker volume lsDRIVER VOLUME NAMElocal nginx-volroot@ecs-385f:~# docker volume inspect nginx-vol[ { "CreatedAt": "2021-06-22T15:43:38+08:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data", "Name": "nginx-vol", "Options": {}, "Scope": "local" }]root@ecs-385f:~# docker run -d -v nginx-vol:/usr/share/nginx/html nginx //拉起一个容器,挂接到卷上。7932e8ba54ba11eefc0919658c478afee166c8a36110232788618dd80b4361d8root@ecs-385f:~# root@ecs-385f:~# docker inspect 7932e8ba54ba[ { "Id": "7932e8ba54ba11eefc0919658c478afee166c8a36110232788618dd80b4361d8", "Created": "2021-06-22T07:51:04.996265666Z", "Path": "/docker-entrypoint.sh", "Args": [ "nginx", "-g", "daemon off;" ], "State": { 。。。 。。。 "Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.8", 。。。 。。。root@ecs-385f:~# curl 172.17.0.8<!DOCTYPE html><html><head><title>Welcome to nginx!</title><style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; }</style></head><body><h1>Welcome to nginx!</h1><p>If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.</p><p>For online documentation and support please refer to<a href="http://nginx.org/">nginx.org</a>.<br/>Commercial support is available at<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p></body></html>root@ecs-385f:~# echo hello >/var/lib/docker/volumes/nginx-vol/_data/index.htmlroot@ecs-385f:~# curl 172.17.0.8 hello删除容器后,卷依然保存在宿主机上。root@ecs-385f:~# docker rm -f 7932e8ba54ba7932e8ba54baroot@ecs-385f:~# ls /var/lib/docker/volumes/nginx-vol/_data/50x.html/var/lib/docker/volumes/nginx-vol/_data/50x.htmlroot@ecs-385f:~# ls /var/lib/docker/volumes/nginx-vol/_data/50x.html index.htmlroot@ecs-385f:~# cat /var/lib/docker/volumes/nginx-vol/_data/index.htmlhello用卷创建一个容器:# docker run -d --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/htmI nginx# docker run -d --name=nginx-test -v nginx-vol:/usr/share/nginx/htmInginx清理:# docker stop nginx-test# docker rm nginx-test# docker volume rm nginx-vol如果没有预先指定卷,创建容器的时候指定,会自动创建。
-
docker镜像是只读的,类似共享形式让多个容器使用,如果要在容器里修改文件,即镜像里的文件,那该怎么办呢?答:引入写时复制(copy-on-write) ,需要修改文件操作时,会先从镜像里把要写的文件复制到自己的文件系统中进行修改。root@ecs-385f:~# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES33d6458086be nginx "/docker-entrypoint.…" 33 minutes ago Up 33 minutes 80/tcp competent_albattani502e44434e1e nginx "/docker-entrypoint.…" 33 minutes ago Up 33 minutes 80/tcp dreamy_bhaskara8b08a7730f5d nginx "/docker-entrypoint.…" 34 minutes ago Up 34 minutes 80/tcp trusting_mendeleev02fb52595488 nginx "/docker-entrypoint.…" 34 minutes ago Up 34 minutes 80/tcp silly_turing467de1cc12a4 nginx "/docker-entrypoint.…" 34 minutes ago Up 34 minutes 80/tcp eloquent_elion0cd03030a99f nginx "/docker-entrypoint.…" 34 minutes ago Up 34 minutes 80/tcp nostalgic_heisenbergroot@ecs-385f:~# docker inspect 33d6458086be[ { "Id": "33d6458086be3c003bf8c2a530749b98752b20a3de8b09ca5faf1281a0854527", "Created": "2021-06-21T07:37:24.785048647Z", "Path": "/docker-entrypoint.sh", "Args": [ "nginx", "-g", "daemon off;" ], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 3111, "ExitCode": 0, "Error": "", "StartedAt": "2021-06-21T07:37:25.244262408Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:d1a364dc548d5357f0da3268c888e1971bbdb957ee3f028fe7194f1d61c6fdee", "ResolvConfPath": "/var/lib/docker/containers/33d6458086be3c003bf8c2a530749b98752b20a3de8b09ca5faf1281a0854527/resolv.conf", "HostnamePath": "/var/lib/docker/containers/33d6458086be3c003bf8c2a530749b98752b20a3de8b09ca5faf1281a0854527/hostname", "HostsPath": "/var/lib/docker/containers/33d6458086be3c003bf8c2a530749b98752b20a3de8b09ca5faf1281a0854527/hosts", "LogPath": "/var/lib/docker/containers/33d6458086be3c003bf8c2a530749b98752b20a3de8b09ca5faf1281a0854527/33d6458086be3c003bf8c2a530749b98752b20a3de8b09ca5faf1281a0854527-json.log", "Name": "/competent_albattani", "RestartCount": 0, "Driver": "overlay2", "Platform": "linux", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "docker-default", "ExecIDs": null, "HostConfig": { "Binds": null, "ContainerIDFile": "", "LogConfig": { "Type": "json-file", "Config": {} }, "NetworkMode": "default", "PortBindings": {}, "RestartPolicy": { "Name": "no", "MaximumRetryCount": 0 }, "AutoRemove": false, "VolumeDriver": "", "VolumesFrom": null, "CapAdd": null, "CapDrop": null, "Dns": [], "DnsOptions": [], "DnsSearch": [], "ExtraHosts": null, "GroupAdd": null, "IpcMode": "shareable", "Cgroup": "", "Links": null, "OomScoreAdj": 0, "PidMode": "", "Privileged": false, "PublishAllPorts": false, "ReadonlyRootfs": false, "SecurityOpt": null, "UTSMode": "", "UsernsMode": "", "ShmSize": 67108864, "Runtime": "runc", "ConsoleSize": [ 0, 0 ], "Isolation": "", "CpuShares": 0, "Memory": 0, "NanoCpus": 0, "CgroupParent": "", "BlkioWeight": 0, "BlkioWeightDevice": [], "BlkioDeviceReadBps": null, "BlkioDeviceWriteBps": null, "BlkioDeviceReadIOps": null, "BlkioDeviceWriteIOps": null, "CpuPeriod": 0, "CpuQuota": 0, "CpuRealtimePeriod": 0, "CpuRealtimeRuntime": 0, "CpusetCpus": "", "CpusetMems": "", "Devices": [], "DeviceCgroupRules": null, "DiskQuota": 0, "KernelMemory": 0, "MemoryReservation": 0, "MemorySwap": 0, "MemorySwappiness": null, "OomKillDisable": false, "PidsLimit": 0, "Ulimits": null, "CpuCount": 0, "CpuPercent": 0, "IOMaximumIOps": 0, "IOMaximumBandwidth": 0, "MaskedPaths": [ "/proc/acpi", "/proc/kcore", "/proc/keys", "/proc/latency_stats", "/proc/timer_list", "/proc/timer_stats", "/proc/sched_debug", "/proc/scsi", "/sys/firmware" ], "ReadonlyPaths": [ "/proc/asound", "/proc/bus", "/proc/fs", "/proc/irq", "/proc/sys", "/proc/sysrq-trigger" ] }, "GraphDriver": { "Data": { "LowerDir": "/var/lib/docker/overlay2/f90648b1fa3f9d0349ba3dc359d7a8fa21e431ba47032375a90b0aeb2dd7a540-init/diff:/var/lib/docker/overlay2/6a9b4dca2a4e94c7545bba7cc6b18576806b01a62075c8e89a53b4c266218ad8/diff:/var/lib/docker/overlay2/470d4ab71cb0e44513b63e7c62c67ed5361df359db590569fb1a67bb9450a316/diff:/var/lib/docker/overlay2/24fb23032d9b45d78c8ce8c194c493ec55d765d5a70046f5f6fd6b6cd6e2142a/diff:/var/lib/docker/overlay2/22cd5de58f6a125afa15e5fb9eb17081cad4a7dc22703903fcfced139f1a96b1/diff:/var/lib/docker/overlay2/cf34d04ecc4192bde2226b3d4d5413c5c8a8bae87e7c926cddcdcd3ec775aacf/diff:/var/lib/docker/overlay2/56ca3749c2a0655a851d4ab7c0ccb2dc6f7ee00ec9d4b71df3d64c5c47b6006f/diff", "MergedDir": "/var/lib/docker/overlay2/f90648b1fa3f9d0349ba3dc359d7a8fa21e431ba47032375a90b0aeb2dd7a540/merged", "UpperDir": "/var/lib/docker/overlay2/f90648b1fa3f9d0349ba3dc359d7a8fa21e431ba47032375a90b0aeb2dd7a540/diff", "WorkDir": "/var/lib/docker/overlay2/f90648b1fa3f9d0349ba3dc359d7a8fa21e431ba47032375a90b0aeb2dd7a540/work" }, "Name": "overlay2" }, "Mounts": [], "Config": { "Hostname": "33d6458086be", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "ExposedPorts": { "80/tcp": {} }, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "NGINX_VERSION=1.21.0", "NJS_VERSION=0.5.3", "PKG_RELEASE=1~buster" ], "Cmd": [ "nginx", "-g", "daemon off;" ], "Image": "nginx", "Volumes": null, "WorkingDir": "", "Entrypoint": [ "/docker-entrypoint.sh" ], "OnBuild": null, "Labels": { "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>" }, "StopSignal": "SIGQUIT" }, "NetworkSettings": { "Bridge": "", "SandboxID": "067073a5ac808907bf6c2896b2c9c50e3d778afc804ae608509cfd326e48bc71", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": { "80/tcp": null }, "SandboxKey": "/var/run/docker/netns/067073a5ac80", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "3247a30ac8e65496927dcf28f152485864ac2493cb92a0eeb897b6868ae8ae83", "Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.7", "IPPrefixLen": 16, "IPv6Gateway": "", "MacAddress": "02:42:ac:11:00:07", "Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "5b4b7564f6971f04e2c0bcb3f04bc94b99fcdfec3390573fe3a806f901ef8ffa", "EndpointID": "3247a30ac8e65496927dcf28f152485864ac2493cb92a0eeb897b6868ae8ae83", "Gateway": "172.17.0.1", "IPAddress": "172.17.0.7", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:11:00:07", "DriverOpts": null } } } }]root@ecs-385f:~# 最上面是基础镜像层,拼接的容器层,通过这种方式存储不同层的内容;Mergeddir:统一视图层;UpperDir:容器层。root@ecs-385f:~# ls /var/lib/docker/overlay2/f90648b1fa3f9d0349ba3dc359d7a8fa21e431ba47032375a90b0aeb2dd7a540-init/diffdev etcroot@ecs-385f:~#挂载到宿主机的文件上。root@ecs-385f:~# ls /var/lib/docker/overlay2/f90648b1fa3f9d0349ba3dc359d7a8fa21e431ba47032375a90b0aeb2dd7a540-init/diff/etchostname hosts mtab resolv.confroot@ecs-385f:~# 容器新建会挂载宿主机的三个文件:hostshostnameresolv.conf容器保存数据的三种方式:volumes: Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes) .保存数据的最佳方式。bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中.tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统,如果不希望将数据持久存储在任何位置,可以使用tmpfs,同时避免写入容器可写层提高性能。
-
Docker镜像是什么?一个分层存储的文件,不是一个单一的文件一个软件的环境一个镜像可以创建N个容器一种标准化的交付一个不包含Linux内核而又精简的Linux操作系统镜像怎么高效存储?难道像虚拟机那样一个容器对应一个独立的镜像文件?这样对于密集型容器,磁盘占用率太大!答:引入联合文件系统,将镜像多层文件联合挂载到容器文件系统root@ecs-385f:~# df -hFilesystem Size Used Avail Use% Mounted onudev 966M 0 966M 0% /devtmpfs 200M 8.3M 191M 5% /run/dev/vda1 93G 6.9G 82G 8% /root@ecs-385f:~# docker run -d nginx0cd03030a99fea5e3a8827279b851274a4a9986a9f3038a9a9a870ed31590a33root@ecs-385f:~# docker run -d nginx467de1cc12a4cbed8ce8633d48f7afe9368ce1be4c32b355a9e7e640d6e6f8c4root@ecs-385f:~# docker run -d nginx02fb525954885230e015be11d2e6a0d116f636258eaaf2f0c48548560a068d8croot@ecs-385f:~# docker run -d nginx8b08a7730f5d61a4a15db80dc63132bf9d6081b4aed5655225a1d473b5ead8d4root@ecs-385f:~# docker run -d nginx502e44434e1e4ecf596f9d386dcb7437e9b91178aea1281aa027f42d31b3d7a3root@ecs-385f:~# docker run -d nginx33d6458086be3c003bf8c2a530749b98752b20a3de8b09ca5faf1281a0854527root@ecs-385f:~# df -hFilesystem Size Used Avail Use% Mounted onudev 966M 0 966M 0% /devtmpfs 200M 8.7M 191M 5% /run/dev/vda1 93G 6.9G 82G 8% /可以看出,虽然拉起了6个nginx容器,主机的存储空间使用并没有太多消耗。当启动一个容器时,docker只会加载只读镜像,并在其上添加一个读写层即容器层。
-
nginx容器日志重定向到标准输出,docker系统将其存放在以容器ID为文件夹的目录当中。root@ecs-beijing1:~# kubectl get pod NAME READY STATUS RESTARTS AGEnginx-7bb7cd8db5-vkdcp 1/1 Running 0 5m33stomcat 1/1 Running 1 24htomcat-7d6ff78b47-5sjm9 1/1 Running 1 23h用另一个终端访问nginx容器的地址,留下一条访问记录。root@ecs-beijing1:~# kubectl logs nginx-7bb7cd8db5-vkdcp/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.sh10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf10-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 up2021/06/16 08:00:36 [notice] 1#1: using the "epoll" event method2021/06/16 08:00:36 [notice] 1#1: nginx/1.21.02021/06/16 08:00:36 [notice] 1#1: built by gcc 8.3.0 (Debian 8.3.0-6) 2021/06/16 08:00:36 [notice] 1#1: OS: Linux 4.15.0-136-generic2021/06/16 08:00:36 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:10485762021/06/16 08:00:36 [notice] 1#1: start worker processes2021/06/16 08:00:36 [notice] 1#1: start worker process 3010.244.0.1 - - [16/Jun/2021:08:02:34 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.58.0" "-"进到docker的容器目录/var/lib/docker/containers:root@ecs-beijing1:/var/lib/docker/containers# ls04bb7d941d1e00de7cb68951d376a838fdea1ac5f93d1e659407fb7d72f610f70b766e52904740accb30810b13244348762cc7cc05f5b1f856fd9966414b0bb00cfe5d582631e80cc08e55ffe2d25cd2223192125cda7d6b92f629348b9c00fa0da55aa51f23ae27947d6f28a3ac4388cc171a6eb4301ea4769e60cdeea30516175a887880236a9b060ad66ca9df864be909ab250853bd141b2d7cf9016a8a341c0aabd6362eab0547e1984e3a347efce33f72604d7a463d9e0bdf327beaf3d022db040a666c18428d14f6dfbf727356c43796984ba8e0539363804084d6ab6a23470c6d79327e24b103967f3e90453981f1abbf51b8b5e95ee726057d1498e82d44f1d791f999a76357f84cbe83bc56016f16c62ebbe7f7c9cddd2dd9298cef2d771384149ea4d3e5632933a5e0f822e0df512d0203358d1a5f97d2844b87582d802643f1a65a3095e99f91f23f48acfdf1b1f5dc3ceb06645e3c458812eb3537e66b4eb982488407531c6cce087e4bd90b7786ed692ea20b117664d96f46693bcc5ee982e09017dcaf5e183ca0cbd866a9a59460adfe63bc6c14b13ed73edd3ee88b51bf204b99ccc7aca8f30be4d49341e5aad87191294221ab36ee056c3b4a335a627484ef37859883b8f0972ee8515d7808903be9d18c741c03dec4aa444c11887f5888e34e36b8c34c2f22b92eb92f7ae3dc41ee1747c2d4a76716759d4e36acca4378d93433c1cd01e32e1be22a6739744fb48d25212ffe15b60b2f385064d53e28a213ae6d094813bf94d77d0bb0a790a66769265f72ec6d395a69a75811f843fa50bb9e5599af6afc02147f0718e1d3d03e0f0189214ce57dda19525cfbe7d34a52bddf18d89fe8ed5495bd2d924874c57e67ba834af1b8b043b3795f2c846eb9400203d1f99baf10375ad5bb5efdad8fe9057a92b0bdaf9c779f1770e16ad2226d4e998e539494fe704542b65b0bd1704e4fa33a433d38e49959887a9f3db23e85de2bd78554362016de204352c64c41f5f9155e0ff93b9f66418080308a87092da0326980c84ebb22ede9969a49475d8d46a1c325ae80482ee0ff8866e34a0cdc43f77c442b288e747d60fe8fd51ad0d34148665d7b883a7bec829234a498790e1901f476a4b6f7dd44fcf3b785c9b53c52d32ebff8ae9632d7b498db33c49009079d81b4d19db503a823e0259f8a1634274366e7db850c9572c39ee842de70af2159125af4ba127c511b2ddef07ec303ef476ba06805514ddf78a942caff8fa90702eec0574b370e8f18ebd8fd24a4c93be8f10c37d5fd94410eab3650d7e3e8cd6c17698a996e28267a225101dfe7f993b13cf5004f37db50dfb9f6ff920af61cbd8ec5ab5d3ddc58b2fc9f0d4152f3f1b8a6bbf2a21525afe5c14b0cea020a3b5b3a98c9c44a061b4f8e930d8ed7ec59029c3d7ddc4db2679cc25303c4212f7cbc225f6344c602b209e321bc3f7c3e9261c8ddc254e5cff940c2b3a1d039f751e87503889b0ad2bfd7a207b31eeb8c3cccf56ccd9be448decac9dba9ba7a440e492dfa47997b8fb5e47e58b8892d3ac13518657c89f9290ab8cd80a358654f7952dacf378a42ac7b4da84e4baa260fccbb21b8a18828e6d87cd833c1fcada765e6265996d0abeec326d4ee8016dd0095b3623d46a0d668e020ed37c7f5dae2323e2691269dcf528b7aba5c5296f671e867de61acb5953d7a9d查一下nginx容器的ID:root@ecs-beijing1:/var/lib/docker/containers# docker ps |grep nginxcd80a358654f nginx "/docker-entrypoint.…" 7 minutes ago Up 7 minutes k8s_nginx_nginx-7bb7cd8db5-vkdcp_default_e6f80782-a086-4598-8186-5b80e46ea3ec_0c14b0cea020a k8s.gcr.io/pause:3.1 "/pause" 8 minutes ago Up 7 minutes k8s_POD_nginx-7bb7cd8db5-vkdcp_default_e6f80782-a086-4598-8186-5b80e46ea3ec_0从上面的文件夹中,找到开头是cd80a358654的文件夹,进入:root@ecs-beijing1:/var/lib/docker/containers# cd cd80a358654f7952dacf378a42ac7b4da84e4baa260fccbb21b8a18828e6d87croot@ecs-beijing1:/var/lib/docker/containers/cd80a358654f7952dacf378a42ac7b4da84e4baa260fccbb21b8a18828e6d87c# lscd80a358654f7952dacf378a42ac7b4da84e4baa260fccbb21b8a18828e6d87c-json.log config.v2.json mountscheckpoints hostconfig.jsonroot@ecs-beijing1:/var/lib/docker/containers/cd80a358654f7952dacf378a42ac7b4da84e4baa260fccbb21b8a18828e6d87c# cat cd80a358654f7952dacf378a42ac7b4da84e4baa260fccbb21b8a18828e6d87c-json.log{"log":"/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration\n","stream":"stdout","time":"2021-06-16T08:00:35.289417174Z"}{"log":"/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/\n","stream":"stdout","time":"2021-06-16T08:00:35.291501936Z"}{"log":"/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh\n","stream":"stdout","time":"2021-06-16T08:00:35.329380959Z"}{"log":"10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf\n","stream":"stdout","time":"2021-06-16T08:00:35.395966852Z"}{"log":"10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf\n","stream":"stdout","time":"2021-06-16T08:00:35.502724689Z"}{"log":"/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh\n","stream":"stdout","time":"2021-06-16T08:00:35.503120257Z"}{"log":"/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh\n","stream":"stdout","time":"2021-06-16T08:00:35.516580302Z"}{"log":"/docker-entrypoint.sh: Configuration complete; ready for start up\n","stream":"stdout","time":"2021-06-16T08:00:35.524535725Z"}{"log":"2021/06/16 08:00:36 [notice] 1#1: using the \"epoll\" event method\n","stream":"stderr","time":"2021-06-16T08:00:36.37928227Z"}{"log":"2021/06/16 08:00:36 [notice] 1#1: nginx/1.21.0\n","stream":"stderr","time":"2021-06-16T08:00:36.381130657Z"}{"log":"2021/06/16 08:00:36 [notice] 1#1: built by gcc 8.3.0 (Debian 8.3.0-6) \n","stream":"stderr","time":"2021-06-16T08:00:36.381143142Z"}{"log":"2021/06/16 08:00:36 [notice] 1#1: OS: Linux 4.15.0-136-generic\n","stream":"stderr","time":"2021-06-16T08:00:36.381146593Z"}{"log":"2021/06/16 08:00:36 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576\n","stream":"stderr","time":"2021-06-16T08:00:36.381149204Z"}{"log":"2021/06/16 08:00:36 [notice] 1#1: start worker processes\n","stream":"stderr","time":"2021-06-16T08:00:36.381151831Z"}{"log":"2021/06/16 08:00:36 [notice] 1#1: start worker process 30\n","stream":"stderr","time":"2021-06-16T08:00:36.38422957Z"}{"log":"10.244.0.1 - - [16/Jun/2021:08:02:34 +0000] \"GET / HTTP/1.1\" 200 612 \"-\" \"curl/7.58.0\" \"-\"\n","stream":"stdout","time":"2021-06-16T08:02:34.785064011Z"}root@ecs-beijing1:/var/lib/docker/containers/cd80a358654f7952dacf378a42ac7b4da84e4baa260fccbb21b8a18828e6d87c# 可以看到与kubectl logs 查看的日志是一样的。
-
您好,华为工程师,有几个问题要请教你们。1. 目前设备用Esdk 配置IP和路由功能, 有个应用场景,我们需要给现场人员进行对设备GE0-GE4进行配置, 例如可以将GE0配置为DHCP服务, GE1配置为DHCP 客户端, 但目前没能明白esdk 提供的mqtt 接口如何能实现这些功能。2. docker 中的容器中 eth0 的mac地址规则是怎样的? 是根据主机进行分配的吗? 每个设备的容器eth0 mac地址应该是不一样的是吧?3. 应用U盘开局方式安装容器,开始的时候由于脚本校验有一些错误,解压包没有问题,但更新过程中失败,然而更新包的文件仍存在设备中,重启设备也无法删除,没有权限进行删除。4. GE0-GE3有什么区别?
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签