V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
DearTanker
V2EX  ›  Docker

如何确定 Docker 下载的镜像对应的目录

  •  
  •   DearTanker ·
    DearTanker · 2018-12-18 14:17:21 +08:00 · 10327 次点击
    这是一个创建于 2165 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在黑群晖里面折腾 Docker 遇到一个比较棘手的问题,Google 了几个月没找到方法。

    下载了几个 image 镜像:

    root@HP-Gen8-DSM:~# docker images
    3REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
    atlassian/confluence-server   6.13.0              7b1705b3ff8f        2 weeks ago         981MB
    dpage/pgadmin4                3.6                 885166b71c10        3 weeks ago         262MB
    postgres                      9.6.9               106bdfb062df        4 months ago        235MB
    
    

    但是不知道对应镜像目录是哪个:

    root@HP-Gen8-DSM:/volume1/@docker/btrfs/subvolumes# ll
    total 0
    drwx------ 1 root root 6430 Dec 17 20:17 .
    drwx------ 1 root root   20 Dec 17 14:27 ..
    drwxr-xr-x 1 root root  184 Dec 17 18:18 0177d981c89a9749c2723da2b23c798b49a8aa957f57ede4ab0d262c086d0cd6
    drwxr-xr-x 1 root root  170 Dec 17 19:24 0819c021ac86443a7c23530ca8a3c9506a62dad6a81c5d2907649adc8bd0f6f3
    drwxr-xr-x 1 root root  170 Dec 17 19:24 0819c021ac86443a7c23530ca8a3c9506a62dad6a81c5d2907649adc8bd0f6f3-init
    drwxr-xr-x 1 root root  124 Dec 17 18:19 08329ceddaa61aabcf84cfbe892b5f13fab4cfcfbc9c8b77355ba05c050d8ddd
    drwxr-xr-x 1 root root  108 Dec 17 18:19 0a10c5bb87be69ffb744fc3dbd4a876bb886d14100119bc3fa0422b96a9a0974
    drwxr-xr-x 1 root root  132 Dec 17 18:18 0aa85aa90f65339fa122a63aae7c28d9dbe62829474b4188110500c855ff1d3f
    drwxr-xr-x 1 root root  184 Dec 17 18:18 1cc56e0e088fc8a0a40f4006bc622e1c2edcde6fe09a33bfd9d896a766ac1da9
    drwxr-xr-x 1 root root  108 Dec 17 18:19 2328a6636b1a0b955999fea881f29ed5546b0c22d82198da8f6f32702fcbd1e5
    drwxr-xr-x 1 root root  108 Dec 17 18:19 2557e744b7f04ca112373459f9f2d1b0d0a60bce009948ee52533ab96f1e6b4e
    drwxr-xr-x 1 root root  124 Dec 17 18:19 3191de7e4bae4ca1c7ba399b7c7ce1841afce9df0eaadb1bd11246a150a3bc0b
    drwxr-xr-x 1 root root  132 Dec 17 18:15 3275e20a52b655413cde6868cce47c5b2efd82ae6115e38a42c03de7e9c26b8d
    drwxr-xr-x 1 root root  132 Dec 17 18:15 33ed864d32cc848ceee12bcb072b27de12d2f6d3e830c6e447cb12f02376dfae
    drwxr-xr-x 1 root root  124 Dec 17 18:19 396b7b1f3c551e8870b8bd0627c44187106c9755fc7a8637aa23d6b9694ff55b
    drwxr-xr-x 1 root root  132 Dec 17 18:15 536f5f50d92f6729d0f9909b69e6080844ac57f7b29b35386e18ef631442534a
    drwxr-xr-x 1 root root  108 Dec 17 18:19 53c71f045525ca35f849f5f1f43bee9dffc0d048fc8612b13571dd762b84b1c4
    drwxr-xr-x 1 root root  184 Dec 17 18:18 5f279b09c8a3a836cf920d1b542001173841b9dd731b6285f61d823b7fc22c95
    drwxr-xr-x 1 root root  108 Dec 17 18:19 632e988754fec38d40a864fbf961988e6cd2a70bded7d8db9a270d4dddaf827e
    drwxr-xr-x 1 root root  132 Dec 17 18:15 6c9715a622c2984785a8af71b8c7d9a2dc14094d4b7027423a1247e9d0820256
    drwxr-xr-x 1 root root  108 Dec 17 18:19 6f599819bc0890c39a8a93e890b5c1a82504feabd2bfa17ee3affd8ea98a21ab
    drwxr-xr-x 1 root root  184 Dec 17 18:18 767d6c74de2be179f730ff040c7974a83554469cf43bb1ca38cd0b59ee0e456d
    drwxr-xr-x 1 root root  158 Dec 17 18:16 7bf9e07cf56314b6040fed57320f6b258f0a4b4e77b4be3d23ace0f7ef3988d4
    drwxr-xr-x 1 root root  124 Dec 17 18:19 80e5e45b4318224cf527e1b9937e4485c58ac0ff2bd9dbf84e97cb561809b12a
    drwxr-xr-x 1 root root  132 Dec 17 18:18 82511c81640e1129dca589432173d1b9a13d2f31aad6419622aaba0db6f7273c
    drwxr-xr-x 1 root root  158 Dec 17 18:15 8573f1b901ac4984a430398275876b667c271e82572c8f6f41f3a31ce012cedf
    drwxr-xr-x 1 root root  132 Dec 17 18:18 8da80ee80af713be3007515384073776acad7dd3580627ee61aed96989dacfd4
    drwxr-xr-x 1 root root  132 Dec 17 18:18 a7c9bb64e258f62ced431a2c648df40c475f4cd839189a19f21fb61b0d21b3e6
    drwxr-xr-x 1 root root  132 Dec 17 18:15 aaa7ef3c77e09c89776ccbf61019660fbbdd01183489b24b89b95503e06dc1f5
    drwxr-xr-x 1 root root  108 Dec 17 18:19 ad5a0ee34c849bde85ea518ea9c487e6a2d1fcd3694c77ea5afdadb593650616
    drwxr-xr-x 1 root root  124 Dec 17 18:19 afa47768b6f54d4fac2214a86f928609f8cf8fac1ee904a17c80daa54047d98f
    drwxr-xr-x 1 root root  132 Dec 17 18:15 b00f1c4c4d5143b7a57043d3a1e3ae76b374bedb564e3c2bf761360f83abe961
    drwxr-xr-x 1 root root  184 Dec 17 18:18 b0d329b4f38a524f4816a51ccd4214f484c829984acd6df96a52aced60c825b1
    drwxr-xr-x 1 root root  124 Dec 17 18:19 b3a5eed179c10ca31e7b9cd450fd2bdcc19b250f10eaadf6b8f3d4e86e72e64a
    drwxr-xr-x 1 root root  184 Dec 17 18:18 be0c6e6bc457624601898ba4a9ca7526c3a09727471370c6d7d1767b84c6fa14
    drwxr-xr-x 1 root root  184 Dec 17 18:18 c3a8a4ed911ac251f316c62c43aea2439601dfc405cbf8ce5e9384a0d2980506
    drwxr-xr-x 1 root root  224 Dec 17 18:18 ceb87bb0139f94cdfde3b368875fab2e8321f6d61fca468f7c50022ed6d32e57
    drwxr-xr-x 1 root root  124 Dec 17 18:19 d074f013df36ebcebf09244d52ee6efde76880aea7f8ad3d6a8f7de4a515a94f
    drwxr-xr-x 1 root root  244 Dec 17 19:23 d6faeada9ab6282809df310f152c3e9589a1ddb0166cbde07c5446c27e5945f4
    drwxr-xr-x 1 root root  244 Dec 17 19:23 d6faeada9ab6282809df310f152c3e9589a1ddb0166cbde07c5446c27e5945f4-init
    drwxr-xr-x 1 root root  124 Dec 17 18:19 d8b3b09628c9055d36277662fd1ea98170310d180304f4a02f2ae0b486623b0e
    drwxr-xr-x 1 root root  124 Dec 17 18:19 d9dcb1b9c48fc9a70f371ba508dc76d4d0e664fd3cf53ebc26d981db8e044697
    drwxr-xr-x 1 root root  132 Dec 17 18:15 da97952a5e2a77adf0fb34540a6509b5fbe7f98b02e060b40342fb7dd6ecb15e
    drwxr-xr-x 1 root root  132 Dec 17 18:18 e6be116618a839f751c9a91275b37f68ee94175ec71ed76d9892332fd898fc3d
    drwxr-xr-x 1 root root  132 Dec 17 18:15 e84657e39df5b998ba5389813c583d7ea617e34cb06364b15fcd306421c44292
    drwxr-xr-x 1 root root  158 Dec 17 18:15 ea658bb2aa6f75cf7c484ad8e384a1da9cb04f4c2e6c9dbbef672bd52417c62e
    drwxr-xr-x 1 root root  132 Dec 17 18:15 f3797551e573ed255bf373f9cf9d283adf431d807f5c87303a2789fe487540cf
    drwxr-xr-x 1 root root  178 Dec 17 19:21 f592ff402f4dbf6ac0f70bbb6167d089ffdc908a67f471acbfb99a592be4bbae
    drwxr-xr-x 1 root root  178 Dec 17 19:21 f592ff402f4dbf6ac0f70bbb6167d089ffdc908a67f471acbfb99a592be4bbae-init
    drwxr-xr-x 1 root root  124 Dec 17 18:19 f832bc4d54209fe5e3ff50cdbe6644ef98a8587fbbc971ef8d310c6bd111fcb2
    drwxr-xr-x 1 root root  132 Dec 17 18:18 fcc271a7ea6ba4dd3ea35a2134738b8938f23f9d7cf39d97ed3e9a64a3f1d57d
    drwxr-xr-x 1 root root  150 Dec 17 18:19 fd5c40d5c4cc7a0bd1e14cd7505e59b2014fcc63e20074e85f725ed5342104a3
    
    

    现在的办法是手动一个个去点击打开目录或者通过 df 查看目录占用大小来判断是不是想要的镜像。这也太蠢了吧。

    另外,我只知道如果运行了某个镜像的容器,会生成一个同名 - init 的新映像目录。

    希望有熟悉 Docker 的朋友可以告诉我确认镜像目录更好的办法。

    23 条回复    2018-12-27 19:54:36 +08:00
    shakespaces
        1
    shakespaces  
       2018-12-18 14:22:12 +08:00 via Android
    借楼问一下,我群晖 docker 总遇到映射文件夹在容器中没有权限的问题,有没有人遇到同样的情况及解决方法😛
    Herobs
        2
    Herobs  
       2018-12-18 14:22:39 +08:00 via Android
    inspect 有详细信息
    DearTanker
        3
    DearTanker  
    OP
       2018-12-18 14:29:31 +08:00
    @Herobs #2 通过这个查询到

    ```
    root@HP-Gen8-DSM:/volume1/@docker/btrfs/subvolumes# docker inspect 7b1705b3ff8f
    [
    {
    "Id": "sha256:7b1705b3ff8f3a810336dc31e63793a73aea5874ef7daf38ee168a85cc246642",
    "RepoTags": [
    "atlassian/confluence-server:6.13.0"
    ],
    "RepoDigests": [
    "atlassian/confluence-server@sha256:2d8381cb668b4f49c4f88ae8039d79b9864c48653e4277667a6030cb0bb7a518"
    ],
    "Parent": "",
    "Comment": "",
    "Created": "2018-12-04T03:18:14.922379922Z",
    "Container": "71dc6d675ea4e69dd3e8e24351d3677f3f1f39f947ba4ddb500fc24cf75cbd54",
    "ContainerConfig": {
    "Hostname": "",
    "Domainname": "",
    "User": "",
    "AttachStdin": false,
    "AttachStdout": false,
    "AttachStderr": false,
    "ExposedPorts": {
    "8090/tcp": {},
    "8091/tcp": {}
    },
    "Tty": false,
    "OpenStdin": false,
    "StdinOnce": false,
    "Env": [
    "PATH=/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
    "JAVA_VERSION=jdk8u192-b12",
    "JAVA_HOME=/opt/java/openjdk",
    "JAVA_TOOL_OPTIONS=-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap",
    "RUN_USER=daemon",
    "RUN_GROUP=daemon",
    "CONFLUENCE_HOME=/var/atlassian/application-data/confluence",
    "CONFLUENCE_INSTALL_DIR=/opt/atlassian/confluence"
    ],
    "Cmd": [
    "|2",
    "CONFLUENCE_VERSION=6.13.0",
    "DOWNLOAD_URL=http://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-6.13.0.tar.gz",
    "/bin/sh",
    "-c",
    "mkdir -p ${CONFLUENCE_INSTALL_DIR} && curl -L --silent ${DOWNLOAD_URL} | tar -xz --strip-components=1 -C \"$CONFLUENCE_INSTALL_DIR\" && chown -R ${RUN_USER}:${RUN_GROUP} ${CONFLUENCE_INSTALL_DIR}/ && sed -i -e 's/-Xms\\([0-9]\\+[kmg]\\) -Xmx\\([0-9]\\+[kmg]\\)/-Xms\\${JVM_MINIMUM_MEMORY:=\\1} -Xmx\\${JVM_MAXIMUM_MEMORY:=\\2} \\${JVM_SUPPORT_RECOMMENDED_ARGS} -Dconfluence.home=\\${CONFLUENCE_HOME}/g' ${CONFLUENCE_INSTALL_DIR}/bin/setenv.sh && sed -i -e 's/port=\"8090\"/port=\"8090\" secure=\"${catalinaConnectorSecure}\" scheme=\"${catalinaConnectorScheme}\" proxyName=\"${catalinaConnectorProxyName}\" proxyPort=\"${catalinaConnectorProxyPort}\"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml && sed -i -e 's/Context path=\"\"/Context path=\"${catalinaContextPath}\"/' ${CONFLUENCE_INSTALL_DIR}/conf/server.xml"
    ],
    "ArgsEscaped": true,
    "Image": "sha256:2618ff728742a424e1f68775038e202da647c73ee711afe088204ae336374e36",
    "Volumes": {
    "/var/atlassian/application-data/confluence": {}
    },
    "WorkingDir": "/var/atlassian/application-data/confluence",
    "Entrypoint": null,
    "OnBuild": null,
    "Labels": null,
    "DDSM": false
    },
    "DockerVersion": "18.03.1-ee-3",
    "Author": "Atlassian Confluence",
    "Config": {
    "Hostname": "",
    "Domainname": "",
    "User": "",
    "AttachStdin": false,
    "AttachStdout": false,
    "AttachStderr": false,
    "ExposedPorts": {
    "8090/tcp": {},
    "8091/tcp": {}
    },
    "Tty": false,
    "OpenStdin": false,
    "StdinOnce": false,
    "Env": [
    "PATH=/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
    "JAVA_VERSION=jdk8u192-b12",
    "JAVA_HOME=/opt/java/openjdk",
    "JAVA_TOOL_OPTIONS=-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap",
    "RUN_USER=daemon",
    "RUN_GROUP=daemon",
    "CONFLUENCE_HOME=/var/atlassian/application-data/confluence",
    "CONFLUENCE_INSTALL_DIR=/opt/atlassian/confluence"
    ],
    "Cmd": [
    "/entrypoint.sh",
    "-fg"
    ],
    "ArgsEscaped": true,
    "Image": "sha256:2618ff728742a424e1f68775038e202da647c73ee711afe088204ae336374e36",
    "Volumes": {
    "/var/atlassian/application-data/confluence": {}
    },
    "WorkingDir": "/var/atlassian/application-data/confluence",
    "Entrypoint": [
    "/sbin/tini",
    "--"
    ],
    "OnBuild": null,
    "Labels": null,
    "DDSM": false
    },
    "Architecture": "amd64",
    "Os": "linux",
    "Size": 981016296,
    "VirtualSize": 981016296,
    "GraphDriver": {
    "Data": null,
    "Name": "btrfs"
    },
    "RootFS": {
    "Type": "layers",
    "Layers": [
    "sha256:bc7f4b25d0ae3524466891c41cefc7c6833c533e00ba80f8063c68da9a8b65fe",
    "sha256:a768c3f3878e96565d2bf0dcf90508261862847b2e7b8fc804a0770c07f0d5d5",
    "sha256:ca2991e4676cba899ad9bc6ad3a044cd0816915f9e97a6f2e67b6accbc779ba5",
    "sha256:b9b7103af585bd8ae9130de947817be7ce76092aa19cf6d2f9d5290440c645eb",
    "sha256:4508b8a3648cf718b2357b9054f11a8167d855fb4025db5bed5e52befd93e905",
    "sha256:695236666fc1fcb847e1a02d6be963e676c0435e6f009848efe41b559111e601",
    "sha256:84ef2929790df85724c82ff18c2b2e4b85e50703c6ee37915662df37620b9a57",
    "sha256:74434a3cc76f134bc962e5e8c80fd3a82b6ec62c350ded6b92ec1aaefbfc7b48",
    "sha256:35efee10212a591352472e2b60cfaaeb0e16362aab024df732ac8310c3c421d5",
    "sha256:fd61b63656abea55b7b3c35f12035f99f07701285eb8476d778de48f4351ce3d",
    "sha256:f77b89f2feccffdc376556e7c74beaabc55f816f94bfa196925fbac184be2feb",
    "sha256:1f694c4c9c8a00b1ca5a37c1204b744e893154e7d6781b93b2bfb91a3888321b"
    ]
    }
    }
    ]
    ```

    可是似乎还是没办法知道在 /volume1/@docker/btrfs/subvolumes 中对应的是哪个目录呀。
    DearTanker
        4
    DearTanker  
    OP
       2018-12-18 14:30:23 +08:00
    @shakespaces #1 是不是得开启那个“使用高权限执行容器”?
    houzhimeng
        5
    houzhimeng  
       2018-12-18 14:41:30 +08:00
    "Cmd": [
    "php-fpm"
    ],
    "ArgsEscaped": true,
    "Image": "php:7.2-fpm",
    "Volumes": null,
    "WorkingDir": "/var/www/html",
    "Entrypoint": [
    "docker-php-entrypoint"
    ],
    "OnBuild": null,
    "Labels": {}
    },
    DearTanker
        6
    DearTanker  
    OP
       2018-12-18 16:52:59 +08:00
    @houzhimeng #5 不是这个目录,是为了找镜像本身放在哪个目录,不是镜像里面的工作目录。
    DearTanker
        8
    DearTanker  
    OP
       2018-12-18 17:00:44 +08:00
    @CallMeReznov #7 这个我在 3 楼回复了,貌似找不到的。
    alex321
        9
    alex321  
       2018-12-18 17:02:12 +08:00
    话说,你一定要找到镜像本身放在本地的哪个目录做啥子呢。这个是 docker 自己维护的,它管理着由多个 layer 组成的一个镜像。我猜测可能一个 layer 就是一个文件,然后有个类似配置的 layer 做了原本 dockerfile 的转译,启动时使用转译的这个 layer 来把组成的多个 layer 拼合起来构成一个指定的运行的容器环境。

    PS,我不是程序员,仅仅是爱好折腾,不求弄明白各种底层原理,但求能干什么或者怎么干。求不黑。
    tomczhen
        10
    tomczhen  
       2018-12-18 17:18:58 +08:00 via Android
    镜像有导出 /导入命令,没必要去找物理路径。

    权限是认 id 不是用户名,处理一下就行。

    推荐 Portainer。
    wzxjohn
        11
    wzxjohn  
       2018-12-18 18:05:44 +08:00
    镜像本身是分层存储的,没有所谓的一个镜像对应一个目录吧。。。为啥要找这个呢?
    DearTanker
        12
    DearTanker  
    OP
       2018-12-18 18:18:05 +08:00
    @alex321 #9
    @tomczhen #10
    @wzxjohn #11

    因为要进去替换文件、修改文件。。
    cccssss
        13
    cccssss  
       2018-12-18 18:24:14 +08:00
    @DearTanker 替换文件修改文件不是一般都用 Dockerfile 搞定,然后自己再 save 一个出来或者 push 重新发布一下?
    还是我理解的你替换文件是直接修改像 9 楼说的 layer 二进制文件啥的?
    wbrobot
        14
    wbrobot  
       2018-12-18 18:27:21 +08:00
    docker exec -it 容器 /bin/bash
    进容器里面拷出来
    jinyang656
        15
    jinyang656  
       2018-12-18 18:32:01 +08:00 via Android
    @DearTanker #12 替换修改文件你应该 run 一个容器出来,改完之后 docker commit 产生一个新镜像
    DearTanker
        16
    DearTanker  
    OP
       2018-12-18 18:53:45 +08:00
    @jinyang656 #15 学习了。
    wzxjohn
        17
    wzxjohn  
       2018-12-18 19:25:49 +08:00
    @DearTanker 木有修改镜像本身这种玩法的。如果你想做自己的镜像,就去搞 docker file build 一个出来。如果你只是想要修改镜像 run 出来的容器里面的内容的话,直接用这个镜像起一个新的容器,然后 ssh 进去随便搞就可以啦
    0312birdzhang
        18
    0312birdzhang  
       2018-12-18 19:41:50 +08:00
    一个最简单的方法是挂载一个目录用 #14 的方法拷出来,然后运行的时候再把这个目录挂上。(好吧,也不简单,手动狗头
    GuryYu
        19
    GuryYu  
       2018-12-18 20:48:26 +08:00 via iPhone
    @DearTanker 要复制替换容器内文件直接 docker cp 命令不就可以了吗
    leopku
        20
    leopku  
       2018-12-18 23:05:42 +08:00 via iPhone   ❤️ 1
    @shakespaces 给目录加上 everyone 所有权限
    shakespaces
        21
    shakespaces  
       2018-12-19 12:27:45 +08:00 via Android
    @leopku 谢谢,成功了
    shakespaces
        22
    shakespaces  
       2018-12-19 12:28:19 +08:00 via Android
    @DearTanker 我之前试过没有用,现在用了 20 楼的方法就好了
    maleclub
        23
    maleclub  
       2018-12-27 19:54:36 +08:00
    @shakespaces 同问题,已解决。chmod 777 目标目标文件夹即可。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3070 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 13:38 · PVG 21:38 · LAX 05:38 · JFK 08:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.