资讯专栏INFORMATION COLUMN

Docker FAQ总结整理

1treeS / 2423人阅读

摘要:要在的端口上公开容器的端口请执行以下操作可以解决这一问题的一种方法是使用所需的端口映射设置另一个容器并比较命令的输出不过必须删除一些其他选项强制通过代理进行通信。

说明:
docker 小写是指Docker系统的命令行工具。
Docker 大写是指Docker软件系统。
image 镜像,就量个软件包,除操作系统内核外的,包括系统库,应用软件,启动配置等,创建后只读。
container 是指Docker启动一个镜像后的运行结果,相当于在image基础上写盘产生的增量。

如何删除旧的Docker container容器
docker container prune

删除所有未使用的数据 (即按顺序: 停止的container, 没有container的volumne卷和没有container容器的image镜像):

docker system prune 

用于删除所有未标记image镜像的类似命令:

docker images | grep "" | awk "{print $3}" | xargs docker rmi    

如果你的docker比较旧,可以用下面的命令:

docker rm $(docker ps -q -f status=exited)

Windows下:

FOR /f "tokens=*" %i IN ("docker ps -a -q") DO docker rm %i

如用PowerShell:

docker rm @(docker ps -aq)

参见 :https://stackoverflow.com/que...

如何在Docker中处理持久性存储 (例如数据库)?

Docker 1.9.0 以上版本使用 volume API:

docker volume create --name hello
docker run -d -v hello:/container/path/for/volume container_image my_command

这意味着必须放弃仅数据容器模式以支持新的卷模式。为了能够保存(持久化)数据以及共享容器间的数据,Docker提出了Volume的概念。简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。

实际上, volume 是实现数据容器模式的更好方法。

如果使用 -v volume_name:/container/fs/path Docker将自动为您创建一个已命名的卷, 用:

docker volume ls -f dangling=true

检查卷名称: docker volume ls

查看卷在主机上的存储位置: docker volume inspect volume_name

可以像普通目录一样进行备份

如果要授权一个容器访问另一个容器的Volume,我们可以使用-volumes-from参数来执行docker run

新的volume api 添加了一个有用的命令, 它允许您识别悬空卷:

docker volume ls -f dangling=true

然后通过它的名称删除它:

docker volume rm 

也可以一行代码搞定全部:

docker volume rm $(docker volume ls -f dangling=true -q)
# 或用 1.13.x 以上版本
docker volume prune

参见: https://stackoverflow.com/que...

是否可以在活Docker container中公开端口?

不能通过Docker来执行此项, 但您可以从主机上访问容器的未公开端口。

如果您有一个容器, 它的端口8000上运行的东西, 您可以运行

wget http://container_ip:8000

查看 ip 地址, 运行以下两个命令:

docker ps
docker inspect container_name | grep IPAddress

在内部, Docker shell在运行 image 镜像时调用 iptables, 因此可能会对此进行一些更改。

要在 localhost 的8001端口上公开容器的端口 8000, 请执行以下操作:

iptables -t nat -A  DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000

可以解决这一问题的一种方法是, 使用所需的端口映射设置另一个容器, 并比较 iptables -save 命令的输出 (不过, 必须删除一些其他选项, 强制通过Docker代理进行通信)。

注意: 这是在颠覆Docker使用方式, 所以应该小心使用, 它可能会创造蓝色烟雾

另一种选择, 是看-P 选项(0.6.6之后版本?),这将使用随机的主机端口, 然后将这些连接起来。

通过 0.6.5, 您可以使用链接--link功能来搞一个新的容器, 它与现有的容器形成一个对话, 并用 -p 可以额外导出端口(链接的使用可以参考这个链接 http://blog.csdn.net/zhangyif... ),使用了link机制后,可以通过指定的名字来和目标容器通信,这其实是通过给/etc/hosts中加入名称和IP的解析关系来实现的

与docker 0.11?您可以使用 docker run --net=host。要将容器直接附加到主机的网络接口, 因此在容器中打开的所有端口都将被暴露。

https://stackoverflow.com/que...

将文件从主机复制到 Docker 容器

cp 命令可用于复制文件。可以复制一个特定的文件, 如:

docker cp foo.txt mycontainer:/foo .txt
docker cp mycontainer:/foo foo.txt

文件夹 src 包含的多个文件可以使用以下方法复制到目标文件夹中:

docker cp src/. mycontainer:/target
docker cp mycontainer:/src/. target

在1.8 之前的Docker版本中, 仅有可能将文件从容器复制到主机。不能从主机到容器。

参考:
https://stackoverflow.com/que...

如何在Docker容器中装载主机目录?

有几种方法可以做到这一点。最简单的方法是使用 Dockerfile ADD命令, 如下:

ADD . /path/inside/docker/container

但是, 在生成 Dockerfile 后, 主机上对此目录所做的任何更改都不会显示在容器中。这是因为在生成容器时, Docker将目录压缩为.tar文件, 并将该上下文永久地上载到容器中。

第二种方法是装载卷。为尽可能便于移植, 因此不能将主机目录固化地映射到 dockerfile 中的 Docker 容器目录, 因为主机目录可以根据运行的计算机而更改。要将主机目录映射到 Docker 容器目录, 在使用 Docker 运行时, 您需要使用 -v 选项:

docker run -v /host/directory:/container/directory -other -options image_name command_to_run

参考:
https://stackoverflow.com/que...

如何在不通过仓库的情况下将Docker镜像从一个主机复制到另一个宿主?

您需要将Docker 镜像保存为 tar 文件:

docker save -o  

然后将您的图像复制到一个具有常规文件传输工具 (如 cp 或 scp) 的新系统中。之后, 您必须将图像加载到Docker中:

docker load -i 

PS: 您可能需要 sudo 执行命令

参见:
https://stackoverflow.com/que...

如何进入Docker container?

docker attach可以连接到你的docker容器, 但这与 ssh 并不完全相同。例如, 如果你的容器运行的是网络服务器, 则 docker attach可能会连接到 web 服务进程的标准输出。它不一定会给你一个shell。

docker exec 命令可能是你要查找的内容;这将允许你在现有容器内运行任意命令。例如:

docker exec -it  bash

当然, 任何正在运行的命令都必须存在于容器文件系统中。

在上面的命令 是目标容器的名称或 ID。你是否使用Docker是不重要的;只需运行 docker ps, 并使用 ID (在第一列中显示的十六进制字符串) 或名称 (显示在最后一列中)。例如, 给定:

$ docker ps
d2d4a89aaee9        larsks/mini-httpd   "mini_httpd -d /cont   7 days ago          Up 7 days                               web                 

可以运行:

$ docker exec -it web ip addr
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
    valid_lft forever preferred_lft forever
18: eth0:  mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 scope global eth0
    valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:3/64 scope link 
    valid_lft forever preferred_lft forever

同样效果也以通过下面指令达到:

$ docker exec -it d2d4a89aaee9 ip addr

类似地也可以在容器里启动一个shell;

$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$

参考:
https://stackoverflow.com/que...

在 Dockerfile 中, CMD 和 ENTRYPOINT 的区别是什么?

Docker 有一个默认的入口(entrypoint), 它是/bin/sh -c, 但没有默认命令。

当您运行这样的 Docker 时: docker run -i t ubuntu bash 入口是默认/bin/sh -c, 镜像是 ubuntu, 命令是 bash。

该命令通过入口运行。也就是说, 被执行的实际的事情是/bin/sh -c bash。这允许 Docker 通过依赖 shell 分析器实现快速RUN。后来, 人们要求能够定制这样的入口于是引入了-entrypoint

以上示例中的 ubuntu 后面的所有内容都是命令, 并传递给入口。当使用 CMD 指令时, 它就像是在做 docker run --t ubuntu 将是入口的参数。

如果改为键入此命令docker run -i -t ubuntu, 则也会得到相同的结果。您仍将在容器中启动 bash shell, 因为 ubuntu Dockerfile 指定了默认 CMD: CMD ["bash"]

当一切都传递给入口, 便对镜像来说产生一个很好的特性。可以将镜像用作 "二进制"的执行文件。当使用 ["/bin/cat"] 作为入口, 然后运行 docker run img /etc/passwd, 这里,/etc/passwd是命令, 并传递到入口,所以最终结果执行便是/bin/cat /etc/passwd

另一个例子是将任何命令行指令(cli)作为入口。例如, 如果您有一个 redis 镜像, 你可以简单地通过设置ENTRYPOINT ["redis", "-H", "something", "-u", "toto"],然后运行docker run redisimg get key得到键值, 而不是通过运行 docker run redisimg redis -H something -u toto get key,来得到相同的结果。

ENTRYPOINT 指定在容器启动时将始终执行的命令。

CMD 指定将被送入 ENTRYPOINT 的参数。

如果要使镜像专用于特定命令, 您将使用入口 ENTRYPOINT ["/path/dedicated_command"]

否则, 如果要为一般目的制作镜像, 则可以保留未指定的 ENTRYPOINT 并使用 CMD ["/path/dedicated_command"], 因为你可以通过向docker run提供参数来覆盖该设置。

例如, 如果您的 Dockerfile 是:

FROM debian:wheezy
ENTRYPOINT ["/bin/ping"]
CMD ["localhost"]

运行不带参数的镜像会 ping localhost:

$ docker run -it test
PING localhost (127.0.0.1): 48 data bytes
56 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.096 ms
56 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.088 ms
56 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.088 ms
^C--- localhost ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.088/0.091/0.096/0.000 ms

现在带参数运行镜像则会ping 参数指定的主机:

$ docker run -it test google.com
PING google.com (173.194.45.70): 48 data bytes
56 bytes from 173.194.45.70: icmp_seq=0 ttl=55 time=32.583 ms
56 bytes from 173.194.45.70: icmp_seq=2 ttl=55 time=30.327 ms
56 bytes from 173.194.45.70: icmp_seq=4 ttl=55 time=46.379 ms
^C--- google.com ping statistics ---
5 packets transmitted, 3 packets received, 40% packet loss
round-trip min/avg/max/stddev = 30.327/36.430/46.379/7.095 ms

做为比较,假设你有一个 Dockerfile 如下:

FROM debian:wheezy
CMD ["/bin/ping", "localhost"]

运行不带参数的镜像会 ping localhost:

$ docker run -it test
PING localhost (127.0.0.1): 48 data bytes
56 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.076 ms
56 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.087 ms
56 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.090 ms
^C--- localhost ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.076/0.084/0.090/0.000 ms

现在带参数运行镜像则会运行参数指令:

docker run -it test bash
root@e8bb7249b843:/#

可以看看Brian DeHamer这篇文章: https://www.ctl.io/developers...

运行Docker镜像微型指南 下载一个ubuntu镜像

sudo docker pull ubuntu

使用ubuntu运行一个交互性的shell

sudo docker run -i -t ubuntu /bin/bash

docker ps命令

sudo docker ps #列出当前所有正在运行的container
sudo docker ps -l #列出最近一次启动的,且正在运行的container
sudo docker ps -a #列出所有的container

port命令

docker run -p 80:8080 #映射容器的8080端口到宿主机的80端口

删除容器命令

sudo docker rm sudo docker ps -a -q#删除所有容器
sudo docker rm $CONTAINER_ID#删除容器id为CONTAINER_ID的容器

其他命令快速参考:

sudo docker images #查看本地镜像
sudo docker attach $CONTAINER_ID #启动一个已存在的docker实例
sudo docker stop $CONTAINER_ID #停止docker实例
sudo docker logs $CONTAINER_ID #查看docker实例运行日志,确保正常运行
sudo docker inspect $CONTAINER_ID #查看container的实例属性,比如ip等等

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/27236.html

相关文章

  • FAQ宝典之常见问题排查与修复方法

    摘要:日志会显示令牌过期的信息,随后检查主机和主机的时钟是否同步。如果这个子网已经被使用,你将需要更改网络中使用的默认子网。如果负载均衡器处于初始化状态,则很可能主机之间无法进行跨主机通信。而一直显示黄色初始化状态,说明一直没有通过健康检查。 一、服务/容器 1、为什么我只能编辑容器的名称? Docker容器在创建之后就不可更改了。唯一可更改的内容是我们要存储的不属于Docker容器本身的那...

    LdhAndroid 评论0 收藏0
  • FAQ宝典之Rancher Server

    摘要:宝典系列来袭,相关的常见问题,本文一网打尽。在中的设置是以秒为单位的。在启动时,执行模式迁移。它的竞争条件可能会留下一个锁定条目,这将阻止后续的流程。更改为,并清除的值。确认更改在表中是否生效。如果认证未打开,则响应代码应为。 Rancher FAQ宝典系列来袭,Rancher Server相关的常见问题,本文一网打尽。 1、Docker运行Rancher Server容器应该注意什么...

    Lsnsh 评论0 收藏0
  • CI Weekly #8 | CI/CD 技能进阶路线

    摘要:微店技术团队公众号容器化之路这是一套以阿里云为基础,为核心,第三方服务为工具的开发测试部署流程,以及内部的代码提交,版本管理规范。如何打造安全的容器云平台对,微服务,来说都是非常好的落地实践技术。 在使用 flow.ci 进行持续集成的过程中,也许你会遇到一些小麻烦。最近我们整理了一些常见问题在 flow.ci 文档之 FAQ,希望对你有用。如果你遇到其他问题,也可以通过「在线消息」或...

    FuisonDesign 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<