• [技术干货] Docker中容器(Container)和镜像(Image)的区别
    在学习使用docker过程中会遇到镜像和容器,两者之间的区别是什么?一.什么是image镜像可以看成是由多个镜像层叠加起来的一个文件系统(通过UnionFS与AUFS文件联合系统实现),镜像层也可以简单理解为一个基本的镜像,而每个镜像层之间通过指针的形式进行叠加。镜像是一堆只读层的统一视角,除了最底层没有指向外,每一层都指向它的父层。统一文件系统( Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在。在用户的角度看来,只存在一个文件系统。镜像每一层都是不可写的,都是只读层。二.什么是容器?容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。要点:容器 = 镜像 + 读写层,并且容器的定义并没有提及是否要运行容器。总结:Image与Container之间的区别和联系?      镜像由一层层只读层堆在一起,容器为镜像只读层+读写层,运行态容器为由一个可读写的文件系统「静态容器」+ 隔离的进程空间和其中的进程构成。      镜像的概念更多偏向于一个环境包,这个环境包可以移动到任意的Docker平台中去运行;而容器就是你运行环境包的实例。你可以针对这个环境包运行N个实例。换句话说container是images的一种具体表现形式。你也可以认为镜像与你装载操作系统iso镜像是一个概念,容器则可理解为镜像启动的操作系统。一个镜像可以启动任意多个容器,即可以装载多个操作系统。
  • [技术干货] docker方式部署gitlab
    首先拉镜像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
  • [已解决问题归档] aicc的服务的部署是否可以支持docker容器化部署
    【问题来源】    星网    【问题简要】    所有服务的部署是否可以支持docker容器化部署【问题类别】    服务安装    【AICC解决方案版本】    AICC 8.13.0       【期望解决时间】  今日内【问题现象描述】           用户想知道所有服务的部署是否可以支持docker容器化部署
  • [技术干货] docker-compose常用命令
    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完成,这样就可以少记一点了。
  • [技术干货] dockerfile CMD和ENTRYPOINT的区别
    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实例2
    修改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:~# 
  • [技术干货] Dockerfile实例
    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 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。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、项目镜像,将项目项目与环境镜像打包一起的镜像
  • [技术干货] docker中的数据卷2
    另一种挂接容器到宿主机卷的方式: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.不会自动生成文件,会抛出一个错误。
  • [技术干货] docker中的数据卷1
    容器保存数据的三种方式: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镜像存储核心技术:写时复制(COW)
    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镜像存储核心技术:联合文件存储系统(UnionFS)
    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只会加载只读镜像,并在其上添加一个读写层即容器层。
  • [技术干货] 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 查看的日志是一样的。
  • [技术干货] 交付流程之制作Docker镜像(一)
    准备工作:熟悉项目: 1、项目代码构成:熟悉开发语言,部署环境,软硬件限制;原代码数据结构,功能组成,流程图等。 2、依赖的服务:部署软件所依赖的库文件和环境配置 3、提交服务的端口:查询端口是否可用 4、配置文件:清楚配置文件的存放路径,文件内容 5、程序在工作中涉及持久的文件:文件存放的路径,冗余方式,备份方式等。
  • [设备专区] 【AR502H产品】ESDK docker 等疑问
    您好,华为工程师,有几个问题要请教你们。1. 目前设备用Esdk 配置IP和路由功能, 有个应用场景,我们需要给现场人员进行对设备GE0-GE4进行配置,  例如可以将GE0配置为DHCP服务, GE1配置为DHCP 客户端, 但目前没能明白esdk 提供的mqtt 接口如何能实现这些功能。2. docker 中的容器中 eth0 的mac地址规则是怎样的? 是根据主机进行分配的吗? 每个设备的容器eth0 mac地址应该是不一样的是吧?3. 应用U盘开局方式安装容器,开始的时候由于脚本校验有一些错误,解压包没有问题,但更新过程中失败,然而更新包的文件仍存在设备中,重启设备也无法删除,没有权限进行删除。4. GE0-GE3有什么区别?
总条数:476 到第
上滑加载中