Docker 服务显然正在运行:
$ systemctl status docker.service
? docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2015-12-28 19:20:50 GMT; 3 days ago
Docs: https://docs.docker.com
Main PID: 1015 (docker)
CGroup: /system.slice/docker.service
??1015 /usr/bin/docker daemon -H fd:// --exec-opt native.cgroupdriver=cgroupfs
$ ps wuf -u root | grep $(which docker)
root 1015 0.0 0.3 477048 12432 ? Ssl 2015 2:26 /usr/bin/docker daemon -H fd:// --exec-opt native.cgroupdriver=cgroupfs
Run Code Online (Sandbox Code Playgroud)
但是,Docker 本身拒绝与之交谈:
$ docker info
Cannot connect to the …Run Code Online (Sandbox Code Playgroud) 我最近多次听到关于什么是 Docker 容器的混淆,更具体地说,关于我在 Docker 容器内调用的命令和进程,内部发生了什么。
有人可以提供有关正在发生的事情的高级概述吗?
Docker 的一种简单安装方法(例如)是这样的:
curl -sSL https://get.docker.com/ | sh
Run Code Online (Sandbox Code Playgroud)
但是,我也看到了一些看起来像这样的(使用 Docker 示例):
sh -c "$(curl -sSL https://get.docker.com/)"
Run Code Online (Sandbox Code Playgroud)
它们在功能上似乎相同,但是否有理由使用一个而不是另一个?或者这只是一种偏好/审美?
(请注意,运行来自未知来源的脚本时要非常小心。)
我在我的服务器上的 Docker LXC 容器内运行一些服务,我开始真正用它们做一些严肃的事情。
我不清楚的一件事是用户权限在容器内部和外部如何工作。例如,如果我在容器中运行 MySQL 并将其数据目录设置为/dataDocker 卷,那么容器内外的权限如何影响访问策略?
显然,这个想法是在容器中以自己的用户身份运行 MySQL(即mysql:mysql),并赋予它对该目录的读写权限。我认为这将是相当简单的,只是chmoding 目录等。但这如何在容器之外工作?现在我有了这个名为“数据”的 Docker 共享卷,我该如何管理对它的访问控制?
我特别希望能够在 Docker 容器之外运行一个非特权用户,该用户将定期访问 MySQL 共享卷并备份数据。
如何设置权限、用户和组,以便主机上的特定用户可以读/写 Docker 共享卷中的文件和文件夹?
我想将我的resin/rpi-raspbian:jessie容器设置/etc/resolv.conf为:
nameserver 208.67.222.222
nameserver 208.67.220.220
Run Code Online (Sandbox Code Playgroud)
我的 Dockerfile 有以下几行:
ADD resolv.conf /etc/resolv.conf
Run Code Online (Sandbox Code Playgroud)
这个添加的文件包含正确的名称服务器。
我的 Docker 主机/etc/resolv.conf包含正确的信息。
我正在像这样运行容器:
docker run -itd --cap-add=NET_ADMIN --device /dev/net/tun \
-v /home/pi/share/ovpn:/ovpn \
--privileged --network=internet_disabled --name vpn-client \
--dns=208.67.222.222 \
openvpn-client_nat-gateway /bin/bash
Run Code Online (Sandbox Code Playgroud)
尽管如此,容器还是提供了以下输出:
root@642b0f4716ba:/# cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0
Run Code Online (Sandbox Code Playgroud)
只有在我从容器内(或使用 docker exec)手动更改 resolv.conf 后,它才看起来正确。
我宁愿避免使用 exec 命令修复它。有人知道这里发生了什么吗?
我正在尝试运行一个可在其他系统上运行的 docker 映像(如果您愿意,您甚至可以从 dockerhub 中提取它:它是dougbtv/asterisk)但是,在我的通用工作站上,它在抱怨可用空间(看起来像)它正在解压 docker 图像。
我尝试运行它,当我运行它时,我收到一个错误,指出它空间不足。这是我尝试运行它的一个例子,它抱怨空间。
[root@localhost docker]# docker run -i -t dougbtv/asterisk /bin/bash
Timestamp: 2015-05-13 07:50:58.128736228 -0400 EDT
Code: System error
Message: [/usr/bin/tar -xf /var/lib/docker/tmp/70c178005ccd9cc5373faa8ff0ff9c7c7a4cf0284bd9f65bbbcc2c0d96e8565d410879741/_tmp.tar -C /var/lib/docker/devicemapper/mnt/70c178005ccd9cc5373faa8ff0ff9c7c7a4cf0284bd9f65bbbcc2c0d96e8565d/rootfs/tmp .] failed: /usr/bin/tar: ./asterisk/utils/astdb2sqlite3: Wrote only 512 of 10240 bytes
/usr/bin/tar: ./asterisk/utils/conf2ael.c: Cannot write: No space left on device
/usr/bin/tar: ./asterisk/utils/astcanary: Cannot write: No space left on device
/usr/bin/tar: ./asterisk/utils/.astcanary.o.d: Cannot write: No space left on device
/usr/bin/tar: ./asterisk/utils/check_expr.c: Cannot write: No space left on device
[... another …Run Code Online (Sandbox Code Playgroud) 假设我有一台 Ubuntu 机器并且做了sudo apt install docker.io. 我是否只是在我的机器上放置了一个巨大的安全漏洞,允许任何具有终端访问权限的人升级为 root?
我这么问是因为我可以将任何目录作为容器内的卷安装,升级到容器内的根目录,而且似乎我可以在安装的卷中做任何我想做的事情。这一切似乎都是错误的,我觉得我肯定错过了一些东西。或者就这么简单,在 Ubuntu 的存储库中真的有一个不需要密码的“sudo”替代品?
我可以看到可以通过以下方式将文件插入到 Docker 容器中insert:
docker insert IMAGE URL PATH
Run Code Online (Sandbox Code Playgroud)
有没有办法在 Docker 容器中获取文件的内容并将它们保存在主机操作系统的某个地方?我想提取配置文件的值并将其存储在我的主机操作系统上。
我使用以下 Dockerfile在Docker 容器中构建了Alpine Linux:
FROM alpine:3.2
RUN apk add --update jq curl && rm -rf /var/cache/apk/*
Run Code Online (Sandbox Code Playgroud)
构建运行成功:
$ docker build -t collector .
Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon
Step 0 : FROM alpine:3.2
3.2: Pulling from alpine
8697b6cc1f48: Already exists
alpine:3.2: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Digest: …Run Code Online (Sandbox Code Playgroud) 我需要为 Docker创建一个持久卷。该卷必须命名extra-addons并位于/mnt/.
我运行这个命令:
sudo docker volume create /mnt/extra-addons
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息:
Error response from daemon: create /mnt/extra-addons: "/mnt/extra-addons" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path
Run Code Online (Sandbox Code Playgroud)
请注意,当我简单地运行: 时sudo docker volume create extra-addons,我不会遇到这个问题,但是当我使用 来检查有问题的卷时sudo docker inspect extra-addons,我发现它位于我不想要的地方:
[
{
"CreatedAt": "2018-04-21T14:40:25+03:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/extra-addons/_data",
"Name": "extra-addons",
"Options": {},
"Scope": "local"
}
]
Run Code Online (Sandbox Code Playgroud)
我的意思是我宁愿看到这样的音量: /mnt/extra-addons
任何的想法?
docker ×10
linux ×2
alpine-linux ×1
arch-linux ×1
container ×1
curl ×1
date ×1
fedora ×1
hard-disk ×1
lxc ×1
permissions ×1
pipe ×1
security ×1
shell ×1
users ×1