部署内网Docker Registry

目前docker 已经分为社区版 (docker CE)和 商业版(docker EE),最新的版本由原来的1.13直接跳到了17.06,目前由于17.06的刚刚发布,在使用Docker 的时候可以根据自己的需求选择相应的版本。

Docker 安装

先移除其他非官方的版本:

yum -y remove docker docker-common container-selinux
yum -y remove docker-selinux

添加yum源,这里选择1.13的版本:

yum install -y yum-utils
yum-config-manager --add-repo https://docs.docker.com/v1.13/engine/installation/linux/repo_files/centos/docker.repo

对yum仓库快速缓存:

 yum makecache fast

安装docker:

yum -y install docker-engine-1.13.1

如果对版本有特殊要求,这里可以使用如下命令,列出可选的版本信息,然后指定版本安装:

yum list docker-engine.x86_64  --showduplicates |sort -r

在启动的配置文件中添加国内的镜像仓库:

 vim /usr/lib/systemd/system/docker.service
...
ExecStart=/usr/bin/dockerd --registry-mirror https://qxx96o44.mirror.aliyuncs.com
...

启动docker:

systemctl start docker

Docker Registry

我们可以使用docker registry 作为我们的私有镜像仓库,当本地制作好镜像后,可以直接上传到镜像仓库中,方便其他主机拉取镜像。

在生产环境中,官方建议使用权威的CA证书,如果我们可以申请到公共的CA证书,就可以部署我们的共有镜像仓库。

也可以通过创建私有的证书,在需要访问仓库的主机上添加认证即可。

由于目前都是内部使用,加上服务器权限控制非常严格,所以这里直接使用免CA证书的方式(官方强烈不推荐)

修改registry配置为免CA模式,指定Registry服务器的域名或者IP地址,并指定访问端口(端口可任意,和registry容器端口映射上即可)

创建daemon.json:

 vim /etc/docker/daemon.json
{
  "insecure-registries" : ["192.168.60.18:5000"]
}

重启docker 服务:

systemctl restart docker

配置用户密码

mkdir auth

下载registry镜像,并配置账户密码:

docker run  --entrypoint htpasswd registry -Bbn trying 123123 > auth/htpasswd

这个命令会拉取registry镜像,以htpasswd的方式对密码进行加密,指定用户 trying 和密码123123,并将密码存在指定文件中。

启动容器仓库:

docker run -d -p 5000:5000 --restart=always --name registry_docker -v `pwd`/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry:2

指定容器的映射端口,容器启动时应用自动启动,指定一个数据卷,挂载验证文件htpasswd,并指定验证信息。

使用账号登录仓库,输入账号密码:

docker login 192.168.60.18:5000

推送本地镜像到仓库:

docker tag 256ab8c63c04 192.168.60.18:5000/self-registry:v1
docker push 192.168.60.18:5000/self-registry:v1

其他主机下载镜像:

在另外一台需要获取镜像的主机上配置registry为无CA模式:

 vim /etc/docker/daemon.json
{
  "insecure-registries" : ["192.168.60.18:5000"]
}

启动docker, 登录:

docker login 192.168.60.18:5000
docker pull 192.168.60.18:5000/self-registry:v1

拉取成功:

# docker images
REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
192.168.60.18:5000/self-registry   v1                  256ab8c63c04        About an hour ago   401 MB

补充说明:

1、内网的其他主机如果需要从本地仓库拉取镜像,都需要添加daemon.json的文件。

2、在registry的容器中,我们可以看到挂载的宿主机磁盘信息:

 # df -h
Filesystem                Size      Used Available Use% Mounted on
overlay                  80.0G      3.3G     76.7G   4% /
/dev/vda1                80.0G      3.3G     76.7G   4% /auth
/dev/vda1                80.0G      3.3G     76.7G   4% /etc/resolv.conf
/dev/vda1                80.0G      3.3G     76.7G   4% /etc/hostname
/dev/vda1                80.0G      3.3G     76.7G   4% /etc/hosts
/dev/vda1                80.0G      3.3G     76.7G   4% /var/lib/registry

在容器中,镜像的存放位置为/var/lib/registry/docker/registry/v2/repositories/  那么对应的宿主机目录是/var/lib/docker/image/

可以在启动registry时挂载宿主机上指定的目录到容器的/var/lib/registry上。

本文出自 “Trying” 博客,请务必保留此出处http://tryingstuff.blog.51cto.com/4603492/1948328

KVM客户机添加virsh console 虚拟终端支持及原理

最近研究学习Linux虚拟机KVM,母机安装的是Centos6.2 64位版本,虚拟机安装CentOS 6.0 32位版本。
启动virsh命令想通过console命令连接至客户机的终端,结果输入命令后终端卡在这个状态:

virsh # console 6.0-i386
Connected to domain 6.0-i386
Escape character is ^]
敲任何键都无响应,通过网上查询知道原来想通过console连接客户机终端还要在客户机上做相应的终端设置,才能使输出正确地输出到虚拟机管理程序的终端。

虚拟机设置步骤:

1、添加ttyS0的安全许可,允许root登录:
echo “ttyS0” >> /etc/securetty

2、在/etc/grub.conf文件中为内核添加参数:
console=ttyS0

3、在/etc/inittab中添加agetty:
S0:12345:respawn:/sbin/agetty ttyS0 115200

4、重启客户机:
reboot

此时,再次尝试console命令可以正常使用:

virsh # console 6.0-i386
Connected to domain 6.0-i386
Escape character is ^]

回车后键入tty,显示
/dev/ttyS0
显然虚拟管理程序的终端已经正常工作了。

原理:

securetty设置安全权限,允许root登录。
修改 grub.conf 让内核把输出定向至 ttyS0。
在inittab里加一个ttyS0在系统启动时会生成一个ttyS0来接收内核的数据。

关于终端的基本概念汇总:

tty(终端设备的统称):
tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被键盘与显示器取代,所以现在叫终端比较合适。
终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。

pty(伪终端,虚拟终端):
但是如果我们远程telnet到主机或使用xterm时不也需要一个终端交互么?是的,www.linuxidc.com 这就是虚拟终端pty(pseudo-tty)

pts/ptmx(pts/ptmx结合使用,进而实现pty):
pts(pseudo-terminal slave)是pty的实现方法,与ptmx(pseudo-terminal master)配合使用实现pty。

在Linux系统的设备特殊文件目录/dev/下,终端特殊设备文件一般有以下几种:
1、串行端口终端(/dev/ttySn)
串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。有段时间这些串行端口设备通常被称为终端设备,因为那时它的最大用途就是用来连接终端。这些串行端口所对应的设备名称是/dev/tts/0(或/dev/ttyS0), /dev/tts/1(或/dev/ttyS1)等,设备号分别是(4,0), (4,1)等,分别对应于DOS系统下的COM1、COM2等。若要向一个端口发送数据,可以在命令行上把标准输出重定向到这些特殊文件名上即可。例如,在命令行提示符下键入:echo test > /dev/ttyS1会把单词”test”发送到连接在ttyS1(COM2)端口的设备上。

2、伪终端(/dev/pty/)
伪终端(Pseudo Terminal)是成对的逻辑终端设备(即master和slave设备, 对master的操作会反映到slave上)。
例如/dev/ptyp3和/dev/ttyp3(或者在设备文件系统中分别是/dev/pty /m3和 /dev/pty/s3)。它们与实际物理设备并不直接相关。如果一个程序把ptyp3(master设备)看作是一个串行端口设备,则它对该端口的读/ 写操作会反映在该逻辑终端设备对应的另一个ttyp3(slave设备)上面。而ttyp3则是另一个程序用于读写操作的逻辑设备。telnet主机A就是通过“伪终端”与主机A的登录程序进行通信。

3、控制终端(/dev/tty)
如果当前进程有控制终端(Controlling Terminal)的话,那么/dev/tty就是当前进程的控制终端的设备特殊文件。可以使用命令”ps –ax”来查看进程与哪个控制终端相连。对于你登录的shell,/dev/tty就是你使用的终端,设备号是(5,0)。使用命令”tty”可以查看它具体对应哪个实际终端设备。/dev/tty有些类似于到实际所使用终端设备的一个联接。

4、控制台终端(/dev/ttyn, /dev/console)

在Linux 系统中,计算机显示器通常被称为控制台终端 (Console)。它仿真了类型为Linux的一种终端(TERM=Linux),并且有一些设备特殊文件与之相关联:tty0、tty1、tty2 等。当你在控制台上登录时,使用的是tty1。使用Alt+[F1—F6]组合键时,我们就可以切换到tty2、tty3等上面去。tty1–tty6等称为虚拟终端,而tty0则是当前所使用虚拟终端的一个别名,系统所产生的信息会发送到该终端上(这时也叫控制台终端)。因此不管当前正在使用哪个虚拟终端,系统信息都会发送到控制台终端上。/dev/console即控制台,是与操作系统交互的设备,系统将一些信息直接输出到控制台上。目前只有在单用户模式下,才允许用户登录控制台。

5 虚拟终端(/dev/pts/n)
在Xwindows模式下的伪终端.如我在Kubuntu下用konsole,就是用的虚拟终端,用tty命令可看到/dev/pts/1。

6 其它类型
Linux系统中还针对很多不同的字符设备存在有很多其它种类的终端设备特殊文件。例如针对ISDN设备的/dev/ttyIn终端设备等。这里不再赘述。

tty设备包括虚拟控制台,串口以及伪终端设备。
/dev/tty代表当前tty设备,在当前的终端中输入 echo “hello” > /dev/tty ,都会直接显示在当前的终端中。