问题
1、docker容器内生成的文件默认属于root用户,导致文件挂载到宿主机上后,宿主机非root用户无法修改文件
解决方法:
a、容器内生成的文件,在容器内处理
b、容器内运行的脚本,开头设置umask 0000 或 chmod 777,这样生成的文件权限为777
c、容器中使用与宿主机普通用户相同的uid执行,参考http://blog.csdn.net/yygydjkthh/article/details/47694929
2、如何在docker容器中运行GUI应用程序
docker run --rm -it -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix <image> 'firefox'
设置DISPLAY环境变量,并且挂载本地的/tmp/.X11-unix目录到容器中,这样在容器内运行GUI程序时,宿主机就会弹出对应的窗口
如果遇到问题:D-Bus library appears to be incorrectly set up; failed to read machine uuid: Failed to open “/var/lib/dbus/machine-id”
需要手动创建machine-id文件
dbus-uuidgen > /var/lib/dbus/machine-id
3、给Docker添加第三方可信仓库
redhat6.5:
Docker目前依然可以在2.6内核版本的RedHat 6.5上运行(稳定性待评估),但仅支持到Docker 1.7.1
https://docs.docker.com/v1.7/installation/rhel/#red-hat-enterprise-linux-6.5-installation
You will need RHEL 6.5 or higher, with a RHEL 6 kernel version 2.6.32-431 or higher as this has specific kernel fixes to allow Docker to work.
在文件/etc/sysconfig/docker中添加:
other_args="--insecure-registry vmax-snapshot-docker.sz.artifactory.zte.com.cn"
或者使用“--insecure-registry 0.0.0.0/0 ”表示接受所有域名的registry
centos7:
在目录/etc/docker中新建文件daemon.json
在文件中添加内容:
{
"insecure-registries" : ["0.0.0.0/0"]
}
重新加载配置: systemctl daemon-reload
重启docker服务: service docker restart
https://docs.docker.com/registry/insecure/
4、给容器挂载目录时出现Permission Denied
当用docker -v挂载volume后,会出现Permission Denied的问题,这有时是因为SeLinux导致的。解决方法如下:
chcon -Rt svirt_sandbox_file_t /path/to/volume
有时候会遇到chcon: can't apply partial context to unlabeled file的错误,这时候需要运行如下命令:
chcon -h system_u:object_r:xxxx_t:s0 /mnt/xxxx
或者可以在挂载目录时,使用 z 或 Z 选项:
docker run -v/var/db:/var/db:z rhel7 /bin/sh
参考:https://docs.docker.com/storage/bind-mounts/#configure-the-selinux-label
svirt-SELinux:https://www.systutorials.com/docs/linux/man/8-svirt_selinux/
漫画SELinux:http://www.cnblogs.com/youlin/p/selinux_coloring_book.html
5、如何在多个容器间共享挂载卷
在docker run的时候通过--volumes-from制定挂载其他容器的挂载卷实现共享
docker run --rm--name=Container1 -vDataVolume1:/datavolume1ubuntu
docker run --rm--nam=Container2 --volumes-from Container1 ubuntu
6、Dockerfile中修改时区
RUN ln -sf /usr/share/zoneinfo/posix/Asia/Shanghai /etc/localtime
常用命令
1、如何查看容器里挂载卷的地址
docker inspect <containerid> | grep Mounts -A 10
2、 删除名为none的镜像
考虑到镜像可能正在被某个已退出的容器使用,所以需要先将容器删除:
docker rm-v$(docker ps-a -q -f status=exited)
然后删除none镜像:
docker images | grepnone | awk'{print $3}'| xargsdocker rmi
3、删除不同tag的多个镜像
需要删除所有名为“nougat_production”不同tag的所有镜像
docker rmi `docker images --filter=reference="nougat_production:*"-q`
其它命令:
退出即销毁
docker run --rm
停止所有容器
docker stop $(docker ps -aq)
删除未运行的容器
docker rm $(docker ps -a -q)
docker rm -f $(docker ps -a -q)
删除所有none的镜像版本
docker rmi $(docker images -f "dangling=true" -q)
查看容器环境变量
cat /proc/{pid}/environ
删除所有容器镜像
docker rmi $(docker images -q)
通过docker overlay2目录获取容器名、id
overlay2目录下执行:
du -sc * | sort -rn | more
docker ps -q | xargs docker inspect --format '{{.State.Pid}},{{.Id}}, {{.Name}}, {{.GraphDriver.Data.WorkDir}}' | grep "20049e2e445181fc742b9e74a8819edf0e7ee8f0c0041fb2d1c9d321f73d8f5b"
docker1.13.6以后增加了容器、镜像清除命令
删除所有不用的镜像
docker images prune --force --all / docker images prune -f -a
删除所有停止的容器
docker container prune