9. Docker构建私有registry
add和copy的文件一定要放在dockerfile目录下。然后不能删除none的镜像,导出的时候相关联的镜像都是打包到一起的。
之前用dockerfile做的镜像分发给别人后,别人还要build一下,不如直接弄好放到一个私人的registry里。
9.1 启动registry
–restart这个参数就是当docker整个服务启动时,所有的镜像都启动,看下面这条命令。
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/registry:/var/lib/registry registry
9.2 修改配置文件
vim /etc/docker/demon.json
{
"registry-mirrors": ["https://68rmyzg7.mirror.aliyuncs.com"],
"insecure-registries": ["10.0.0.100:5000"]
}
[root@docker docker]# systemctl restart docker
9.3 制作本地镜像并push到
必须按照上图的命名规范(地址和端口)来对镜像命名,然后push到registry。
[root@docker ~]# docker tag nginx 10.0.0.100:5000/oldguo/nginx:v1
[root@docker ~]# docker images
[root@docker ~]# docker push 10.0.0.100:5000/oldguo/nginx:v1
9.4 异地进行pull镜像
[root@docker ~]# docker pull 10.0.0.100:5000/oldguo/nginx:v1
9.5 本地仓库加安全认证
生成密码:
yum install httpd-tools -y
mkdir /opt/registry-auth/ -p
htpasswd -Bbn oldguo 123 > /opt/registry-auth/htpasswd
9.6 重新启动带有秘钥功能的registry容器
docker rm -f `docker ps -aq`
docker run -d -p 5000:5000 -v /opt/registry-auth/:/auth/ -v /opt/registry:/var/lib/registry --name register-auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry
9.7 push镜像,需要进行login
如上图不能直接push了。
[root@oldboy ~]# docker login 10.0.0.100:5000
Username: oldguo
Password:
pull是直接的。
10. 重启docker服务,容器全部退出的解决办法
方法一:docker run --restart=always
方法二:"live-restore": true
docker server配置文件/etc/docker/daemon.json参考
{
.....
......
"live-restore": true
}
11. habor实现图形化register
1. 安装:
第一步:安装docker和docker-compose
yum install -y docker-compose
第二步:下载harbor-offline-installer-vxxx.tgz
第三步:上传到/opt,并解压
第四步:修改harbor.cfg配置文件
hostname = 10.0.0.100
harbor_admin_password = 123456
第五步:执行install.sh
用户名默认admin
安装完后如上所示。
2. 使用方法:
vim /etc/docker/demon.json
修改各个节点的docker配置文件
{
"registry-mirrors": ["https://uoggbpok.mirror.aliyuncs.com"],
"insecure-registries": ["10.0.0.100:5000","10.0.0.100"],
"live-restore": true //docker重启里面的容器也自动重启。
}
systemctl restart docker
- 在habor中添加项目
这一步就是对应的打标签的/oldboy,权限设置为公开。
下图是push完后看到的镜像。
5. 制作镜像并上传habor
[root@docker harbor]# docker tag centos:6.9 10.0.0.100/oldguo/centos:v1
[root@docker harbor]# docker login 10.0.0.100
[root@docker harbor]# docker push 10.0.0.100/oldguo/centos:v1
6. 在节点中pull habor中的镜像
docker pull 10.0.0.100/oldguo/centos:v1
12. Docker本地网络类型
12.1查看支持网络类型
docker network ls
12.2 测试使用各类网络类型
如下host方式:
如上图,相当于直接穿透访问容器(host不常用)!
下图是container模式,当一号容器挂了的时候,启动二号容器,一号容器里面的服务直接由二号容器接管,也就是一二号容器共用一个ip和端口
docker run network=xxx
none : 无网络模式
bridge : 默认模式,相当于NAT,bridge只提供了容器访问外网的功能和容器之间的访问,并不能让外网直接到容器,外网进入容器是通过iptables进行端口映射,然后对于跨主机的容器访问比较麻烦。
host : 公用宿主机Network NameSapce(也就是容器和宿主机共用ip,主机名,端口号)可以访问外网,然后宿主机如果启了ssh,那么容器是启不了ssh的,这时可以改容器里面ssh的端口。然后主机内容器与容器之间访问通过端口号区分。
container:与其他容器公用Network Namespace
补充一条命令,退出状态的容器都删掉。
13. Docker跨主机网络介绍
macvlan
overlay
#14. Docker跨主机访问-macvlan实现
macvlan理解为一个虚拟的网络设备通道。
docker network create --driver macvlan --subnet=100.0.0.0/24 --gateway=100.0.0.254 -o parent=eth0 macvlan_1(不同的两台主机都要执行该命令,他们的通道名称为macvlan_1,地址段自设定)
ip link set eth0 promsic on (ubuntu或其他版本需要)
需将两台主机ipv4转发改成1
然后两台主机启动容器
如果两主机按照上述命令执行,ip是一样的,于是分别执行下面两条命令。
[root@docker ~]# docker run -it --network macvlan_1 --ip=100.0.0.11 oldguo/centos6.9-sshd:v1.0 /bin/bash
[root@docker ~]# docker run -it --network macvlan_1 --ip=100.0.0.12 centos:6.9 /bin/bash
ip要写刚刚通道的地址段地址。
macvlan这种方式只要通道名字是一样的,都可以互相访问,但只能是本圈子内,出了这个圈子就不行了,也不能访问外网。
#15. Docker 跨主机访问-overlay实现
macvlan的地址只能人工管理,很容易出现地址相同。
如下图所示overlap:
每个容器两块网卡,一块负责与docker0联系,一块负责与另一台主机的容器网卡联系,然后还需要一个容器作为统一配置管理,专门管理ip地址配置,避免重复。
(1)启动 consul 服务,实现网络的统一配置管理,consul是个容器,也需要从网上下载
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
consul:kv类型的存储数据库(key:value)
docker01、02上:
然后我们需要让各主机能访问到该consul
两边都要改
vim /etc/docker/daemon.json
{
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"cluster-store": "consul://10.0.0.100:8500",
"cluster-advertise": "10.0.0.100:2376"
}
vim /etc/docker/daemon.json
{
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"cluster-store": "consul://10.0.0.100:8500",
"cluster-advertise": "10.0.0.101:2376"
}
vim /etc/docker/daemon.json
##vim /usr/lib/systemd/system/docker.service(新版本才改)
##systemctl daemon-reload
systemctl restart docker
2)创建overlay网络(类似于macvlan,但是overlay只需要一边执行就行了)
docker network create -d overlay --subnet 172.116.0.0/24 --gateway 172.11.0.254 overlay
3)两边启动容器测试
docker run -it --network overlay busybox /bin/sh
每个容器有两块网卡,eth0实现容器间的通讯,eth1实现容器访问外网
新版本才改
vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/docker daemon -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --cluster-store=consul://10.0.0.100:8500 --cluster-advertise=10.0.0.100:2376