[TOC]
docker pull 慢
docker-machine ssh
连接宿主机 default
sudo vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/", "http://hub-mirror.c.163.com"]
}
sudo /etc/init.d/docker restart
或者
echo "{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/", "http://hub-mirror.c.163.com"]
}">/etc/docker/daemon.json
sudo /etc/init.d/docker restart
注意:
- 这个更改会同时改变 Kitematic 的镜像源
- 有时候,daemon.json 不存在,新增一个就行
Docker pull卡住,解决方案 这篇文章中提到几个可以用的国内加速器(中国科技大学的镜像加速器、阿里云加速器、DaoCloud 加速器)
中国科技大学的镜像加速器,进一步的信息可以访问:Docker Hub 源使用帮助
docker hub下载速度太慢,更新国内源 另外一个国内源 http://hub-mirror.c.163.com
docker镜像源加速设置之windows 这篇文章讲解了 ToolBox 下,如何设置
官方文档 Registry as a pull through cache 注意,docker 18 版 以后,修改 daemon 的命令有调整
# 原来
docker --registry-mirror=https://registry.docker-cn.com daemon
# 现在
dockerd --registry-mirror=https://registry.docker-cn.com
操作 daemon 参考这篇文章,Docker学习笔记 — 配置国内免费registry mirror
docker 容器中部署应用存在 时差 8 小时 问题
一开始发现时差问题时,各种解决不了,指导阅读到了这篇文章 boot2docker持久化配置,修改时区时间和docker国内镜像地址 ,才知道每一次重启 宿主机 default 的时候,都是重新加载的,因此,必须有一个持久化的方法。但是,这篇文章说明的不是很详细,直到看到了这篇文章 boot2docker 遇到的几个坑 觉得特别赞,按照这个方法成功的解决了时差 8 小时的问题;
主要问题一共有这么几个:
- 宿主机 default 上并没有 /user/share/zoneinfo 这个目录,因此网上的好多文章并不能用
- 时差配置完毕以后,重启电脑,或者重启宿主机都会导致时差配置失效,不能持久化
因此,解决方案如下:
- 从包含正确时区的 linux 设备上 使用远程命令 scp 拷贝一个正确的 localtime 文件到/mnt/sda1下;
- 命令:
sudo scp root@192.168.3.232:/etc/localtime /mnt/sda1/
- 命令:
- 然后在 /mnt/sda1/var/lib/boot2doceker 下新建 bootlocal.sh文件,并赋予执行权限;
- 命令
sudo echo 'cp -f /mnt/sda1/localtime /etc/localtime && echo "Asia/Shanghai" > /etc/timezone;'>/var/lib/boot2docker/bootlocal.sh
- 权限
chmod +x /var/lib/boot2docker/bootlocal.sh
- 命令
dokcer 容器被局域网发现
docker toolbox无法被外网访问解决方法 看完这篇文章,突然觉得好简单,绕了天大的一个圈子,然后转了回来。好了现在解决了,开心!
Docker高级网络实践之 玩转Linux network namespace & pipework
上面这篇文章,有很多关于 linux ip 这个命令的使用,关于 ip 命令的详解见文章:Linux ip命令详解
IP 命令使用方法 包含 ip link set 命令组的介绍,摘录如下
ip -s -s link show # 显示所有接口详细信息
ip -s -s link show eth1.11 # 显示单独接口信息
ip link set dev eth1 up # 启动设备,相当于 ifconfig eth1 up
ip link set dev eth1 down # 停止设备,相当于 ifconfig eth1 down
ip link set dev eth1 txqueuelen 100 # 改变设备传输队列长度
ip link set dev eth1 mtu 1200 # 改变 MTU 长度
ip link set dev eth1 address 00:00:00:AA:BB:CC # 改变 MAC 地址
ip link set dev eth1 name myeth # 接口名变更
Linux网络命名空间 这篇文章觉得特别好,其中介绍到:虚拟网卡 veth,是成对出现的,就像一个管道的两端,从这个管道的一端的veth进去的数据会从另一端的veth再出来。因此,创建虚拟网卡 veth 都是成对出现
上面这篇文章中关联了几篇文章,觉得有价值的如下:
DOCKER基础技术:LINUX NAMESPACE(上)
DOCKER基础技术:LINUX NAMESPACE(下)
docker 网络
Network namespaces 这里面讲了一些等效用法,有启发
eth 是 Ethernet 的缩略 以太网络
docker for windows 容器内网通过独立IP直接访问的方法 讲了在windows下通过配置 route 命令配置路由的方式,使得 docker 容器 可以被局域网发现
docker network 对官网的文旦进行了一翻译
ip addr 输出的 linux IP 信息都是啥含义,参见文章:透过ip addr看ip
图解的一些概念,可以 docker 网络配置
Docker的网络类型和固定IP设置
docker 官网 macvlan 配置说明
Docker容器通过独立IP暴露给局域网的方法
Docker 容器使用宿主机同网段IP - 实话实说,目前还看不懂
Docker第二波
Docker第三波
docker 数据持久
在 mysql 官网上看到,在 docker 中部署 mysql 的时候,采用的是 --mount 命令完成持久化;这个以前没有了解过,于是查阅资料:
Docker数据持久之volume和bind mount 在这篇文章中,介绍了三种持久化的方案;表达了2个区别:
- Bind mount会覆盖容器中的文件,而volume mount则不会,即如果容器中已有文件,则会将文件同步到主机的目录上。
- mount 方式与Linux系统的mount方式很相似,即是会覆盖容器内已存在的目录或文件,但并不会改变容器内原有的文件,当umount后容器内原有的文件就会还原。
docker volumes 中 -v 和 -mount 区别 在这篇文章中说,没啥区别
注意了,run 命令下 -v 和 --mount 是等效的;区别另外一种持久化方案 bind mounts 见官网 Use bind mounts
run -v 参数用法总结
宿主主机路径(文件)与容器绑定
详见 官方文档 docker run -v 参数的使用相关章节
docker run -v [宿主主机文件系统路径]:[容器文件系统路径]
如果宿主主机中路径不存在,docker 会自动创建这个路径
绑定卷
详见 官方文档 use volumes
docker run -v [卷名称]:[容器文件系统路径]
docker 默认存储路径位置迁移
在实践中,通常需要把 docker 存储的路径放到一个比较大的磁盘中,避免占用系统盘过多的空间,采用这篇文章的方式 Docker修改默认存储位置
摘录如下:
# 确认当前 docker root dir 位置
docker info | grep 'Docker Root Dir' // 默认输出结果为:Docker Root Dir: /var/lib/docker
# 移动到 docker root dir 路径上一层
cd /var/lib
#停止docker服务
root@xxxxxx:/var/lib# service docker stop
#备份原目录
root@xxxxxx:/var/lib# cp -a docker{,_bak}
#拷贝数据到新位置
root@xxxxxx:/var/lib# cp -a docker/ {new_location}/
#建立软连接:
root@xxxxxx:/var/lib# rm -rf docker/
root@xxxxxx:/var/lib# ln -s {new_location}/ docker
#启动docker
root@xxxxxx:/var/lib# service docker start
#检查移动后数据是否完整
root@xxxxxx:/var/lib# docker images
root@xxxxxx:/var/lib# docker ps -a
#如果docker完整并可用,删除备份
root@xxxxxx:/var/lib# rm -rf docker_bak/
docker 使用宿主机 IP 访问容器
增加防火墙配置
# 整体放开 docker 的防火墙限制
sudo firewall-cmd --permanent --zone=trusted --add-interface=docker0
# xxxx改为你希望的端口号
# do firewall-cmd --permanent --zone=trusted --add-port=xxxx/tcp
sudo firewall-cmd --reload
找了很多文章,终于看到一篇讲到这个主题,在 centos7 下面通过配置 firewall 实现 docker 容器通过宿主机 IP 和具体端口号访问宿主机上的其他容器,详见 docker、firewalld和iptables之间的关系