0%

Mac下常用插件

1
2
3
4
5
6
7
8
9
10
1、vscode-icons:根据文件不同类型,显示不同图标
(1)安装后激活:shift + command + p
(2)激活vscode-icons

2、Project Manager:管理多个项目
(1)首先save项目:shift + command + p --> Project Manager Save Project
(2)可以编辑:shift + command + p --> Project Manager Edit Project
(3)列出所有项目,在不同的项目之间切换:alt + command + p

3、Code Runner:快速运行测试代码的插件

对于redis的用处不必多说,互联网上有很多资料。文章只做为笔记使用,记录redis操作与学习过程。

redis安装

安装redis很简单,https://redis.io/download官方文档有教程。

1
[root@centos ~]# wget http://download.redis.io/releases/redis-5.0.3.tar.gz && tar xzf redis-5.0.3.tar.gz && cd redis-5.0.3 && make && make install

redis启动方式

非守护进程启动方式

1
2
3
4
[root@centos ~]# redis-server

或者传递一些配置参数
[root@centos ~]# redis-server --port 6380

守护进程启动方式

1
2
3
4
5
6
7
8
9
10
11
12
13
配置文件中开启daemonize yes
[root@centos ~]# redis-server <configPath>

[root@centos ~]# mkdir -p /var/log/redis
[root@centos redis-5.0.3]# vim myredis.conf
port 6379
daemonize yes
logfile "redis.log"
dir "/var/log/redis"

[root@centos redis-5.0.3]# redis-server ./myredis.conf
[root@centos ~]# ps -ef | grep redis
root 2447 1 0 11:01 ? 00:00:00 redis-server *:6379

redis常用配置

1
2
3
4
5
6
daemonize	是否是守护进程(no|yes)
port redis对外端口号
logfile redis系统日志
dir redis工作目录

redis默认端口是6379

从默认配置文件中导出常用的配置项

1
2
去掉"#",去掉空格
[root@centos redis-5.0.3]# cat redis.conf | grep -v "#" | grep -v "^$" > myredis.conf

redis API

通过redis-cli命令进入客户端,测试API

通用命令

通用命令

keys [pattern](一般不在生产环境使用,O(n),redis单线程会阻塞其他命令)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> set php good
OK
127.0.0.1:6379> set java best
OK
127.0.0.1:6379> keys *
1) "hello"
2) "java"
3) "php"

127.0.0.1:6379> mset 1 1 2 2 3 3 4 4 5 5 12 12 13 13 123 123 1234 1234
OK
127.0.0.1:6379> keys 1*
1) "1"
2) "12"
3) "13"
4) "123"
5) "1234"
127.0.0.1:6379> keys 1[2-3]*
1) "12"
2) "13"
3) "123"
4) "1234"
127.0.0.1:6379> keys 12?
1) "123"

dbsize

1
2
3
4
5
6
7
8
9
10
11
12
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> set php good
OK
127.0.0.1:6379> set java best
OK
127.0.0.1:6379> keys *
1) "hello"
2) "java"
3) "php"
127.0.0.1:6379> dbsize
(integer) 3

exists key

1

del key [key …]

1

expire key seconds

1

type key

1

数据结构和内部编码

单线程架构

字符串类型

1

哈希类型

1

列表类型

1

集合类型

1

有序集合类型

1

NFS

NFS(Network File System)是Linux系统之间(类Unix系统之间)使用最为广泛的文件共享协议,不同于ftp或http,需要将文件下载后使用,NFS方式的共享是可以直接使用而不需要下载的。

NFS协议

参考Wiki

NFSv1

只在SUN公司内部用作实验目的

NFSv2

  • 基于UDP
  • 由于 32-bit 的限制,NFSv2 只允读写文件起始2G大小的内容

NFSv3

其主要目的是解决NFSv2进行同步写操作的性能问题。

  • 支持 64 bit 文件大小和偏移量,即突破 2GB 文件大小的限制
  • 支持服务端的异步写操作,提升写入性能
  • 在许多响应报文中额外增加文件属性,避免用到这些属性时重新获取
  • 增加READDIRPLUS调用,用于在遍历目录时获取文件描述符和文件属性
  • 增加了将TCP作为传输层的支持

NFSv4

协议的实现/开发工作不再是由SUN公司主导开发,而是改为由互联网工程任务组(IETF)开发。

  • 性能提升
  • 强制安全策略
  • 引入有状态的协议

NFSv4.1

  • 为并行访问可横向扩展的集群服务(pNFS扩展)提供协议支持

NFSv4.2

NFSv4.2 当前正在开发中

如何使用

假设一个Unix风格的场景,其中一台计算机(客户端)需要访问存储在其他机器上的数据(NFS 服务器):

1、服务端实现 NFS 守护进程,默认运行 nfsd,用来使得数据可以被客户端访问。
2、服务端系统管理员可以决定哪些资源可以被访问,导出目录的名字和参数,通常使用 /etc/exports 配置文件 和 exportfs 命令。
3、服务端安全-管理员保证它可以组织和认证合法的客户端。
4、服务端网络配置保证可以跟客户端透过防火墙进行协商。
5、客户端请求导出的数据,通常调用一个 mount 命令。
6、如果一切顺利,客户端的用户就可以通过已经挂载的文件系统查看和访问服务端的文件了。
提醒:NFS自动挂载可以通过—可能是 /etc/fstab 或者自动安装管理进程。

环境信息

NFS服务端IP地址为:192.168.56.101

NFS客户端IP地址为:192.168.56.240

NFS服务端

1、在Centos7上安装软件包

1
[root@centos ~]# yum install -y nfs-utils rpcbind

2、创建共享目录并更改权限

1
2
3
4
5
[root@centos ~]# mkdir /var/nfsshare && chmod -R 755 /var/nfsshare

[root@centos ~]# chown nfsnobody:nfsnobody /var/nfsshare
[root@centos ~]# ll -l /var/
drwxr-xr-x. 2 nfsnobody nfsnobody 6 1月 9 10:41 nfsshare

3、启动服务并设置开机自启

1
2
3
4
5
6
7
[root@centos ~]# systemctl enable rpcbind && systemctl enable nfs-server && systemctl enable nfs-lock && systemctl enable nfs-idmap && systemctl start rpcbind && systemctl start nfs-server && systemctl start nfs-lock && systemctl start nfs-idmap

重启所有服务命令
[root@centos ~]# systemctl enable rpcbind && systemctl enable nfs-server && systemctl enable nfs-lock && systemctl enable nfs-idmap && systemctl restart rpcbind && systemctl restart nfs-server && systemctl restart nfs-lock && systemctl restart nfs-idmap

无需重启NFS服务,使exports文件生效
[root@centos ~]# exportfs -ra

4、编辑/etc/exports文件,通过网络共享NFS目录

1
注意:192.168.56.240是NFS客户端IP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@centos ~]# vi /etc/exports
/var/nfsshare 192.168.56.240(rw,sync,no_root_squash,no_all_squash)
/home 192.168.56.240(rw,sync,no_root_squash,no_all_squash)

# 配置文件分三段
# 第一段是将要共享出去的本地目录
# 第二段是允许访问的主机(可以是一个IP也可以是一个IP段192.168.56.0/24)
# 第三段是权限

客户端 示例
使用IP地址指定单一主机 10.20.30.40
使用IP地址指定范围主机 172.16.0.0/16
使用IP地址指定范围主机 192.168.1.*
使用域名指定单一主机 Test.ice.apple
使用域名指定范围主机 *.ice.apple
使用通配符指定所有主机 *

参数 说明
ro 设置共享权限为只读
rw 设置共享权限为读写
root_squash 共享目录的使用者是root时,将被映射为匿名账号(nobody)
no_root_squash 当使用NFS服务器共享目录的使用者是root时,将不被映射为匿名账号
all_squash 将所有使用NFS服务器共享目录的使用者都映射为匿名账号
anonuid 设置匿名账号的UID
anongid 设置匿名账号的GID
sync 将数据同步写入内存和硬盘。这可能导致效率降低
async 先将数据保存在内存中,而不是直接保存在硬盘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
选项含义:
rw 允许对共享目录进行读写
sync 实时同步共享目录
no_root_squash 允许root访问
no_all_squash 允许用户授权

默认选项如下:
ro 只读共享
sync 所有操作返回前必须已经写入磁盘
wdelay 延迟写操作,等待更多的写操作一起执行
root_squash 防止远程root用户使用root权限对共享进行访问。NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,拥有匿名用户权限,通常他将使用nobody或nfsnobody身份。

常用选项:
rw 读写共享
async 操作可以延迟写入硬盘,立即响应,可提高速度
no_wdelay 关闭写延迟,需要与sync选项同时使用
no_root_squash 关闭root_squash,NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,也拥有root权限。显然开启这项是不安全的。
secure 此选项要求请求源自小于IPPORT_RESERVED(1024)的Internet端口。限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置)
insecure 此选项接受所有端口,允许客户端从大于1024的tcp/ip端口连接服务器

5、重启服务

1
[root@centos ~]# systemctl restart nfs-server

6、修改防火墙

1
2
3
4
[root@centos ~]# firewall-cmd --permanent --zone=public --add-service=nfs
[root@centos ~]# firewall-cmd --permanent --zone=public --add-service=mountd
[root@centos ~]# firewall-cmd --permanent --zone=public --add-service=rpc-bind
[root@centos ~]# firewall-cmd --reload
1
2
3
4
挂载选项:
ro 只读挂载
rw 读写挂载
vers=4 指定使用NFSv4方式挂载

NFS客户端

1、在Centos7上安装软件包

1
[root@docker ~]# yum install -y nfs-utils

2、创建NFS挂载点

1
2
[root@docker ~]# mkdir -p /mnt/nfs/home
[root@docker ~]# mkdir -p /mnt/nfs/var/nfsshare

3、挂载服务端的NFS共享目录到客户端

1
2
[root@docker ~]# mount -t nfs 192.168.56.101:/home /mnt/nfs/home/
[root@docker ~]# mount -t nfs 192.168.56.101:/var/nfsshare /mnt/nfs/var/nfsshare/

4、检查

1
2
3
4
[root@docker ~]# df -Tkh
文件系统 类型 容量 已用 可用 已用% 挂载点
192.168.56.101:/home nfs4 17G 4.6G 13G 27% /mnt/nfs/home
192.168.56.101:/var/nfsshare nfs4 17G 4.6G 13G 27% /mnt/nfs/var/nfsshare

5、读写文件

在客户端向挂载点写入文件

1
2
3
4
[root@docker ~]# touch /mnt/nfs/var/nfsshare/test_nfs
[root@docker ~]# ll /mnt/nfs/var/nfsshare/
总用量 0
-rw-r--r--. 1 root root 0 1月 9 11:01 test_nfs

在服务端检查写入的文件

1
2
3
[root@centos ~]# ll /var/nfsshare/
总用量 0
-rw-r--r--. 1 root root 0 1月 9 11:01 test_nfs

参考文章

1
【1】https://www.linuxidc.com/Linux/2013-10/91137.htm

Ceph中的单元测试使用的是Google Test,嵌入到Ceph源码中。Google Test的使用这里有一篇入门文章,大体思路讲的很清晰。我们主要重心是如何在Ceph源码中添加单元测试。

在添加之前我们先读一下已经存在的单元测试,在代码中不同的单元测试实现方式不同,可能按照以下Demo无法完全复制,但是慢慢看代码总会理解的。我们挑一个最简单的,不讲解详细测试内容(因为涉及知识较多,目前我还无法完全理解)。

下面我们以ceph_test_filejournal为例,它存在于ceph-test*.rpm包中,在打社区版Ceph rpm包时(根据ceph.spec)会生成出来《ceph build rpm》,在我们的被测Ceph节点上安装该rpm,会在/usr/bin/目录中找到ceph_test_filejournal(其实会有很多类似ceph_test_的二进制文件,这些都是Ceph的单元测试)。

CMakeLists

单元测试总CMakeLists文件位置在src/test/CMakeLists.txt,如果想自己编写测试代码添加到测试集中,需要修改这个CMakeLists。在社区Ceph我们编译出来可执行测试二进制ceph_test_*,都是在这里通过CMakeLists add_executable定义的。

单元测试代码位置

1
2
3
add_executable(ceph_test_filejournal
test_filejournal.cc
)

add_executable中同时定义了测试代码源文件test_filejournal.cc

1
::testing::InitGoogleTest(&argc, argv);

参考

【1】http://www.yeolar.com/note/2014/12/21/gtest/#id15

【2】https://www.ibm.com/developerworks/cn/aix/library/au-googletestingframework.html

安装ansible 2.4.2

使用yum安装指定版本的ansible

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@cephJ ~]# yum -h | grep show
--showduplicates 在 list/search 命令下,显示源里重复的条目

[root@cephJ ~]# yum --showduplicates list ansible
已加载插件:fastestmirror, priorities
Loading mirror speeds from cached hostfile
* base: mirrors.cn99.com
* epel: www.ftp.ne.jp
* extras: mirrors.nwsuaf.edu.cn
* nux-dextop: li.nux.ro
* updates: mirrors.nwsuaf.edu.cn
12 packages excluded due to repository priority protections
可安装的软件包
ansible.noarch 2.4.2.0-2.el7 extras
ansible.noarch 2.7.5-1.el7 epel

### sudo yum install <package name>-<version info>
[root@cephJ ~]# sudo yum install -y ansible-2.4.2.0

[root@cephJ ~]# ansible --version
ansible 2.4.2.0
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]

配置ceph-ansible

准备四台机器

1
2
3
4
5
6
7
ansible节点
ansible-master

ceph节点
ansible-ceph-1
ansible-ceph-2
ansible-ceph-3

配置ansible

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
ansible节点执行

1、首先clone代码
[root@ansible-master ~]# git clone https://github.com/ceph/ceph-ansible.git && cd ceph-ansible/

2、创建本地分支并切换分支
[root@ansible-master ceph-ansible]# git checkout -b myv3.2.0 v3.2.0

3、copy模板文件
[root@ansible-master ceph-ansible]# cp site.yml.sample site.yml

4、修改ansible机器清单(inventory)
[root@ansible-master ~]# vim /etc/ansible/hosts
[mons]
ansible-ceph-[1:3] ansible_ssh_pass=yujiang2
[osds]
ansible-ceph-[1:3] ansible_ssh_pass=yujiang2
[rgws]
ansible-ceph-[1:3] ansible_ssh_pass=yujiang2
[mgrs]
ansible-ceph-[1:3] ansible_ssh_pass=yujiang2

5、批量推送sshkey
[root@ansible-master ~]# ssh-keygen -t rsa
[root@ansible-master ~]# cat push-ssh.yaml
- hosts: all
user: root
tasks:
- name: ssh-key-copy
authorized_key: user=root key="{{ lookup('file','/root/.ssh/id_rsa.pub')}}"
tags:
- sshkey

[root@ansible-master ~]# ansible-playbook push-ssh.yaml
ansible-ceph-1 : ok=2 changed=1 unreachable=0 failed=0
ansible-ceph-2 : ok=2 changed=1 unreachable=0 failed=0
ansible-ceph-3 : ok=2 changed=1 unreachable=0 failed=0

6、安装pip并安装ceph-ansible依赖
[root@ansible-master ~]# curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py" && python get-pip.py && pip install --upgrade setuptools
[root@ansible-master ceph-ansible]# pip install -r requirements.txt

7、修改ansible变量
[root@ansible-master group_vars]# pwd
/root/ceph-ansible/group_vars

[root@ansible-master group_vars]# cp all.yml.sample all.yml && cp osds.yml.sample osds.yml && cp mgrs.yml.sample mgrs.yml

all.yml修改如下:
mon_group_name: mons
osd_group_name: osds
ntp_daemon_type: chronyd
ceph_origin: repository
ceph_repository: community
ceph_mirror: http://mirrors.163.com/ceph
ceph_stable_key: http://mirrors.163.com/ceph/keys/release.asc
ceph_stable_release: luminous
ceph_stable_repo: "{{ ceph_mirror }}/rpm-{{ ceph_stable_release }}/el7/x86_64"
monitor_interface: eth0
public_network: 192.168.0.0/24
cluster_network: 192.168.0.0/24
radosgw_interface: eth0
radosgw_address: 0.0.0.0

osds.yml修改如下:
copy_admin_key: true
devices:
- /dev/vdb
osd_scenario: collocated

mgrs.yml修改如下:
ceph_mgr_modules: [status,dashboard]

8、执行ansible开始部署ceph,部署哪些模块会在/etc/ansible/hosts中定义(下面是我们之前定义的),如果在该文件中没有对应模块定义,ansible会忽略该模块的部署。
[mons]
ansible-ceph-[1:3] ansible_ssh_pass=yujiang2
[osds]
ansible-ceph-[1:3] ansible_ssh_pass=yujiang2
[rgws]
ansible-ceph-[1:3] ansible_ssh_pass=yujiang2
[mgrs]
ansible-ceph-[1:3] ansible_ssh_pass=yujiang2

9、修改ansible host_key_checking
[root@ansible-master ~]# vim /etc/ansible/ansible.cfg
[defaults]
host_key_checking = False

[root@ansible-master ceph-ansible]# pwd
/root/ceph-ansible
[root@ansible-master ceph-ansible]# ansible-playbook site.yml
PLAY RECAP *******************************************************************************************************************************************************************************************************************************************************************
ansible-ceph-1 : ok=310 changed=17 unreachable=0 failed=0
ansible-ceph-2 : ok=287 changed=17 unreachable=0 failed=0
ansible-ceph-3 : ok=289 changed=20 unreachable=0 failed=0

INSTALLER STATUS *************************************************************************************************************************************************************************************************************************************************************
Install Ceph Monitor : Complete (0:00:37)
Install Ceph Manager : Complete (0:01:05)
Install Ceph OSD : Complete (0:00:38)
Install Ceph RGW : Complete (0:00:30)

Ceph的对象存储服务中有网站托管服务,需要结合DNS来做配合。所以想借此机会了解一下DNS服务,DNS开源软件中最有名的当属BIND。那么如果搭建该服务?如何与Ceph的对象存储服务radosgateway对接?这两个课题是需要来实验的。这篇文章不包括DNS理论,因为在网络上有很多,可以自己google一下。本篇文章主要是:如果搭建BIND服务,以实践为主,我在网络上找到一篇英文文章,是关于BIND在centos7上搭建的,如果英文可以请看原文

下面我们就来验证一下BIND的搭建:

Introduction 介绍

通过设置适当的域名系统(DNS, Domain Name System),可以按名称查找network interfaces和IP地址,这使得管理server configuration和infrastructure变得更容易。在本教程中,我们将使用CentOS 7上的BIND name servers软件(BIND9)来讨论如何设置内部DNS服务器,Virtual Private Servers (VPS) 可以使用它来解析private host names和private IP地址。这是管理内部多主机hostnames和私有IP地址时必不可少的。

可以在此处找到本教程的Ubuntu版本

Prerequisites 先决条件

要完成本教程,您需要以下内容:

  • 同一datacenter,并运行在同一private networking下的多台server(可以是虚拟机)
  • Primary DNS server,ns1
  • Secondary DNS server,ns2
  • Root访问以上所有内容(steps 1-4 here

如果您不熟悉DNS概念,建议您阅读Introduction to Managing DNS

Example Hosts 示例主机

出于示例目的,我们将假设以下内容:

  • 我们有两个现有的VPS叫做”host1”和”host2”
  • 两个VPS都存在于nyc3 datacenter
  • 两个VPS都启用了private networking(并且位于10.128.0.0/16子网上)
  • 两个VPS都与我们在”example.com”上运行的Web应用程序有某种关联

有了这些假设,我们使用”nyc3.example.com”来参考我们的private subnet或zone的命名方案。因此,host1的private Fully-Qualified Domain Name (FQDN) 将为”host1.nyc3.example.com”。

请参阅下表中的相关详细信息:

Host Role Private FQDN Private IP Address
host1 Generic Host 1 host1.nyc3.example.com 10.128.100.101
host2 Generic Host 2 host2.nyc3.example.com 10.128.200.102

注意:自己的实验环境将有所不同,示例中的名称和IP地址只是用于演示如何配置DNS server以提供内部DNS服务。您应该设置适合自己环境的host names和private IP addresses。没有必要在命名方案中使用datacenter的region名称,但我们在此处使用它来表示这些主机属于特定datacenter的private network。如果您使用多个datacenters,则可以在每个相应的datacenter内设置内部DNS。

Our Goal 我们的目标

在本教程结束时,我们将有一个primary DNS server(ns1),以及可选的secondary DNS server(ns2,它将用作备份)。

这是一个包含示例名称和IP地址的表:

Host Role Private FQDN Private IP Address
ns1 Primary DNS Server ns1.nyc3.example.com 10.128.10.11
ns2 Secondary DNS Server ns2.nyc3.example.com 10.128.20.12

让我们开始安装我们的Primary DNS server,ns1。

Install BIND on DNS Servers 在DNS服务器上安装BIND

注意:以红色突出显示的文本很重要! 它通常用于表示需要用您自己的设置替换的内容,或者应该修改或添加到配置文件中的内容。(红色字体我会标注red,全文搜索red就可以)例如,如果您看到类似host1.nyc3.example.com(red)的内容,请将其替换为您自己服务器的FQDN。同样,如果您看到host1_private_IP(red),请将其替换为您自己服务器的private IP地址。

在两个DNS服务器ns1和ns2上,使用yum安装BIND:

1
sudo yum install -y bind bind-utils

现在已经安装了BIND,让我们配置primary DNS server。

Configure Primary DNS Server 配置主DNS服务器

BIND的配置由多个文件组成,这些文件包含在主配置文件named. conf中。 这些文件名以“named”开头,因为这是BIND运行时进程的名称。 我们将从配置options文件开始。

Configure Bind 配置Bind

BIND的进程名为named,因此,许多文件以”named”命名,而不是”BIND”。

在ns1上,打开named.conf文件进行编辑:

1
sudo vi /etc/named.conf

在现有options block上方,创建一个名为”trusted”的新ACL block。在这里我们将定义允许递归查询DNS的客户端列表(即与ns1位于同一datacenter的服务器)。使用我们的示例private IP地址,我们将ns1,ns2,host1和host2的IP添加到可信客户端列表中:

1
2
3
4
5
6
7
8
/etc/named.conf — 1 of 4

acl "trusted" {
10.128.10.11; # ns1 - can be set to localhost
10.128.20.12; # ns2
10.128.100.101; # host1
10.128.200.102; # host2
};

我们有了可信DNS客户端列表,我们将要编辑options block。将ns1的private IP添加到listen-on port 53指令中,并注释掉listen-on-v6行:

1
2
3
4
5
6
/etc/named.conf — 2 of 4

options {
listen-on port 53 { 127.0.0.1; 10.128.10.11; };
# listen-on-v6 port 53 { ::1; };
...

在这些条目下面,将allow-transfer指令从”none”更改为ns2的private IP地址。另外,将allow-query指令从”localhost”更改为”trusted”:

1
2
3
4
5
6
7
8
9
/etc/named.conf — 3 of 4

...
options {
...
allow-transfer { 10.128.20.12; }; # disable zone transfers by default
...
allow-query { trusted; }; # allows queries from "trusted" clients
...

在文件末尾,添加以下行:

1
2
3
/etc/named.conf — 4 of 4

include "/etc/named/named.conf.local";

现在保存并退出named.conf。上述配置指定只有您自己的服务器(”trusted”服务器)才能查询DNS服务器。

接下来,我们将配置local文件,以指定我们的DNS zones。

Configure Local File 配置Local文件

在ns1上,打开named.conf.local文件以进行编辑:

1
sudo vi /etc/named/named.conf.local

该文件应为空。 在这里,我们将指定forward和reverse zones。

使用以下行添加forward zone(替换您自己的zone名称):

1
2
3
4
5
6
/etc/named/named.conf.local — 1 of 2

zone "nyc3.example.com" {
type master;
file "/etc/named/zones/db.nyc3.example.com"; # zone file path
};

假设我们的private subnet是10.128.0.0/16,请使用以下行添加reverse zone(请注意,我们的reverse zone名称以”128.10”开头,这是”10.128”的八位字节反转,octet reversal of “10.128”)

1
2
3
4
5
6
/etc/named/named.conf.local — 2 of 2

zone "128.10.in-addr.arpa" {
type master;
file "/etc/named/zones/db.10.128"; # 10.128.0.0/16 subnet
};

如果您的服务器跨多个private subnets但位于同一datacenter,请确保为每个不同的subnet指定一个额外的zone和zone文件。添加完所有所需zone后,保存并退出named.conf.local文件。

既然我们的zone是在BIND中指定的,我们需要创建相应的forward和reverse zone文件。

Create Forward Zone File 创建Forward Zone文件

forward zone文件中,我们为正向DNS查找定义了DNS records(记录)。也就是说,当DNS收到名称查询(例如”host1.nyc3.example.com”)时,它将查找forward zone文件以解析host1的相应private IP地址。

创建我们的zone文件。根据我们的named.conf.local配置,该位置应为/etc/named/zones:

1
2
sudo chmod 755 /etc/named
sudo mkdir /etc/named/zones

现在让我们编辑我们的forward zone文件:

1
sudo vi /etc/named/zones/db.nyc3.example.com

首先,您需要添加SOA record(记录)。将突出显示的ns1 FQDN替换为您自己的FQDN,然后将第二个”nyc3.example.com”替换为您自己的domain。 每次编辑zone文件时,都应该在重新启动named进程之前增加serial值 —— 我们将它增加到”3”。它应该看起来像这样:

1
2
3
4
5
6
7
8
/etc/named/zones/db.nyc3.example.com — 1 of 3

@ IN SOA ns1.nyc3.example.com. admin.nyc3.example.com. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL

之后,使用以下行添加您的nameserver records(替换自己的名称nyc3.example.com.)。请注意,第二列指定这些是”NS” records(记录):

1
2
3
4
5
/etc/named/zones/db.nyc3.example.com — 2 of 3

; name servers - NS records
IN NS ns1.nyc3.example.com.
IN NS ns2.nyc3.example.com.

然后为属于此zone的主机添加A记录。 这包括我们希望以”.nyc3.example.com” 结尾的名称的任何服务器(替换名称和private IP地址)。使用我们的示例名称和private IP地址,我们将为ns1,ns2,host1和host2添加A记录,如下所示:

1
2
3
4
5
6
7
8
9
/etc/named/zones/db.nyc3.example.com — 3 of 3

; name servers - A records
ns1.nyc3.example.com. IN A 10.128.10.11
ns2.nyc3.example.com. IN A 10.128.20.12

; 10.128.0.0/16 - A records
host1.nyc3.example.com. IN A 10.128.100.101
host2.nyc3.example.com. IN A 10.128.200.102

保存并退出db.nyc3.example.com文件。

我们的最终示例forward zone文件如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/etc/named/zones/db.nyc3.example.com — complete

$TTL 604800
@ IN SOA ns1.nyc3.example.com. admin.nyc3.example.com. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
; name servers - NS records
IN NS ns1.nyc3.example.com.
IN NS ns2.nyc3.example.com.

; name servers - A records
ns1.nyc3.example.com. IN A 10.128.10.11
ns2.nyc3.example.com. IN A 10.128.20.12

; 10.128.0.0/16 - A records
host1.nyc3.example.com. IN A 10.128.100.101
host2.nyc3.example.com. IN A 10.128.200.102

现在让我们转到reverse zone文件。

Create Reverse Zone File(s) 创建Reverse Zone文件

Reverse zone文件是我们为反向DNS查找定义DNS PTR记录的地方。也就是说,当DNS通过IP地址(例如”10.128.100.101”)接收查询时,它将查看reverse zone文件以解析相应的FQDN,在这种情况下查询结果为”host1.nyc3.example.com”。

在ns1上,对于named.conf.local文件中指定的每个reverse zone,都创建一个reverse zone文件。

编辑与named.conf.local中定义的reverse zone对应的reverse zone文件:

1
sudo vi /etc/named/zones/db.10.128

与forward zone文件相同的方式,将突出显示的ns1 FQDN替换为您自己的FQDN,然后将第二个”nyc3.example.com”替换为您自己的domain。每次编辑zone文件时,都应该在重新启动named进程之前递增serial值 —— 我们将其增加到”3”。 它应该看起来像这样:

1
2
3
4
5
6
7
8
/etc/named/zones/db.10.128 — 1 of 3

@ IN SOA ns1.nyc3.example.com. admin.nyc3.example.com. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL

之后,使用以下行添加您的nameserver records(用您自己的名称替换)。 请注意,第二列指定这些是”NS”记录:

1
2
3
4
5
/etc/named/zones/db.10.128 — 2 of 3

; name servers - NS records
IN NS ns1.nyc3.example.com.
IN NS ns2.nyc3.example.com.

然后为所有服务器添加PTR记录,这些服务器的IP地址位于您正在编辑的zone文件的subnet上。在我们的示例中,这包括我们所有的主机,因为它们都在10.128.0.0/16 subnet上。请注意,第一列包含服务器private IP地址的最后两个八位字节,顺序相反。请务必替换名称和private IP地址以匹配您的服务器:

1
2
3
4
5
6
7
/etc/named/zones/db.10.128 — 3 of 3

; PTR Records
11.10 IN PTR ns1.nyc3.example.com. ; 10.128.10.11
12.20 IN PTR ns2.nyc3.example.com. ; 10.128.20.12
101.100 IN PTR host1.nyc3.example.com. ; 10.128.100.101
102.200 IN PTR host2.nyc3.example.com. ; 10.128.200.102

保存并退出reverse zone文件(如果需要添加更多reverse zone文件,请重复此部分)。

我们的最终示例反向区域文件如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/etc/named/zones/db.10.128 — complete

$TTL 604800
@ IN SOA nyc3.example.com. admin.nyc3.example.com. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
; name servers
IN NS ns1.nyc3.example.com.
IN NS ns2.nyc3.example.com.

; PTR Records
11.10 IN PTR ns1.nyc3.example.com. ; 10.128.10.11
12.20 IN PTR ns2.nyc3.example.com. ; 10.128.20.12
101.100 IN PTR host1.nyc3.example.com. ; 10.128.100.101
102.200 IN PTR host2.nyc3.example.com. ; 10.128.200.102

Check BIND Configuration Syntax 检查BIND配置语法

运行以下命令以检查named.conf *文件的语法:

1
sudo named-checkconf

如果您的named配置文件没有语法错误,您将返回shell提示符并且看不到任何错误消息。 如果配置文件有问题,请检查error message和Configure Primary DNS Server section,然后再次尝试named-checkconf。

named-checkzone命令可用于检查zone文件的正确性。 其第一个参数指定zone名称,第二个参数指定相应的zone文件,这两个文件都在named.conf.local中定义。

例如,要检查”nyc3.example.com”的forward zone配置,请运行以下命令(更改名称以匹配你自己的forward zone和文件):

1
sudo named-checkzone nyc3.example.com /etc/named/zones/db.nyc3.example.com

要检查”128.10.in-addr.arpa”的reverse zone配置,请运行以下命令(更改数字以匹配你自己的reverse zone和文件):

1
sudo named-checkzone 128.10.in-addr.arpa /etc/named/zones/db.10.128

当所有配置和zone文件都没有错误时,您应该重新启动BIND服务。

Start BIND 启动BIND

启动BIND:

1
sudo systemctl start named

如果你想在OS启动时自动启动BIND服务,请执行:

1
sudo systemctl enable named

您的primary DNS服务器现已设置好并可以响应DNS查询了。 让我们继续创建secondary DNS服务器。

Configure Secondary DNS Server 配置备用DNS服务器

在大多数环境中,最好设置secondary DNS服务器,以便在primary服务器不可用时响应请求。幸运的是,secondary DNS服务器更容易配置。

在ns2上,编辑named.conf文件:

1
sudo vi /etc/named.conf
1
注意:如果您希望跳过这些说明,可以复制ns1的named.conf文件并对其进行修改以侦听ns2的private IP地址,and not allow transfers。

在现有options block上方,创建一个名为”trusted”的新ACL block。在这里我们将定义允许递归DNS查询的客户端列表(即与ns1位于同一datacenter的服务器)。使用我们的示例private IP地址,我们将ns1,ns2,host1和host2添加到trusted(可信)客户端列表中:

1
2
3
4
5
6
7
8
/etc/named.conf — 1 of 4

acl "trusted" {
10.128.10.11; # ns1 - can be set to localhost
10.128.20.12; # ns2
10.128.100.101; # host1
10.128.200.102; # host2
};

现在我们有了trusted(可信)DNS客户端列表,我们将要编辑options block。将ns1的private IP地址添加到listen-on port 53指令,并注释掉listen-on-v6行:

1
2
3
4
5
6
/etc/named.conf — 2 of 4

options {
listen-on port 53 { 127.0.0.1; 10.128.20.12; };
# listen-on-v6 port 53 { ::1; };
...

将allow-query指令从”localhost”更改为”trusted”:

1
2
3
4
5
6
7
/etc/named.conf — 3 of 4

...
options {
...
allow-query { trusted; }; # allows queries from "trusted" clients
...

在文件末尾,添加以下行:

1
2
3
/etc/named.conf — 4 of 4

include "/etc/named/named.conf.local";

现在保存并退出named.conf。 上述配置指定只有您自己的服务器(”trusted”服务器)才能查询您的DNS服务。

接下来,我们将配置local文件,以指定我们的DNS zones。

保存并退出named.conf。

现在编辑named.conf.local文件:

1
2
sudo chmod 755 /etc/named
sudo vi /etc/named/named.conf.local

定义与primary DNS服务器上的master zones对应的slave zones。请注意,类型是”slave”,文件不包含路径,并且有一个masters指令应该设置为primary DNS服务器的private IP。如果您在primary DNS服务器中定义了多个reverse zones,请确保在此处全部添加它们:

1
2
3
4
5
6
7
8
9
10
11
12
13
/etc/named/named.conf.local

zone "nyc3.example.com" {
type slave;
file "slaves/db.nyc3.example.com";
masters { 10.128.10.11; }; # ns1 private IP
};

zone "128.10.in-addr.arpa" {
type slave;
file "slaves/db.10.128";
masters { 10.128.10.11; }; # ns1 private IP
};

现在保存并退出named.conf.local。

运行以下命令以检查配置文件的有效性:

1
sudo named-checkconf

检查后,启动BIND:

1
sudo systemctl start named

如果你想在OS启动时自动启动BIND服务,请执行:

1
sudo systemctl enable named

现在,您拥有用于private network名称和IP地址解析的primary DNS服务器和secondary DNS服务器。 现在,您必须配置客户端服务器以使用您的private DNS服务器。

Configure DNS Clients 配置DNS客户端

在”trusted” ACL中的所有服务器都可以查询DNS服务器之前,必须将客户端服务器配置为使用ns1和ns2作为nameservers。 此过程因操作系统而异,但对于大多数Linux发行版,它涉及将name servers添加到/etc/resolv.conf文件中。

CentOS Clients

在CentOS,RedHat和Fedora Linux VPS上,只需编辑resolv.conf文件:

1
sudo vi /etc/resolv.conf

然后将以下行添加到文件的顶部(替换您的private domain,以及ns1和ns2 private IP地址):

1
2
3
4
5
/etc/resolv.conf

search nyc3.example.com # your private domain
nameserver 10.128.10.11 # ns1 private IP address
nameserver 10.128.20.12 # ns2 private IP address

现在保存并退出。 客户端现在已经配置为使用您自己的DNS服务器。

Ubuntu Clients

在Ubuntu和Debian Linux VPS上,您可以编辑head文件,该文件在启动时附加到resolv.conf:

1
sudo vi /etc/resolvconf/resolv.conf.d/head

将以下行添加到文件中(替换您的private domain,以及ns1和ns2 private IP地址):

1
2
3
4
5
/etc/resolvconf/resolv.conf.d/head

search nyc3.example.com # your private domain
nameserver 10.128.10.11 # ns1 private IP address
nameserver 10.128.20.12 # ns2 private IP address

现在运行resolvconf以生成新的resolv.conf文件:

1
sudo resolvconf -u

客户端现在已经配置为使用您自己的DNS服务器。

Test Clients

使用nslookup —— 包含在”bind-utils”包中 —— 测试您的客户端是否可以查询您的name servers。您应该能够在已配置在”trusted” ACL中的所有客户端上执行此操作。

Forward Lookup

例如,我们可以通过运行以下命令来执行forward(正向)查找以检索host1.nyc3.example.com的IP地址:

1
nslookup host1

查询”host1”会扩展为”host1.nyc3.example.com”,因为搜索选项设置为您的private subdomain,在查找其他DNS server之前,DNS查询将尝试查看该subdomain。上面命令的输出如下所示:

1
2
3
4
5
6
Output:
Server: 10.128.10.11
Address: 10.128.10.11#53

Name: host1.nyc3.example.com
Address: 10.128.100.101

Reverse Lookup

要测试reverse(反向)查找,请使用host1的private IP地址查询DNS服务器:

1
nslookup 10.128.100.101

您应该看到如下所示的输出:

1
2
3
4
5
Output:
Server: 10.128.10.11
Address: 10.128.10.11#53

11.10.128.10.in-addr.arpa name = host1.nyc3.example.com.

如果所有名称和IP地址都解析为正确的值,则表示您的zone文件已正确配置。如果收到异常值,请务必查看primary DNS服务器上的zone文件(例如db.nyc3.example.com和db.10.128)。

恭喜! 您的内部DNS服务器现已正确设置! 现在我们将介绍如何维护您的zone records。

Maintaining DNS Records 维护DNS记录

现在您有了一个正常工作的内部DNS,您需要维护DNS records,以便它们准确地响应您的server environment。

Adding Host to DNS 将主机添加到DNS

每当您向environment添加主机(在同一datacenter中)时,都需要将其添加到DNS中。以下是您需要执行的步骤:

Primary Nameserver(主Nameserver)

  • Forward zone文件:为新主机添加”A”记录,增加”Serial”的值
  • Reverse zone文件:为新主机添加”PTR”记录,增加”Serial”的值
  • 将新主机的private IP地址添加到”trusted” ACL(named.conf.options)

然后重新加载BIND:

1
sudo systemctl reload named

Secondary Nameserver(辅助Nameserver)

  • 将新主机的private IP地址添加到”trusted” ACL(named.conf.options)

然后重新加载BIND:

1
sudo systemctl reload named

配置新主机以使用您自己的DNS

  • 配置resolv.conf以使用您自己的DNS服务器
  • 使用nslookup进行测试

Removing Host from DNS 从DNS中删除主机

如果您从environment中删除主机或想要将其从DNS中删除,只需删除将服务器添加到DNS时添加的所有内容(即上述步骤的相反步骤)。

Conclusion 结论

现在,您可以按名称而不是IP地址来访问服务器的private network interfaces。这使得服务和应用程序的配置更加容易,因为您不再需要记住private IP地址,并且文件将更易于阅读和理解。此外,现在您可以更改配置,以便在单个位置指向新服务器,即primary DNS服务器,而不必编辑各种分布式配置文件,从而简化了维护。

设置内部DNS并且配置文件使用private FQDN指定网络连接后,维护DNS服务器至关重要。如果它们都不可用,那么依赖它们的服务和应用程序将无法正常运行。这就是为什么建议使用至少一个secondary服务器设置DNS,并维护所有这些服务器的工作备份原因。

验证

Host Role Private FQDN Private IP Address
ns1 Primary DNS Server ns1.nyc3.example.com 192.168.0.22
ns2 Secondary DNS Server ns2.nyc3.example.com 192.168.0.23
dns-client DNS client 192.168.0.24

1、安装BIND在Primary DNS Server

1
sudo yum install -y bind bind-utils

2、修改/etc/named.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sudo vi /etc/named.conf

acl "trusted" {
192.168.0.22; # ns1 - can be set to localhost
192.168.0.23; # ns2
192.168.0.24; # dns-client
};

options { # options start
# ... ...
listen-on port 53 { 127.0.0.1; 192.168.0.22; };
# listen-on-v6 port 53 { ::1; };
# ... ...
allow-transfer { 192.168.0.23; }; # disable zone transfers by default
allow-query { trusted; };
} # options end

include "/etc/named/named.conf.local";
1
2
3
4
5
6
7
8
9
10
11
12
13



sudo vi /etc/named/named.conf.local
sudo chmod 755 /etc/named
sudo mkdir /etc/named/zones
sudo vi /etc/named/zones/db.nyc3.example.com
sudo vi /etc/named/zones/db.192.168
sudo named-checkconf
sudo named-checkzone nyc3.example.com /etc/named/zones/db.nyc3.example.com
sudo named-checkzone 192.168.in-addr.arpa /etc/named/zones/db.192.168
sudo systemctl start named
sudo systemctl enable named

bind centos7 搭建

【图片预留】

首先安装bind rpm

1
[root@centos ~]# yum install -y bind bind-chroot bind-utils

【图片预留】

拷贝配置文件模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@centos ~]# cp -rv /usr/share/doc/bind-9.9.4/sample/etc/* /var/named/chroot/etc/
"/usr/share/doc/bind-9.9.4/sample/etc/named.conf" -> "/var/named/chroot/etc/named.conf"
"/usr/share/doc/bind-9.9.4/sample/etc/named.rfc1912.zones" -> "/var/named/chroot/etc/named.rfc1912.zones"
[root@centos ~]# cp -rv /usr/share/doc/bind-9.9.4/sample/var/* /var/named/chroot/var/
"/usr/share/doc/bind-9.9.4/sample/var/named/data" -> "/var/named/chroot/var/named/data"
"/usr/share/doc/bind-9.9.4/sample/var/named/my.external.zone.db" -> "/var/named/chroot/var/named/my.external.zone.db"
"/usr/share/doc/bind-9.9.4/sample/var/named/my.internal.zone.db" -> "/var/named/chroot/var/named/my.internal.zone.db"
"/usr/share/doc/bind-9.9.4/sample/var/named/named.ca" -> "/var/named/chroot/var/named/named.ca"
"/usr/share/doc/bind-9.9.4/sample/var/named/named.empty" -> "/var/named/chroot/var/named/named.empty"
"/usr/share/doc/bind-9.9.4/sample/var/named/named.localhost" -> "/var/named/chroot/var/named/named.localhost"
"/usr/share/doc/bind-9.9.4/sample/var/named/named.loopback" -> "/var/named/chroot/var/named/named.loopback"
"/usr/share/doc/bind-9.9.4/sample/var/named/slaves" -> "/var/named/chroot/var/named/slaves"
"/usr/share/doc/bind-9.9.4/sample/var/named/slaves/my.ddns.internal.zone.db" -> "/var/named/chroot/var/named/slaves/my.ddns.internal.zone.db"
"/usr/share/doc/bind-9.9.4/sample/var/named/slaves/my.slave.internal.zone.db" -> "/var/named/chroot/var/named/slaves/my.slave.internal.zone.db"

修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[root@centos ~]# vim /var/named/chroot/etc/named.conf 
/*
Sample named.conf BIND DNS server 'named' configuration file
for the Red Hat BIND distribution.

See the BIND Administrator's Reference Manual (ARM) for details about the
configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html
*/

options
{
// Put files that named is allowed to write in the data/ directory:
directory "/var/named"; // "Working" directory

/*
Specify listenning interfaces. You can use list of addresses (';' is
delimiter) or keywords "any"/"none"
*/
//listen-on port 53 { any; };
listen-on port 53 { 127.0.0.1; };

//listen-on-v6 port 53 { any; };
listen-on-v6 port 53 { ::1; };

};

zone "linuxcast.net" {
type master;
file "linuxcast.net.zone"; /* bind会自动到/var/named/chroot/var/named/中找linuxcast.net.zone文件 */
};

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@centos ~]# cp -rv /var/named/chroot/var/named/named.localhost /var/named/chroot/var/named/linuxcast.net.zone
"/var/named/chroot/var/named/named.localhost" -> "/var/named/chroot/var/named/linuxcast.net.zone"

[root@centos ~]# vim /var/named/chroot/var/named/linuxcast.net.zone
$TTL 1D
@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 127.0.0.1
AAAA ::1

www IN A 192.168.56.101
mail IN A 192.168.56.101
IN MX 10 mail.linuxcast.net.

启动bind服务

1
2
[root@centos ~]# systemctl start named.service

搭建wordpress

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
[vagrant@docker-node1 ~]$ docker run -d --name mysql -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=workpress mysql:5.7.24
[vagrant@docker-node1 ~]$ docker run -d --name wordpress -e WORDPRESS_DB_HOST=mysql:3306 --link mysql -p 80:80 wordpress

docker-compose.yml示例
version: '3'
services:
wordpress:
image: wordpress
ports:
- 80:80
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD: root
networks:
- my-bridge

mysql:
image: mysql:5.7.24
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
volumes:
- mysql-data:/var/lib/mysql
networks:
- my-bridge
volumes:
mysql-data:
networks:
my-bridge:
driver: bridge
创建docker组合服务
[vagrant@docker-node1 ~]$ docker-compose -f docker-compose.yml up -d
清除环境
[vagrant@docker-node1 ~]$ docker-compose down

Dockerfile示例
[vagrant@docker-node1 ~]$ cat docker-compose-build.yml
version: "3"
services:
hello-docker:
build:
context: .
dockerfile: Dockerfile
[vagrant@docker-node1 ~]$ cat Dockerfile
FROM centos
RUN yum install vim -y
[vagrant@docker-node1 ~]$ docker-compose -f docker-compose-build.yml up

Load balancing示例
lb:
image: dockercloud/haproxy
links:
- webserver
ports:
- 80:80
volumes:
- /var/run/docker.sock:/var/run/docker.sock

Docker Compose

如果搭建的APP有多个Container组成,部署APP的时候会非常繁琐。

1、要从Dockerfile build image或者Dockerhub拉取image

2、要创建多个Container

3、要管理这些Container(启动停止删除)

Docker Compose –> 批处理

  • Docker Compose是一个工具

  • 这个工具可以通过一个yml文件定义多容器的docker应用

  • 通过一条命令就可以根据yml文件的定义去创建或者管理这多个容器

docker-compose.yml

1
三大概念:services、networks、volumes

demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
一个service代表一个Container,这个Container可以从dockerhub的image来创建,或者自己build出来的images来创建

service的启动类似docker run,我们可以给其指定network和volume,所以可以给service指定network和volume的引用

services:
db:
image: postgres:9.4
volume:
- "db-data:/var/lib/postgresql/data"
networks:
- back-tier
就像:
docker run -d --network back-tier -v db-data:/var/lib/postgresql/data postgres:9.4

service:
worker:
build: ./worker #指定Docker的location
links:
- db
- redis
networks:
- back-tier

安装docker compose

Linux

1
2
3
4
5
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

docker-compose --version

Docker的持久化存储和数据共享

  • 基于本地文件系统的volume。可以在执行docker create或docker run时,通过-v参数将主机的目录作为容器的数据卷。这部分功能便是基于本地文件系统的volume管理。

  • 基于plugin的volume,支持第三方的存储方案,比如NAS,aws。

volume的类型

  • 受管理的data volume,由docker后台自动创建。

  • 绑定挂载的volume,具体挂载位置可以由用户指定。

data volume

启动mysql Container,会在宿主机/var/lib/docker/volumes/目录创建持久化目录。在mysql的Dockerfile中有VOLUME /var/lib/mysql,对应的是Container里面的路径。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
[vagrant@docker-node1 ~]$ sudo docker run -d --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
9f423f85765546cb5f2f748b99e221c371794e9ae2ee910aabc685462506a23e
[vagrant@docker-node1 ~]$ docker volume ls
DRIVER VOLUME NAME
local 5625ef5f9b225dfab10577dbf0521c4244e6ebc60bc1951befac708b196082db
[vagrant@docker-node1 ~]$ docker volume inspect 5625ef5f9b225dfab10577dbf0521c4244e6ebc60bc1951befac708b196082db
[
{
"CreatedAt": "2018-12-17T16:21:09Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/5625ef5f9b225dfab10577dbf0521c4244e6ebc60bc1951befac708b196082db/_data",
"Name": "5625ef5f9b225dfab10577dbf0521c4244e6ebc60bc1951befac708b196082db",
"Options": null,
"Scope": "local"
}
]

[vagrant@docker-node1 ~]$ sudo docker run -d --name mysql2 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
12dc76117789421e6d9fbe43b6ceeb38791b94848baa0506a1f90bbccd9050fc
[vagrant@docker-node1 ~]$ docker volume ls
DRIVER VOLUME NAME
local 595c8cee9d6483ae8a4e2006e18103298bf02f940ef05d43261071af74aa6a42
local 5625ef5f9b225dfab10577dbf0521c4244e6ebc60bc1951befac708b196082db
[vagrant@docker-node1 ~]$ docker volume inspect 595c8cee9d6483ae8a4e2006e18103298bf02f940ef05d43261071af74aa6a42
[
{
"CreatedAt": "2018-12-17T16:24:15Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/595c8cee9d6483ae8a4e2006e18103298bf02f940ef05d43261071af74aa6a42/_data",
"Name": "595c8cee9d6483ae8a4e2006e18103298bf02f940ef05d43261071af74aa6a42",
"Options": null,
"Scope": "local"
}
]

以上的方式volume不能很好的区分volume对应哪个应用,可以在启动Container时指定-v参数。
[vagrant@docker-node1 ~]$ sudo docker run -d -v mysql:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
6b768f033c3f2c17c2da569ed3a9d4490ac7f3bd17e551a24e0fd7c9f7522ed2
[vagrant@docker-node1 ~]$ docker volume ls
DRIVER VOLUME NAME
local mysql
创建mysql1 Container,并在Container中的mysql创建docker database,然后停止并删除Container,这时mysql的volume依然存在。
[vagrant@docker-node1 ~]$ docker exec -it mysql1 /bin/bash
root@6b768f033c3f:/# mysql -uroot
mysql> create database docker;
mysql> exit
root@6b768f033c3f:/# exit
[vagrant@docker-node1 ~]$ docker stop mysql1
[vagrant@docker-node1 ~]$ docker rm $(docker ps -qa)
创建mysql2 Container,并挂载之前名为mysql的volume,发现docker database依然存在,说明volume起作用了。
[vagrant@docker-node1 ~]$ sudo docker run -d -v mysql:/var/lib/mysql --name mysql2 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
f574294e26818667095b78a7141e8eb5309b7aa27d4b027e6811e4cca3368fdf
[vagrant@docker-node1 ~]$ docker exec -it mysql2 /bin/bash
root@f574294e2681:/# mysql -u root
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| docker |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.05 sec)

Bind Mouting

data volume方式需要在Dockerfile中定义VOLUME,bind mouting方式则不需要。在docker run时,指定宿主机目录与Container内目录的对应关系即可(docker run -v /home/aaa:/root/aaa)。