4-10-配置docker静态IP地址-配置docker私有仓库
本节所讲内容:
• 创建docker静态化IP
• 创建docker私有化仓库
实验环境: 一个全新的RHEL7.2系统
一、创建docker静态化IP
1、Docker有以下4种网络模式:host模式,使用--net=host指定。container模式,使用--net=container:NAME_or_ID指定。none模式,使用--net=none指定。
bridge模式,使用--net=bridge指定,默认设置。
默认选择bridge的情况下,容器启动后会通过DHCP获取一个地址,这可能不是我们想要的,在RHEL7系统上,docker环境下可以使用pipework脚本对容器分配固定IP(这个IP可以是和物理机同网段IP)。
注: docker 默认是bridge(--net=bridge)模式,相当于VMware中NAT模式。
docker环境下可以使用pipework脚本对容器分配固定IP,相当于VMware中桥接模式。
注:Pipework有个缺陷,容器重启后IP设置会自动消失,需要重新设置。
实战1:安装docker并配置桥接网络
一、安装docker服务器
把docker-rpm.tar.gz 上传到RHEL7.2-63 上:
[root@xuegod63 ~]#tar zxvf docker-rpm.tar.gz
[root@xuegod63 ~]# vim /etc/yum.repos.d/docker.repo
[docker]
name=docker
baseurl=file:///root/docker-rpm
enabled=1
gpgcheck=0
安装:
[root@xuegod63 ~]# yum install docker
方法2:在线安装
在阿里云主机,安装好centos7.2系统,直接执行:
yum install docker#阿里云中的centos7.2系统的yum源可以支持安装docker。安装时,把软件包停留下来,做成yum源,方便后期使用。
配置yum源:
[root@xuegod63 ~]# vim /etc/yum.repos.d/extras.repo#插入以下内容
[extras]
name=CentOS-$releasever -Extras
baseurl= http://mirrors.aliyun.com/centos/7.3.1611/extras/x86_64/Packages/
gpgcheck=0
enabled=1
gpgcheck=0
安装:
yum install docker
2.配置桥接网络:
桥接本地物理网络的目的,是为了局域网内用户方便访问docker实例中服务,不要需要各种端口映射即可访问服务。但是这样做,又违背了docker容器的安全隔离的原则,工作中辩证的选择.
创建桥设备:
安装包:
[root@xuegod63 ~]# rpm -ivh /mnt/Packages/bridge-utils-1.2-9.el6.x86_64.rpm
把eth0绑到br0桥设备上:
[root@xuegod63 ~]# cd /etc/sysconfig/network-scripts/
[root@xuegod63 network-scripts]# cp ifcfg-eno16777736 /opt/ #备份一下eth0
[root@xuegod63 network-scripts]# vim ifcfg-eno16777736 #编辑配置文件为以下内容
[root@xuegod63 network-scripts]# vim ifcfg-eno16777736
TYPE="Ethernet"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
NAME="eno16777736"
UUID="7a556ff6-f865-4549-b08f-9e526c9bb638"
DEVICE="eno16777736"
ONBOOT="yes"
IPADDR="192.168.1.63" #删除这些IP地址相关内容
PREFIX="24"
GATEWAY="192.168.1.1"
DNS1="8.8.8.8"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_PRIVACY="no"
BRIDGE="br0" #在文件最后插入这一行
生成桥设备br0的配置文件:
[root@xuegod63 network-scripts]# vim ifcfg-br0#创建ifcfg-br0 文件,并写入以下内容
DEVICE="br0"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Bridge"
BOOTPROTO=none
IPADDR=192.168.1.63
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=114.114.114.114
注:TYPE="Bridge",B要大写。不大写也可以。
[root@xuegod63 network-scripts]# service network restart
Restarting network (via systemctl): [ 确定]
测试br0:
root@xuegod63 network-scripts]# ifconfig
[root@xuegod63 network-scripts]# ping g.cn
PING g.cn (203.208.37.20) 56(84) bytes of data.
64 bytes from 203.208.37.20: icmp_seq=1 ttl=57 time=12.3 ms
3、下载pipework包
方法1:直接下载pipeworkzip包
https://github.com/jpetazzo/pipework
把pipework-master.zip上传到Linux中
扩展:
方法2:使用git获得:
git下载链接:https://github.com/jpetazzo/pipework
下载pipework工具:https://github.com/jpetazzo/pipework.git
[root@xuegod63 ~]# rpm -qf `which git`
git-1.8.3.1-5.el7.x86_64
[root@xuegod63 ~]# cd /opt/
[root@xuegod63 opt]# git clone https://github.com/jpetazzo/pipework.git
正克隆到 'pipework'...
remote: Counting objects: 497, done.
remote: Total 497 (delta 0), reused 1 (delta 0), pack-reused 496
接收对象中: 100% (497/497), 171.82 KiB | 103.00 KiB/s, done.
处理 delta 中: 100% (262/262), done.
咱们使用方法1:
将pipework-master.zip上传xuegod63上:
[root@xuegod63 ~]# unzip pipework-master.zip# 不需要编译,因为pipework是一个shell脚本
查看:
[root@xuegod63 ~]# vim ./pipework-master/pipework
[root@xuegod63 ~]# cp /root/pipework-master/pipework /usr/local/bin/#方便后期使用pipework命令
到此pipework已经安装成功。
启动docker:
[root@xuegod63 ~]# systemctl start docker
把centos-lastest-docker-image.tar 镜像上传Linux上,并导入docker平台
[root@xuegod63 ~]# docker load -i centos-lastest-docker-image.tar
[root@xuegod63 ~]# ifconfig #查看网络,会发现多了一个docker0桥接设备
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.63 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::20c:29ff:fe06:26a6 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:06:26:a6 txqueuelen 0 (Ethernet)
RX packets 466 bytes 237639 (232.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 265 bytes 23394 (22.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
ether 02:42:85:5f:8d:8c txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
例:以none模式,使用--net=none启动一个容器,并且开启docker特权模式。
[root@xuegod63 ~]# docker run -itd --net=none --privileged=true centos bash
e4698f625a56661edd2678269215ba42d4fa41c2da881768a741a72b4a3d0c60
扩展:
--privileged=true#允许开启特权功能
大约在docker 0.6版以后,privileged被引入docker。使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。使用privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。甚至允许你在docker容器中启动docker容器。不启用privileged,容器中root用户不能执行mount。
扩展:测试privileged特权功能可以:1
1、未设置privileged启动的容器:
[root@localhost ~]# docker run -it centos:latest bash
[root@65acccbba42f /]# ls /dev #可以看到的设备文件比较少
console fd full fuse kcore null ptmx pts random shm stderr stdin stdout tty urandom zero
[root@00931099722f /]# mount -o bind /etc /opt/
mount: permission denied
而在物理机是可以挂载成功的:
[root@xuegod63 ~]# mount -o bind /etc /opt/
[root@00931099722f /]# exit
2、使用privileged启动的容器
[root@xuegod63 ~]# docker run -it --privileged centos:latest bash
[root@4a51d0fde3ce /]# ls /dev/#可以看到很多设备文件
[root@4a51d0fde3ce /]# mount -o bind /etc/opt/#可以挂载成功
[root@4a51d0fde3ce /]# ls /opt/
[root@4a51d0fde3ce /]# init 0 #不行,还是使用exit退出docker
Couldn't find an alternative telinit implementation to spawn.
[root@4a51d0fde3ce /]# exit
扩展结束,接着给容器配置地址
[root@xuegod63 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e4698f625a56 centos "bash" 30 seconds ago Up 27 seconds suspicious_colden
可以看到容器启动的ID ,比如是e4698f625a56
给此容器配置地址
pipework语法:pipework 网桥名容器实例ID 分配给容器的IP/掩码@网关
[root@xuegod63 ~]# pipework br0 c88c4c7f01f9 192.168.1.71/24@192.168.1.1
测试IP:
[root@xuegod63 ~]# ping 192.168.1.71#可以看到docker实例的IP已经可以使用
PING 192.168.1.71 (192.168.1.71) 56(84) bytes of data.
64 bytes from 192.168.1.71: icmp_seq=1 ttl=64 time=0.639 ms
进入容器,测试网络:
[root@xuegod63 ~]# docker exec -it 87fadc0249a9 /bin/bash#进入容器
[root@6e38ee3f9672 /]# cat /etc/resolv.conf
# Generated by NetworkManager
search xuegod63.cn
nameserver8.8.8.8
[root@e4698f625a56 /]# yum install -y net-tools#安装ifconfig命令
[root@e4698f625a56 /]# ifconfig
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet192.168.1.71netmask 255.255.255.0 broadcast 192.168.1.255
[root@e4698f625a56 /]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth1
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
到此,docker实例配置静态IP成功。
总结:
1、创建一个br0桥接设备
2、下载pipework包并安装
3、安装并运行docker
4、导入centos docker 镜像
5、启动一个docker实例注意加参数:--net=none --privileged=true
6、使用pipework给docker实例配置IP
实战2:配置docker私有仓库
实验环境:重新还原快照到一个全新的RHEL7.2系统
有时候使用Docker Hub这样的公共仓库可能不方便(有时候无法访问),用户可以创建一个本地仓库供私人使用,这里使用官方提供的工具docker-registry来配置私有库
1、使用官方提供的工具来配置
docker-registry 是官方提供的工具,可以用于构建私有的镜像仓库。
私有仓库好处:
1、节约带宽
2、可以自己定制系统
docker-registry这个工具是一个镜像,直接下载并安装registry镜像就可以了。
有了docker以后,所有软件不再以office.exe 或lrzsz.rpm 形式发布,而以docker镜像发布。当安装软件并运行,就是指:下载docker镜像并运行一个docker实例。
实验环境:
docker私有仓库地址:192.168.1.63
docker服务器地址:192.168.1.64 ,xuegod64会使用xuegod63上docker私有仓库来pull/push镜像
实验拓扑图:
一、配置xuegod63为docker私有仓库
1、#不能关闭防火墙,因为docker后期端口转发,需要使用firewalld
[root@xuegod63 ~]# systemctl startfirewalld.service#必需开启防火墙,因为后面要使用5000端口进行通信
2、关闭selinux
[root@xuegod63 ~]#vim/etc/sysconfig/selinux
改:SELINUX=enforcing
为:SELINUX=disabled
[root@xuegod63 ~]#reboot
[root@xuegod63 ~]# getenforce
Disabled
3、安装docker服务器,前面做docker静态IP时,已经安装过docker服务器,这样只列出命令,不再执行。
把docker-rpm.tar.gz 上传到RHEL7.2-63 上:
[root@xuegod63 ~]#tar zxvf docker-rpm.tar.gz
[root@xuegod63 ~]# vim /etc/yum.repos.d/docker.repo
[docker]
name=docker
baseurl=file:///root/docker-rpm
enabled=1
gpgcheck=0
安装:
[root@xuegod63 ~]# yum install docker
二、配置docker私有仓库服务端
1.启动docker
[root@xuegod63 ~]# systemctl start docker
[root@xuegod63 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno16777736#修改DNS地址,因为使用8.8.8.8,有时解析不docker hub地址
改:DNS1="8.8.8.8"
为:DNS1="114.114.114.114"
[root@xuegod63 ~]# systemctl restart NetworkManager
[root@xuegod63 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search xuegod63.cn
nameserver 114.114.114.114
2.拉取registry镜像。registry镜像中包括搭建本地私有仓库的软件:
把registry.tar上传到Linux上
方法一:导入本地镜像:
[root@xuegod63 ~]# docker load -i registry.tar
方法二:在线导入镜像,比较慢
[root@xuegod63 ~]# docker pull registry
Using default tag: latest
Trying to pull repository docker.io/library/registry ...
latest: Pulling from docker.io/library/registry
709515475419: Downloading 195.8 kB/2.313 MB
df6e278d8f96: Retrying in 5 seconds
4b0b08c1b8f7: Downloading 195.7 kB/6.203 MB
80119f43a01e: Waiting
acf34ba23c50: Waiting
error pulling image configuration: Get https://dseasb33srnrn.cloudfront.net/registry-v2/docker/registry/v2/blobs/sha256/13/136c8b16df203ef26b2f39e24bd3f403b63be67610ec99a5b5af0cceac5c1b51/data?Expires=1491661458&Signature=VpBWJnckUbRqJol8EWTw2ZswQ-xOjrbqDfUstwjJwA55NoaOlESDpUC2AOloQXQRXx~F7-DGwaOY4bjJpdymnVhyv5ylO2ZB1tlkgANsNYhyoKOSyT8IycW94Cee~GaXqdcwkdECsLqWbRW1S297k4jK2GXTtaZqUsBrrmx3oAQ_&Key-Pair-Id=APKAJECH5M7VWIS5YZ6Q: EOF
注:这是因为访问不了国外的网址导致的。
解决:多再试试几次,终于一次,你不会被墙,可以访问成功的。
扩展:下载registry镜像时,有时会访问不到国外网站,导致下载失败
解决:使用MK给你的镜像直接导入:
[root@xuegod63 ~]# docker save -o registry.tar docker.io/registry:latest#导出镜像
例:使用导入本地镜像:
[root@xuegod63 ~]# docker load -i registry.tar
3.查看registry镜像
[root@xuegod63 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/registry latest 047218491f8c 3 weeks ago 33.17 MB
扩展:.io域名
.io 是[british indian ocean territory] 英属印度洋领地的简写
4.从Docker HUB 上拉取一个镜像测试
方法一:本地导入
上传busybox.tar镜像到Linux系统上,作为测试镜像。
[root@xuegod63 ~]# docker load -i busybox.tar
[root@xuegod63 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/busybox latest 00f017a8c2a6 2 weeks ago 1.11 MB
docker.io/registry latest 047218491f8c 3 weeks ago 33.17 MB
注:
BusyBox 概述:BusyBox是一个集成了一百多个最常用Linux命令和工具的软件。BusyBox 包含了一些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具,例grep、find、mount以及telnet。有些人将BusyBox 称为Linux 工具里的瑞士军刀。简单的说BusyBox就好像是个大工具箱,它集成压缩了Linux 的许多工具和命令,也包含了Android 系统的自带的shell。
官网:www.busybox.net
方法二:在线安装
[root@xuegod63 opt]# docker pull busybox
Using default tag: latest
Trying to pull repository docker.io/library/busybox ...
latest: Pulling from docker.io/library/busybox
5、创建镜像链接或为基础镜像打个标签
语法:dockertag镜像名:标签私有仓库地址/镜像名:标签
[root@xuegod63~]# docker tag docker.io/busybox 192.168.1.63:5000/busybox:latest
注:不写镜像标签,默认是:latest
[root@xuegod63 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.1.63:5000/busybox latest 00f017a8c2a6 2 weeks ago 1.11 MB
docker.io/busybox latest 00f017a8c2a6 2 weeks ago 1.11 MB
docker.io/registry latest 047218491f8c 3 weeks ago 33.17 MB
也可以这样:
[root@xuegod63 ~]# docker tag docker.io/busybox192.168.1.63:5000/busybox:v1
6.修改docker配置文件,指定私有仓库url
docker 配置需要安装docker-common-1.12.6-11.el7.centos.x86_64这个包,不然没有配置文件。默认我已经安装了。
[root@xuegod63 ~]# rpm -qf /etc/sysconfig/docker
docker-common-1.12.6-11.el7.centos.x86_64
[root@xuegod63 ~]# vim /etc/sysconfig/docker
改:4 OPTIONS='--selinux-enabled --log-driver=journald--signature-verification=false'
为:OPTIONS='--selinux-enabled --log-driver=journald--signature-verification=false--insecure-registry 192.168.1.63:5000'
注:在原文件后,追加红色标记文字。--insecure-registry不安全的注册。即通信使用http协议
[root@xuegod63 ~]# systemctl restart docker#启动时需要等待时间长一些
到此,所有准备工作已经完成。
7.使用registry镜像搭建一个私有仓库。registry镜像中已经把搭建私有库程序安装好了,我只需要使用registry镜像运行一个docker实例就可以了。
默认情况下,Registry程序的存放镜像信息的目录是/var/lib/registry目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失,所以我们一般情况下会指定本地物理机一个目录挂载到容器的/opt/registry下,这样两个目录下都有!
注:registry运行的实例的默认存储路径是/var/lib/registry,只是个临时目录,一段时间之后就会消失。所以使用-v参数,指定本地持久的路径。
[root@xuegod63 ~]# docker run -d -p 5000:5000 -v /opt/registry:/var/lib/registry registry
e4698f625a56661edd2678269215ba42d4fa41c2da881768a741a72b4a3d0c60
[root@xuegod63 ~]# ls/opt/registry# 这个目录会自动创建
[root@xuegod63 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e4698f625a56 docker.io/registry "/entrypoint.sh /etc/" 7 minutes ago Up 6 minutes 0.0.0.0:5000->5000/tcp suspicious_colden
[root@xuegod63 ~]# netstat -antup | grep 5000
tcp6 0 0 :::5000 :::* LISTEN 4032/docker-proxy
说明,私有库已经启动成功。
8、将刚新打好标签的192.168.1.63:5000/busybox镜像,push到本地私有仓库中。
[root@xuegod63 ~]# docker push 192.168.1.63:5000/busybox
The push refers to a repository [192.168.1.63:5000/busybox]
c0de73ac9968: Pushed
latest: digest: sha256:68effe31a4ae8312e47f54bec52d1fc925908009ce7e6f734e1b54a4169081c5 size: 527
实战2:测试私有库是否可用
在另外一台RHEL7.2-64-64系统测试pull功能
开启RHEL7.2-64-64虚拟机:
1.安装docker
[root@xuegod63 ~]# scp -r docker-rpm 192.168.1.64:/root/
[root@xuegod63 ~]# scp /etc/yum.repos.d/docker.repo 192.168.1.64:/etc/yum.repos.d/
安装:
[root@xuegod64 ~]# yum install docker -y
2.修改docker配置文件,指定私有仓库url
[root@xuegod64~]#vim /etc/sysconfig/docker修改此行
改:4 OPTIONS='--selinux-enabled --log-driver=journald--signature-verification=false'
为:OPTIONS='--selinux-enabled --log-driver=journald--signature-verification=false--insecure-registry 192.168.1.63:5000'
注:添加红色标记文字。--insecure-registry不安全的注册
[root@xuegod64~]# systemctl restart docker#启动docker服务
3.测试,下载刚才上传的镜像
[root@xuegod64 ~]# docker pull 192.168.1.63:5000/busybox
Using default tag: latest
Trying to pull repository 192.168.1.63:5000/busybox ...
latest: Pulling from 192.168.1.63:5000/busybox
04176c8b224a: Pull complete
Digest: sha256:68effe31a4ae8312e47f54bec52d1fc925908009ce7e6f734e1b54a4169081c5
[root@xuegod64 ~]# docker images #查看导入的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.1.63:5000/busybox latest 00f017a8c2a6 2 weeks ago 1.11 MB
到些,导入成功。
使用新导入的镜像,运行一个新docker实例:
[root@xuegod64 ~]# docker run 192.168.1.63:5000/busybox:latest echo "hello"
hello
运行成功。
创建镜像链接并命名:
[root@xuegod64 ~]# docker tag 192.168.1.63:5000/busybox busybox:v1
[root@xuegod64 ~]# docker images
REPOSITORYTAG IMAGE ID CREATED SIZE
192.168.1.63:5000/busybox latest 00f017a8c2a6 5 months ago 1.11 MB
busybox v1 00f017a8c2a6 5 months ago 1.11 MB
删除镜像:
语法:docker rmi 镜像名:标签
[root@xuegod64 ~]# docker rmi 192.168.1.63:5000/busybox:latest#删除镜像
Untagged: 192.168.1.63:5000/busybox:latest
Untagged: 192.168.1.63:5000/busybox@sha256:68effe31a4ae8312e47f54bec52d1fc925908009ce7e6f734e1b54a4169081c5
[root@xuegod64 ~]# docker images #查看镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox v1 00f017a8c2a6 5 months ago 1.11 MB
[root@xuegod64 ~]# docker run -it busybox:v1 echo aaaaaa#使用新命名的镜像运行实例
aaaaaa