戴树谦的博客


  • Home

  • Tags

  • Archives

  • Search

docker私有仓库docker-registry搭建

Posted on 2019-01-09
Words count in article: 1k | Reading time ≈ 4

关于docker-registry

The Registry is a stateless, highly scalable server side application that stores and lets you distribute Docker images. The Registry is open-source, under the permissive Apache license.(docker documents) docker-registry是一个无状态的、可高度伸缩的服务器端应用程序,可以存储并允许您分发docker 镜像。docker-registry是开源的,是Apache许可证所允许的。

使用互联网上的的registry会受到网络因素的跟大影响,在pull 和push 时速度会不尽人意,在生产环境中并行启动的容器不会只有一两个会是几十上百个,而且并不能保证docker host 本地拥有所需要的所有镜像,所以通过互联网去下载就无法做到快速启动了很明显违背了容器轻量快速部署的初衷,此时就要自己在本地搭建私有registry。如果运维的系统环境托管在云服务上例如阿里云,那我们就去使用阿里的registry服务,也就是说将其建在生产环境的服务器的局域网中以达到更快的目的。

在Docker Hub中有registry镜像,pull下来即可使用,用法在上一篇博客中已经说到

docker-registry安装

还有一种简单的方法就是Docker 提供了一个docker-distribution程序包 我们直接yum安装即可

查看其安装生成的文件

config.yml 是配置文件,registry是主程序,启动服务是docker-distribution.services, 数据存储在/var/lib/registry

在config.yml中可以修改缓存、存储路径、监听端口等,如果作为专门的rigistry应该把端口改成80或者https的443

1
systemctl start docker-distribution  //启动服务

然后就可以push镜像了

在另外一台主机上向刚搭建好的registry推送镜像

推送之前还应该说一下docker镜像的命名规则

The Docker Registry is a component of Docker’s ecosystem. A registry is a storage and content delivery system, holding named Docker images, available in different tagged versions. For example, the image distribution/registry, with tags 2.0 and latest. Users interact with a registry by using docker push and pull commands such as docker pull myregistry.com/stevvooe/batman:voice.Docker Hub is an instance of a Docker Registry.

Docker仓库是Docker生态系统的一部分。registry是一个存储和交付系统,支持命名镜像,存在不同的标记版本。例如一个镜像 distribution/registry 拥有2.0 和latest标记。用户和registry交互使用docker push 和docker pull命令例如:docker pull myregistry.com/stevvooe/batman:voice.Docker Hub是docker registry的一个实例。

也就是说用仓库名加标签来唯一标识一个镜像,只不过平常我们使用docker pull centos 时,docker.io为默认域名,latest为默认标签即docker pull docker.io/library/centos:latest

所以在我们docke push 镜像时,同样也要遵守命名规则

我们使用docker tag 进行打标

1
docker tag hadoop web1:5000/hadoop:1.0  这里使用顶层仓库
1
2
3
root@ubuntu16:~# docker push web1:5000/hadoop:1.0
The push refers to a repository [web1:5000/hadoop]
Get https://web1:5000/v1/_ping: http: server gave HTTP response to HTTPS client

报错为 http服务器响应https客户端,docker push 默认基于https协议工作,服务器端支持http ,二者不兼容。

我们搭建的是内网的仓库使用http协议就可以,修改客户端的docker daemon

1
2
3
4
vim /etc/docker/daemon.json
{ "insecure-registries" : ["web1:5000"]
}
systemctl restart docker

再去docker push 就可以了

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
[root@Web2 registry]# tree /var/lib/registry/
/var/lib/registry/
└── docker
└── registry
└── v2
├── blobs
│ └── sha256
│ ├── 09
│ │ └── 09d6e0703b59972f3832b563f62afeb0a4d952d79724c933543b4ecd389ac7c3
│ │ └── data
│ ├── 53
│ │ └── 5301edc7ec17551bb197f15b3e9708231924392df6d403ac22cc897da75c6c5b
│ │ └── data
│ ├── 7c
│ │ └── 7cab4876127f1e8ad7460cc656f61e7203cf8a04cebb5585c1e29f1c097266e9
│ │ └── data
│ ├── 89
│ │ └── 8916107b7faec7a28f9bfb0d59579a51b8b9f80835b0ed134f5f511deae095be
│ │ └── data
│ ├── 95
│ │ └── 95acc0e10968e9babf3a942a085279db4269728c4c77f8f3a7d5e208108908c6
│ │ └── data
│ ├── 96
│ │ └── 967a799109e4d74670438c51aba1b270c0f72caca675342acc955512f11e7459
│ │ └── data
│ ├── a1
│ │ └── a185367e7bddc7bb3f22e43f388c0e9aefb2e6b679d2cbed1a3c7ff1f584dbf1
│ │ └── data
│ ├── a4
│ │ └── a4dd3fbaa1db732a34a7ecf2e1f40a095aab3dab94109fd7c628c8966071944e
│ │ └── data
│ └── f4
│ └── f4236122778c0399bad22e265f9c017b5eb6aaead18ea21a21f5c0d9c97e907f
│ └── data
└── repositories
└── hadoop
├── _layers
│ └── sha256
│ ├── 09d6e0703b59972f3832b563f62afeb0a4d952d79724c933543b4ecd389ac7c3
│ │ └── link
│ ├── 5301edc7ec17551bb197f15b3e9708231924392df6d403ac22cc897da75c6c5b
│ │ └── link
│ ├── 7cab4876127f1e8ad7460cc656f61e7203cf8a04cebb5585c1e29f1c097266e9
│ │ └── link
│ ├── 8916107b7faec7a28f9bfb0d59579a51b8b9f80835b0ed134f5f511deae095be
│ │ └── link
│ ├── 95acc0e10968e9babf3a942a085279db4269728c4c77f8f3a7d5e208108908c6
│ │ └── link
│ ├── 967a799109e4d74670438c51aba1b270c0f72caca675342acc955512f11e7459
│ │ └── link
│ ├── a4dd3fbaa1db732a34a7ecf2e1f40a095aab3dab94109fd7c628c8966071944e
│ │ └── link
│ └── f4236122778c0399bad22e265f9c017b5eb6aaead18ea21a21f5c0d9c97e907f
│ └── link
├── _manifests
│ ├── revisions
│ │ └── sha256
│ │ └── a185367e7bddc7bb3f22e43f388c0e9aefb2e6b679d2cbed1a3c7ff1f584dbf1
│ │ └── link
│ └── tags
│ └── 1.0
│ ├── current
│ │ └── link
│ └── index
│ └── sha256
│ └── a185367e7bddc7bb3f22e43f388c0e9aefb2e6b679d2cbed1a3c7ff1f584dbf1
│ └── link
└── _uploads

46 directories, 20 files
[root@Web2 registry]#

使用tree 命令完整的看到了/var/lib/registry/ 下的目录结构,hadoop镜像已经存在,镜像的每一层都是单独推送单独存放。
再找一台服务器 执行docker pull 命令, 同样需要修改daemon.json中的内容,使用http协议。

docker-registry搭建完成。

上一篇博客感觉很粗糙,做的很仓促,本篇博客再重新梳理一下。

上传镜像至docker Hub,以及搭建本地私有仓库

Posted on 2019-01-08
Words count in article: 419 | Reading time ≈ 1

仓库(Repository)是集中存放镜像的地方,分为公共仓库和私有仓库
注册服务器(Registry)是存放仓库的具体服务器,一个注册服务器上可以有多个仓库,每个仓库下面有多个镜像

首先要说的是docker Hub 公共镜像市场
本地执行docker iogin 登陆

官方给出的命令

1
docker pull 注册仓库/仓库名

这里需要将要上传的镜像改名,在名称前加上自己dockerHub的ID

速度很慢,需要配置镜像加速器,我配置的是阿里的配置镜像加速器

里面会有自己专用的加速连接

1
2
3
4
5
6
7
8
9
10
11
mkdir -p /etc/docker

vim daemon.json

{
"registry-mirrors": ["your accelerate address"]
}

systemctl daemon-reload

systemctl restart docker

再次上传就很快了

来到docker hub就可以看到了

可以通过官方提供的registry 镜像来搭建本地私有仓库环境

1
docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry

可以看到容器已经启动了,映射主机5000端口,容器的/tmp/registry 挂载到主机/opt/data/registry目录,地址为172.17.0.2:5000
docker tag 将要上传的镜像进行标记(docker tag Image[:tag] [Registryhost/] [Username/] Name [:Tag])

1
docker tag centos 172.17.0.2:5000/test

配置对仓库进行的安全性检查

在/etc/docker/daemon.json

1
{"insecure-registries":["172.17.0.2:5000"]}

1
2
3
systemctl restart docker
docker restart e46 重启registry 容器
netstat -ntl 查看5000端口是否开放
1
docker push 172.17.0.2:5000/test
1
curl -XGET http://172.17.0.2:5000/v2/_catalog

可以看到镜像存在

删除本地镜像

1
docker pull 172.17.0.2:500/test

可以看到镜像被拉下来了

IPv6(RIP、OSPF、EIGRP、DHCP、双栈、隧道)

Posted on 2019-01-07
Words count in article: 5.3k | Reading time ≈ 29

本篇博客介绍了Ipv6 的各种基本配置,也是本学期本门课的一个总结,使用Cisco Packet Tracer7.0 和GNS3 0.8 模拟器进行的以下实验 ,路由器选型为cisco 2911,Gns3中是c2691。

实验一 IPv6 IP地址配置方法(2911)

设备 接口 IP地址
 Router0   g0/0     2001:0db8:cafe:A001::2/64  
   g0/1   2001:0db8:cafe:A002::2/64
   g0/2   2001:0db8:cafe:0002::1/64
 Router1  g0/0   2001:0db8:cafe:A001::1/64
   g0/1   2001:0db8:cafe:A003::1/64
   g0/2   2001:0db8:cafe:0001::1/64
 Router2  g0/0   2001:0db8:cafe:A003::2/64
   g0/1   2001:0db8:cafe:A002::1/64
   g0/2   2001:0db8:feed:0001::1/64
 Router3  g0/0   2001:0db8:feed:0001::2/64
   g0/1   2001:0db8:face:c0de::1/64
 PC 0     2001:0db8:cafe:0001::2/64
 PC 1     2001:0db8:face:c0de::2/64
 PC2     2001:0db8:cafe:0002::2/64
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
Route1
Router>enable
Router#config terminal
Router(config)#ipv6 unicast-routing // 开启 IPV6流量转发
Router(config)#int g0/0
Router(config)#no shutdown
Router(config-if)#ipv6 add 2001:0db8:cafe:A001::1/64 //前64位为网络地址;后64位为主机位
Router#show ipv6 interface brief

使用EUI-64格式配置静态地址:
Router(config)#int g0/1
Router(config)#no shutdown
Router(config-if)#ipv6 address 2001:0db8:cafe:A003::1/64 eu
Router(config-if)#ipv6 address 2001:0db8:cafe:A003::1/64 eui-64

仅启用接口IPv6功能
Router#conf t
Router(config)#int g0/2
Router(config)#no shutdown
Router(config-if)#ipv
Router(config-if)#ipv6 enable //会自动分配Ipv6地址


配置无编号地址
Router(config)#interface f0/3/0
Router(config)#no shutdown
Router(config-if)#ipv6 unnumbered g0/0 // 结果显示为接口f0/3/0借用g0/0的地址

实验二 静态路由配置

1. 直连静态路由

1
2
r1(config)#ipv6 route 2022:2:2:22::/64 e1/1
到达目标网络2022:2:2:22::/64 的数据包从接口e1/1发出去

2.递归静态路由

1
2
r1(config)#ipv6 route 2022:2:2:22::/64 2012:1:1:11::2 
到达目标网络2022:2:2:22::/64 的数据包发给下一跳地址2012:1:1:11::2

3.完全静态路由

1
2
r1(config)#ipv6 route 2022:2:2:22::/64 f0/0 2012:1:1:11::2  
到达目标网络2022:2:2:22::/64 的数据包从接口F0/0发出去,并且交给下一跳地址2012:1:1:11::2
1
2
3
4
5
6
7
8
9
10
11
配置递归路由(pc0 ping  pc1)
pc0至pc1
Router1(config)#ipv6 unicast-routing
Router1(config)#ipv6 route 2001:0db8:face:c0de::/64(pc1网段) 2001:0db8:cafe:A003::2(Route2g0/0)
Router2(config)#ipv6 unicast-routing
Router2(config)#ipv6 route 2001:0db8:face:c0de::/64(pc1网段) 2001:0db8:feed:0001::2(Route3g0/0)
pc1 至PC0
Router3(config)#ipv6 unicast-routing
Router3(config)#ipv6 route 2001:0db8:cafe:1::/64(pc0网段) 2001:0db8:feed:0001::1(Route2g0/2)
Router3(config)#ipv6 unicast-routing
Router(config)#ipv6 route 2001:0db8:cafe:1::/64(pc0网段) 2001:0db8:cafe:A003::1(Route1g0/1)**

PC0 ping PC1

实验三 IPv6 RIP (RIPng)基础实验

以Route2为例

1
2
3
4
5
6
7
8
9
10
11
12
13
Router2>en
Router2#conf t
Router1(config)#ipv6 unicast-routing // 开启IPv6路由转发
Router2(config)#ipv6 router rip test //启动IPv6 RIPng进程,RIP进程名字为test
Router2(config-rtr)#int g0/0
Router2(config-if)#no shutdown
Router2(config-if)#ipv6 rip test enable
Router2(config-if)#int g0/1
Router2(config-if)#no shutdown
Router2(config-if)#ipv6 rip test enable
Router2(config-if)#int g0/2
Router2(config-if)#no shutdown
Router2(config-if)#ipv rip test enable

所有路由器的所有接口都要进行配置!

下面查看Route2的RIP数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Router2#show ipv6 rip database  //查看IPv6数据库
RIP process "test" local RIB
2001:DB8:CAFE:1::/64, metric 2, installed // 路由条目装入路由表
GigabitEthernet0/0/FE80::2E0:F7FF:FE48:CB02, expires in 151 sec
2001:DB8:CAFE:2::/64, metric 2, installed
GigabitEthernet0/1/FE80::2E0:8FFF:FE67:C502, expires in 161 sec
2001:DB8:CAFE:A001::/64, metric 2, installed
GigabitEthernet0/0/FE80::2E0:F7FF:FE48:CB02, expires in 151 sec
2001:DB8:CAFE:A001::/64, metric 2, installed
GigabitEthernet0/0/FE80::2E0:F7FF:FE48:CB02, expires in 151 sec2, installed
GigabitEthernet0/1/FE80::2E0:8FFF:FE67:C502, expires in 161 sec
2001:DB8:CAFE:A002::/64, metric 2
GigabitEthernet0/1/FE80::2E0:8FFF:FE67:C502, expires in 161 sec
2001:DB8:CAFE:A003::/64, metric 2
GigabitEthernet0/0/FE80::2E0:F7FF:FE48:CB02, expires in 151 sec
2001:DB8:FACE:C0DE::/64, metric 2, installed
GigabitEthernet0/2/FE80::2D0:BAFF:FE71:9201, expires in 166 sec
2001:DB8:FEED:1::/64, metric 2
GigabitEthernet0/2/FE80::2D0:BAFF:FE71:9201, expires in 166 sec
Router2#

在Pc0上进行检测

实验四 OSPFv3基础实验

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
以Route1为例
Router1>en
Router1#conf t
Router1(config)#ipv6 unicast-routing // 开启Ipv6路由转发
Router1(config)#ipv6 router ospf 2 // 启动OSPFv3进程
%OSPFv3-4-NORTRID: OSPFv3 process 2 could not pick a router-id,please configure manually //要求手工指定router-id
Router1(config-rtr)#router-id 1.1.1.1 //给OSPF路由器指定身份,每个路由器的route-id都是唯一的
Router1(config-rtr)#int g0/0
Router1(config-if)#no shutdown
Router1(config-if)#ipv6 ospf 2 area 0
Router1(config-if)#int g0/1
Router1(config-if)#no shutdown
Router1(config-if)#ipv6 ospf 2 area 0
Router1(config-if)#int g0/2
Router1(config-if)#no shutdown
Router1(config-if)#ipv6 ospf 2 area 0
在Route 0 路由器
Router>en
Router#conf t
Router(config)#ipv6 unicast-routing
Router(config)#ipv6 router ospf 2
%OSPFv3-4-NORTRID: OSPFv3 process 2 could not pick a router-id,please configure manually
Router(config-rtr)#router-id 4.4.4.4
Router(config-rtr)#int g0/0
Router(config-if)#no shutdown
Router(config-if)#ipv6 ospf 2 area 0
Router(config-if)#int g0/1
Router(config-if)#no shutdown
Router(config-if)#ipv6 ospf 2 area 0
Router(config-if)#int g0/2
Router(config-if)#no shutdown
Router(config-if)#ipv6 ospf 2 area 0

Route2,Route3同理

实验五 IPv6 EIGRP实验

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
R1  // R2 同理,此处不再进行配置演示
R1#conf t // R1初始配置
R1(config)#ipv6 unicast-routing
R1(config)#int g0/0
R1(config-if)#no shutdown
R1(config-if)#ipv6 add 2012:1:1:11::1/64
R1(config-if)#exit
R1(config)#int loopback 1
R1(config-if)#no shutdown
R1(config-if)#ipv6 add 3001:1:1:11::1/64
R1(config-if)#exit
R1(config)#int loopback 2
R1(config-if)#no shutdown
R1(config-if)#ipv6 add 3002:1:1:11::1/64
R1(config-if)#exit
R1(config)#int loopback 3
R1(config-if)#no sh
R1(config-if)#ipv6 add 3003:1:1:11::1/64
R1#show ipv6 interface bri
FastEthernet0/0 [up/up]
FE80::C204:8FF:FEB8:0
2012:1:1:11::1
FastEthernet0/1 [administratively down/down]
unassigned
Loopback1 [up/up]
FE80::C204:8FF:FEB8:0
3001:1:1:11::1
Loopback2 [up/up]
FE80::C204:8FF:FEB8:0
3002:1:1:11::1
Loopback3 [up/up]
FE80::C204:8FF:FEB8:0
3003:1:1:11::1
R1(config)#ipv6 router eigrp 10 // 在R1上启动EIGRP v6进程
R1(config-rtr)#no shutdown //EIGRP v6进程默认是shutdown的,必须手工开启
R1(config-rtr)#eigrp router-id 1.1.1.1
R1(config)#int g0/0 //将 R1上的接口放进EIGRP v6进程
R1(config-if)#ipv6 eigrp 10
R1(config-if)#exit
R1(config)#int loopback 1
R1(config-if)#ipv6 eigrp 10

重分布IPv6网段

将R1上的剩余网段重分布进EIGRP v6

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
r1(config)#route-map con permit 10  //在R1上配置重分布剩余网段进EIGRP v6
r1(config-route-map)#match interface loopback 2
r1(config-route-map)#exit
r1(config)#route-map con permit 20
r1(config-route-map)#match interface loopback 3
r1(config)#ipv6 router eigrp 10
r1(config-rtr)#redistribute connected route-map con
r1(config-rtr)#exit
在R2上查看重分布进EIGRP v6的剩余网段
r2#sh ipv6 route eigrp
IPv6 Routing Table - 9 entries
Codes: C - Connected, L - Local, S - Static, R - RIP, B - BGP
U - Per-user Static route
I1 - ISIS L1, I2 - ISIS L2, IA - ISIS interarea, IS - ISIS summary
O - OSPF intra, OI - OSPF inter, OE1 - OSPF ext 1, OE2 - OSPF ext 2
ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2
D - EIGRP, EX - EIGRP external
D 3001:1:1:11::/64 [90/409600]
via FE80::C200:9FF:FE54:0, FastEthernet0/0
EX 3002:1:1:11::/64 [170/409600]
via FE80::C200:9FF:FE54:0, FastEthernet0/0
EX 3003:1:1:11::/64 [170/409600]
via FE80::C200:9FF:FE54:0, FastEthernet0/0
r2#

过滤IPv6路由

在R2上过滤掉IPv6路由,只留想要的网段,使用distribute-list过滤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
r2(config)#ipv6 prefix-list abc permit 3002:1:1:11::/64  //配置只留3002:1:1:11::/64网段
r2(config)#ipv6 router eigrp 10
r2(config-rtr)#distribute-list prefix-list abc in f0/0
r2#sh ipv6 route eigrp
IPv6 Routing Table - 7 entries
Codes: C - Connected, L - Local, S - Static, R - RIP, B - BGP
U - Per-user Static route
I1 - ISIS L1, I2 - ISIS L2, IA - ISIS interarea, IS - ISIS summary
O - OSPF intra, OI - OSPF inter, OE1 - OSPF ext 1, OE2 - OSPF ext 2
ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2
D - EIGRP, EX - EIGRP external
EX 3002:1:1:11::/64 [170/409600]
via FE80::C200:9FF:FE54:0, FastEthernet0/0
r2#

实验七 IPv6地址SLAAC与有状态自动配置

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
1.配置无状态自动获得IP地址(SLAAC)

R1
Router>en
Router#conf t
Router(config)#ipv6 unicast-routing
Router(config)#int g0/0
Router(config-if)#ipv6 address 2023::2/64
Router(config-if)#no shutdown

R2
Router>en
Router#conf t
Router(config)#int g0/0
Router(config-if)#ipv6 address autoconfig
Router(config-if)#no sh
Router#show ipv6 int g0/0
GigabitEthernet0/0 is up, line protocol is up
IPv6 is enabled, link-local address is FE80::230:F2FF:FEC9:1D01
No Virtual link-local address(es):
Global unicast address(es):
2023::230:F2FF:FEC9:1D01, subnet is 2023::/64
Joined group address(es):
FF02::1
FF02::1:FFC9:1D01
MTU is 1500 bytes
ICMP error messages limited to one every 100 milliseconds
ICMP redirects are enabled
ICMP unreachables are sent
ND DAD is enabled, number of DAD attempts: 1
ND reachable time is 30000 milliseconds
Router#

2.调整ND
Router1:
interface g0/0
ipv6 address 2023::2/64
no shutdown
ipv6 nd ra-interval 5 //每5s通告一次RA
ipv6 nd ra-lifetime 1000 //RA的lifetime
ipv6 nd prefix 2023::/64 5000 4000 //修改valid time和preferred time

3.不希望SLAAC
抑制RA消息:
ipv6 nd ra suppress //对IOS版本有要求

实验八.DHCPv6分配

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
1.无状态自动配置
注:此时地址是EUI/64获取的,而其他信息是由DHCP获取的
Router1:
Ipv6 unicast-routing
ipv6 dhcp pool cafe-1
dns-server 2022::2
domain-name www.heuet.edu.cn
interface G0/0
ipv6 address 2023::2/64
ipv6 dhcp server café-1
ipv6 nd other-config-flag //O置位

Router2:
interface g0/0
ipv6 address autoconfig

2.有状态自动配置
Router1:
Ipv6 unicast-route
ipv6 dhcp pool cafe-1
dns-server 2022::2
domain-name www.heuet.edu.cn
address prefix 2023:2323::/64
interface g0/0
ipv6 address 2023::2/64
ipv6 dhcp server cafe-1
ipv6 nd other-config-flag
ipv6 nd managed-config-flag //M置位

Router2:
interface g0/0
ipv6 enable //让接口获得link-local地址作为DHCP源来发送DHCP报文
ipv6 address dhcp

查看:
Router1#sh ipv6 dhcp pool
DHCPv6 pool: cafe-1
DNS server: 2022::2
Domain name: www.heuet.edu.cn
Active clients: 1 //一个client

实验九 DHCPv6前缀代表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DHCP  SERVER

Router>en
Router#conf t
Router(config)#ipv6 unicast-routing
Router(config)#ipv6 dhcp pool dhcpv6 //定义DHCP服务的名字
Router(config-dhcpv6)#prefix-delegation pool dhcpv6-pool lifetime 1800 600 //创建DHCPV6-pool的前缀代
//表地址池,并定义有效期
Router(config-dhcpv6)#dns-server 2001:db8:3000:3000::42
Router(config-dhcpv6)#domain-name www.heuet.edu.cn
Router(config-dhcpv6)#exit l
Router(config)#int g0/0
Router(config-if)#ipv6 dhcp server dhcpv6 //在接口上启动DHCP服务对象
Router(config-if)#exit
Router(config)#ipv6 local pool dhcpv6-pool 2001:db8:1200::/40 48 //定义一个前缀长度为40的本地前缀代表
//地址池,并且定义分配给DHCPv6-PD Client的前缀长度是48位
Router(config)#int g0/0
Router(config-if)#ipv6 add 2010:AB8::1/64
Router(config-if)#ipv6 enable
Router(config-if)#no shutdown
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
DHCP Client

Router>en
Router#conf t
Router(config)#ipv6 unicast-routing
Router(config)#int g0/0
Router(config-if)#no sh
Router(config-if)#ipv6 add autoconfig //无状态自动配置IPv6地址
Router(config-if)#ipv6 enable
Router(config-if)#ipv6 dhcp client pd prefix-from-pr //在接口上启用PD,将PD命名为prefix-from-pr
Router(config-if)#
Router(config-if)#int g0/1
Router(config-if)#no sh
Router(config-if)#ipv6 address prefix-from-pr ::1:0:0:0:1/64 配置接口从名字prefix-from-pr那里取得前缀,
然后附加上1:0:0:0:1,最后形成接口的地址是2001:DB8:1200:1::1/64
Router(config-if)#int g0/2
Router(config-if)#no sh
Router(config-if)#ipv6 address prefix-from-pr ::1/64 //接口地址为2001:DB8:1200:::1/64
Router(config-if)#
1
2
3
4
5
6
7
8
9
Client1
Router>en
Router#conf t
Router(config)#ipv6 unicast-routing
Router(config)#
Router(config)#int g0/0
Router(config-if)#no sh
Router(config-if)#ipv6 address autoconfig //启用无状态自动获得IP地址
Router#show ipv6 interface brief
1
2
3
4
5
6
7
8
Client2
Router>en
Router#conf t
Router(config)#ipv6 unicast-routing
Router(config)#int g0/0
Router(config-if)#no sh
Router(config-if)#ipv6 add autoconfig //启用无状态自动获得IP地址
Router#show ipv6 inter bri

实验十 IPv6、IPv4双栈实验

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
R0
Router>en
Router#conf t
Router(config)#ipv6 unicast-routing
Router(config)#ipv6 router ospf 1
Router(config-rtr)#router-id 10.1.1.1
Router(config-rtr)#int g0/0
Router(config-if)#no sh
Router(config-if)#ip add 10.10.10.1 255.255.255.252
Router(config-if)#duplex auto
Router(config-if)#speed auto
Router(config-if)#
Router(config-if)#ipv6 add 2001:DB8:CAFE:A001::1/64
Router(config-if)#ipv6 ospf 1 area 0
Router(config-if)#exit
Router(config)#int g0/1
Router(config-if)#no sh
Router(config-if)#ip add 10.10.10.9 255.255.255.252
Router(config-if)#duplex auto
Router(config-if)#speed au
Router(config-if)#ipv6 address 2001:DB8:CAFE:A003::1/64
Router(config-if)#ipv6 ospf 1 area 0
Router(config-if)#exit
Router(config)#int g0/2
Router(config-if)#no sh
Router(config-if)#ip add 10.1.0.1 255.255.0.0
Router(config-if)#duplex auto
Router(config-if)#speed auto
Router(config-if)#ipv6 add 2001:DB8:CAFE::1/64
Router(config-if)#ipv6 address 2001:DB8:CAFE:1::1/64
Router(config-if)#ipv
Router(config-if)#ipv6 os
Router(config-if)#ipv6 ospf 1 ar
Router(config-if)#ipv6 ospf 1 area 0
Router(config-if)#router ospf 2
Router(config-router)#log-adjacency-changes
Router(config-router)#network 10.1.0.0 0.0.255.255 area 0
Router(config-router)#network 10.10.10.0 0.0.0.3 area 0
Router(config-router)#network 10.10.10.8 0.0.0.3 area 0
Router(config-router)#
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
R1
Router>en
Router#conf t
Router(config)#ipv unicast-routing
Router(config)#ipv6 router ospf 1
Router(config-rtr)#router-id 10.3.3.3
Router(config-rtr)#log-adjacency-changes
Router(config-rtr)#int g0/0
Router(config-if)#no sh
Router(config-if)#ip address 10.10.10.6 255.255.255.252
Router(config-if)#duplex au
Router(config-if)#speed au
Router(config-if)#ipv6 address 2001:DB8:CAFE:A002::2/64
Router(config-if)#ipv6 ospf 1 area 0
Router(config-if)#int g0/1
Router(config-if)#no sh
Router(config-if)#ip address 10.10.10.10 255.255.255.252
Router(config-if)#duplex auto
Router(config-if)#speed auto
Router(config-if)#ipv6 address 2001:DB8:CAFE:A003::2/64
Router(config-if)#ipv6 ospf 1 area 0
Router(config-if)#int g0/2
Router(config-if)#no sh
Router(config-if)#ip address 10.3.0.1 255.255.0.0
Router(config-if)#duplex auto
Router(config-if)#speed auto
Router(config-if)#ipv6 address 2001:DB8:CAFE:3::1/64
Router(config-if)#ipv6 ospf 1 area 0
Router(config-if)#router ospf 2
Router(config-router)#log-adjacency-changes
Router(config-router)#network 10.10.10.8 0.0.0.3 area 0
Router(config-router)#network 10.10.10.4 0.0.0.3 area 0
Router(config-router)#network 10.3.0.0 0.0.255.255 area 0
Router(config-router)#
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
R2
Router>en
Router#conf t
Router(config)#ipv6 unicast-routing
Router(config)#ipv6 router ospf 1
Router(config-rtr)#router-id 10.2.2.2
Router(config-rtr)#int g0/0
Router(config-if)#no sh
Router(config-if)#ip address 10.10.10.2 255.255.255.252
Router(config-if)#duplex auto
Router(config-if)#speed auto
Router(config-if)#ipv6 address 2001:DB8:CAFE:A001::2/64
Router(config-if)#ipv6 ospf 1 area 0
Router(config-if)#interface g0/1
Router(config-if)#no sh
Router(config-if)#ip address 10.10.10.5 255.255.255.252
Router(config-if)#duplex auto
Router(config-if)#speed auto
Router(config-if)#ipv6 address 2001:DB8:CAFE:A002::1/64
Router(config-if)#ipv6 ospf 1 area 0
Router(config-if)#int g0/2
Router(config-if)#no sh
Router(config-if)#ip address 10.2.0.1 255.255.0.0
Router(config-if)#duplex au
Router(config-if)#speed auto
Router(config-if)#ipv6 address 2001:DB8:CAFE:2::1/64
Router(config-if)#ipv6 ospf 1 area 0
Router(config-if)#router ospf 2
Router(config-router)#log-adjacency-changes
Router(config-router)#network 10.10.10.0 0.0.0.3 area 0
Router(config-router)#network 10.10.10.4 0.0.0.3 area 0
Router(config-router)#network 10.2.0.0 0.0.255.255 area 0

实验十一 手工隧道

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
R0
Router>en
Router#conf t
Router(config)#ipv6 UNicast-routing
Router(config)#int g0/0
Router(config-if)#no sh
Router(config-if)#ipv6 address 2001:DB8:CAFE:1::1/64
Router(config-if)#int g0/1
Router(config-if)#no sh
Router(config-if)#ip add 192.168.1.1 255.255.255.0
Router(config-if)#int t0
Router(config-if)#ipv6 address 2001:DB8:CAFF:1::1/64
Router(config-if)#ipv6 en
Router(config-if)#tunnel source g0/1
Router(config-if)#tunnel destination 192.168.1.2
Router(config-if)#tunnel mode ipv6ip
Router(config-if)#ipv6 route 2001:DB8:ACE:2::/64 2001:DB8:CAFF:1::2
Router(config)#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
R1
Router>en
Router#conf t
Router(config)#ipv6 unicast-routing
Router(config)#int g0/0
Router(config-if)#ip address 192.168.1.2 255.255.255.0
Router(config-if)#no sh
Router(config-if)#int g0/1
Router(config-if)#ipv6 address 2001:DB8:ACE:2::1/64
Router(config-if)#no sh
Router(config-if)#int t0
Router(config-if)#ipv6 address 2001:DB8:CAFF:1::2/64
Router(config-if)#ipv6 en
Router(config-if)#tunnel source g0/0
Router(config-if)#tunnel destination 192.168.1.1
Router(config-if)#tunnel mode ipv6ip
Router(config-if)#i

实验十二 6to4隧道的配置

需要特别说明的是由于6to4隧道原理的特殊性,隧道端口的IPv4地址与IPv6网络的Ipv6地址有关联,所以分配IPv6网络的IP地址应该注意符合6to4隧道的编码要求。

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
R1
R1#conf t
R1(config)#ipv6 unicast-routing //启用路由器的Ipv6转发功能
R1(config)#int loopback 0
R1(config-if)#ipv add 2002:0a01:0101:1::1/64
R1(config-if)#int f0/1
R1(config-if)#no sh
R1(config-if)#ip add 10.1.1.1 255.255.255.0
R1(config)#router ospf 1 //配置IPv4网络的动态路由协议OSPF
R1(config-router)#network 10.1.1.0 0.0.0.255 area 0
R1(config)#int t0 创建隧道,并配置隧道的IPv6地址及隧道模式
R1(config-if)#no sh
R1(config-if)#ipv en
R1(config-if)#ipv6 address 2002:A01:101::1/64
R1(config-if)#tunnel source f0/1
R1(config-if)#tunnel mode ipv6ip 6to4
R1(config)#ipv6 route 2002::/16 Tunnel0 //配置IPv6路由

R2
R2#conf t
R2(config)#ipv6 unicast-routing //启用路由器的Ipv6转发功能
R2(config)#int loopback 0
R2(config-if)#ipv6 add 2002:0a03:0303:1::1/64
R2(config-if)#int f0/1
R2(config-if)#ip add 10.3.3.3 255.255.255.0
R2(config-if)#no sh
R2(config)#router ospf 1 //配置IPv4网络的动态路由协议OSPF
R2(config-router)#network 10.3.3.0 0.0.0.255 area 0
R2(config)#int t0 创建隧道,并配置隧道的IPv6地址及隧道模式
R2(config-if)#no sh
R2(config-if)#ipv en
R2(config-if)#ipv6 address 2002:A03:303::1/64
R2(config-if)# tunnel source f0/1
R2(config-if)# tunnel mode ipv6ip 6to4
R2(config)#ipv6 route 2002::/16 Tunnel0 //配置IPv6路由

R3
R3#conf t
R3(config)#ipv6 unicast-routing //启用路由器的Ipv6转发功能
R3(config)#int loopback 0
R3(config-if)#ipv add 2002:0a02:0202:1::1/64
R3(config-if)#int f0/1
R3(config-if)#no sh
R3(config-if)#ip add 10.2.2.2 255.255.255.0
R3(config)#router ospf 1 //配置IPv4网络的动态路由协议OSPF
R3(config-router)#network 10.2.2.0 0.0.0.255 area 0
R3(config)#int t0 创建隧道,并配置隧道的IPv6地址及隧道模式
R3(config-if)#no sh
R3(config-if)#ipv6 address 2002:A02:202::1/64
R3(config-if)#ipv en
R3(config-if)# tunnel source f0/1
R3(config-if)# tunnel mode ipv6ip 6to4
R3(config)#ipv6 route 2002::/16 Tunnel0 //配置IPv6路由

R4
R4#conf t
R4(config)#ipv un //启用路由器的Ipv6转发功能
R4(config)#int f0/0
R4(config-if)#no sh
R4(config-if)#ip add 10.1.1.10 255.255.255.0
R4(config-if)#int f0/1
R4(config-if)#ip add 10.3.3.10 255.255.255.0
R4(config-if)#no sh
R4(config-if)#int f1/0
R4(config-if)#no sh
R4(config-if)#ip add 10.2.2.10 255.255.255.0
R4(config)#router ospf 1 //配置IPv4网络的动态路由协议OSPF
R4(config-router)#network 10.1.1.0 0.0.0.255 area 0
R4(config-router)#network 10.2.2.0 0.0.0.255 area 0
R4(config-router)#network 10.3.3.0 0.0.0.255 area 0

实验十三 ISATAP隧道

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
R1
R1#CONF T
R1(config)#int loopback 0
R1(config-if)#ipv add 2002:303:301::1/64
R1(config-if)#int f0/0
R1(config-if)#no sh
R1(config-if)#ip add 3.3.30.1 255.255.255.0
R1(config-if)#exit
R1(config)#ip route 2.2.20.0 255.255.255.0 3.3.30.2
R1(config)#int t0
R1(config-if)#no sh
R1(config-if)#ipv en
R1(config-if)#tunnel source f0/0
R1(config-if)# tunnel mode ipv6ip isatap
R1(config-if)#exi
R1(config)#ipv unicast-routing
R1(config)#ipv6 router ospf 1
R1(config-rtr)#router-id 1.1.1.1
R1(config-rtr)#int t0 //创建ISATAP隧道,并配置隧道相关参数
R1(config-if)#ipv6 ospf network point-to-multipoint non-broadcast
R1(config-if)#ipv6 ospf neighbor FE80::5EFE:202:1401 //手工指定邻居使用本地链路地址
R1(config-if)#ipv6 ospf 1 area 0
R1(config-if)#exit
R1(config)#int lo 0
R1(config-if)#ipv6 ospf 1 area 0

R2
R2#conf t
R2(config)#int f0/0
R2(config-if)#no sh
R2(config-if)# ip address 3.3.30.2 255.255.255.0
R2(config-if)#int f0/1
R2(config-if)#no sh
R2(config-if)# ip address 2.2.20.2 255.255.255.0

R3
R3#conf t
R3(config)#ipv unicast-routing
R3(config)#int f0/0
R3(config-if)#no sh
R3(config-if)#ip add 2.2.20.1 255.255.255.0
R3(config-if)#int f0/1
R3(config-if)#no sh
R3(config-if)#ipv6 add 2002:202:201::1/64
R3(config-if)#exi
R3(config)#ip route 3.3.30.0 255.255.255.0 2.2.20.2
R3(config)#int t0
R3(config-if)#no sh
R3(config-if)#ipv en
R3(config-if)#tunnel source f0/0
R3(config-if)#tunnel mode ipv6ip isatap
R3(config-if)#exi
R3(config)#ipv6 router ospf 1
R3(config-rtr)# router-id 3.3.3.3
R3(config-rtr)#int t0 //创建ISATAP隧道,并配置隧道相关参数
R3(config-if)#ipv6 ospf network point-to-multipoint non-broadcast //为简化OSPF的运行,
//避免DR和BDR的选举,在隧道接口上把网络类型改为点到多点广播
R3(config-if)#ipv6 ospf neighbor FE80::5EFE:303:1E01 //手工指定邻居使用本地链路地址
R3(config-if)# ipv6 ospf 1 area 0
R3(config-if)#int f0/1
R3(config-if)#ipv6 ospf 1 area 0
R3(config-if)#

R4
R4#conf t
R4(config)#ipv un
R4(config)#int f0/0
R4(config-if)#no sh
R4(config-if)#ipv6 address 2002:202:201::2/64
R4(config-if)#exit
R4(config)#ipv6 router ospf 1
R4(config-rtr)#router-id 4.4.4.4
R4(config-rtr)#int f0/0
R4(config-if)#ipv6 ospf 1 area 0
R4(config-if)#

实验十四 ISATAP隧道(二)

C1 桥接本机网卡 ,路由器为C7200

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
R1
R1#conf t
R1(config)#int f0/0
R1(config-if)#ip address 192.168.10.10 255.255.255.0
R1(config-if)#no sh
R1(config-if)#exi
R1(config)#int s2/0
R1(config-if)#clock rate 64000
R1(config-if)#ip add 131.107.0.1 255.255.255.0
R1(config-if)#no sh



R2
R2#conf t
R2(config)#ipv un
R2(config)#int s2/0
R2(config-if)#ip address 131.107.0.2 255.255.255.0
R2(config-if)#no sh
R2(config-if)#exi
R2(config)#int s2/1
R2(config-if)#clock rate 64000
R2(config-if)#ipv6 address 2001:2::1/64
R2(config-if)#no sh
R2(config-if)#exi
R2(config)#ip route 192.168.10.0 255.255.255.0 131.107.0.1
R2(config)#ipv6 route 2001:1::/64 2001:2::2
R2(config)#int t0
R2(config-if)#ipv6 address 2001:3::/64 eui-64
R2(config-if)#no ipv6 nd suppress-ra
R2(config-if)#tunnel source 131.107.0.2
R2(config-if)#tunnel mode ipv6ip isatap
R2(config-if)#no sh


R3
R3#conf t
R3(config)#ipv un
R3(config)#int s2/1
R3(config-if)#ipv6 address 2001:2::2/64
R3(config-if)#no sh
R3(config-if)#exi
R3(config)#int f0/0
R3(config-if)#ipv6 address 2001:1::1/64
R3(config-if)#no sh
R3(config-if)#exi
R3(config)#ipv6 route 2001:3::/64 2001:2::1

以管理员身份运行cmd。执行以下命令:

1
netsh interface ipv6 isatap set route 131.107.0.2

(Win10操作系统要先运行:netsh interface isatap set state enable命令)
执行以下命令查看结果:

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
C:\WINDOWS\system32> ipconfig /all


无线局域网适配器 本地连接* 2:

媒体状态 . . . . . . . . . . . . : 媒体已断开连接
连接特定的 DNS 后缀 . . . . . . . :
描述. . . . . . . . . . . . . . . : Microsoft Wi-Fi Direct Virtual Adapter #2
物理地址. . . . . . . . . . . . . : BC-A8-A6-EB-A1-CD
DHCP 已启用 . . . . . . . . . . . : 是
自动配置已启用. . . . . . . . . . : 是

隧道适配器 isatap.{331437F1-5F3E-436E-8E71-36228471287E}:

连接特定的 DNS 后缀 . . . . . . . :
描述. . . . . . . . . . . . . . . : Microsoft ISATAP Adapter
物理地址. . . . . . . . . . . . . : 00-00-00-00-00-00-00-E0
DHCP 已启用 . . . . . . . . . . . : 否
自动配置已启用. . . . . . . . . . : 是
IPv6 地址 . . . . . . . . . . . . : 2001:3::5efe:192.168.10.20(首选)
本地链接 IPv6 地址. . . . . . . . : fe80::5efe:192.168.10.20%22(首选)
默认网关. . . . . . . . . . . . . : fe80::5efe:131.107.0.2%22
DNS 服务器 . . . . . . . . . . . : fec0:0:0:ffff::1%1
fec0:0:0:ffff::2%1
fec0:0:0:ffff::3%1
TCPIP 上的 NetBIOS . . . . . . . : 已禁用

执行ping命令测试是否能够互通。

1
2
3
4
5
6
7
8
9
10
11
12
PS C:\WINDOWS\system32> ping 2001:1::1

正在 Ping 2001:1::1 具有 32 字节的数据:
来自 2001:1::1 的回复: 时间=74ms
来自 2001:1::1 的回复: 时间=81ms
来自 2001:1::1 的回复: 时间=99ms
来自 2001:1::1 的回复: 时间=61ms

2001:1::1 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 61ms,最长 = 99ms,平均 = 78ms

特别说明:1、如果你的操作系统是win10,请下载win10关于IPv6的补丁.
2、为了用ping命令测试是否互通,请暂时关闭计算机防火墙或者通过设置防火墙规则允许ping命令数据包通过。

docker-端口映射与容器互联

Posted on 2018-12-17
Words count in article: 441 | Reading time ≈ 1

端口映射

当容器中运行一些应用,可以通过-p ,-P 参数来指定端口映射
使用-P时,Docker会随机映射一个49000~49900的端口到内部容器开放的端口
如果一个镜像中没有可以对外提供的服务,使用-P参数基于该镜像启动容器后,不会有端口的映射

1
2
例如:docker run -idt -P centos /bin/bash  
docker run -idt -P httpd /bin/bash

另外几种查看端口映射的方法

1
2
docker  port  ID
docker inspect -f {{.NetworkSettings.Ports}} ID

使用-p(小写)可以指定要映射的端口使用HostPort : ContainPort将本地的5000映射到容器的5000,会默认绑定本地所有接口上的所有地址

可以多次使用-p参数绑定多个端口

1
2
docker run -d -p 80:80 httpd 
docker run -d -p 80:80 -p 8080:8080 httpd

使用IP:HostPort:ContainPort格式指定映射使用一个特定地址

1
docker run -d -p 127.0.0.1:80:80 httpd

使用IP::ContainerPort 映射到指定地址的任意端口

1
2
3
4
5
docker run -d -p 127.0.0.1::80 httpd

还可以使用udp标记来指定udp端口

docker run -d -p 127.0.0.1:80:80/udp httpd

容器互联

创建一个数据库容器

1
docker run -idt --name db postgres
1
docker run -idt -P --name web --link db:db httpd /bin/bash

使用–link 选项,参数格式为name:alias 即要连接的容器名称 : 这个连接的别名

再建立一个web2容器,同web的配置,查看环境变量,可以看到与db容器的连接,以DB_开头的环境变量都是提供web连接db的

进入到web容器中查看/etc/hosts .可以看到db容器的信息

在web容器中安装ping命令

1
2
apt-get update 更新源
apt-get install inetutils-ping

docker-数据卷

Posted on 2018-12-16
Words count in article: 903 | Reading time ≈ 3

前言

容器中管理数据主要有两种方式:

  • 数据卷:容器内数据直接映射到本地主机环境
  • 数据卷容器:使用特定容器维护数据卷

数据卷可以提供很多有用的特性:

  • 数据卷可以在容器间共享和重用,容器间传递数据变得高效方便
  • 对数据卷内数据的修改即刻生效,无论容器内操作还是本地操作
  • 对数据卷的更新不会影响镜像,解耦了应用和数据
  • 卷会一直存在,知道没有容器使用,可以安全卸载

在容器内创建一个数据卷

1
docker run -d -P --name web -v /webapp training/webapp python app.py

使用training/webapp 创建一个名为web的容器,在后台运行,自动映射到主机端口,创建一个数据卷挂载到容器的 /webapp 下,并执行app.py文件

可以看到 /webapp 的时间戳发生了变化

挂载一个主机目录作为数据卷

1
docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py

使用training/webapp 创建一个名为web的容器,在后台运行,自动映射到主机端口,加载主机的/src/webapp到容器的/opt/webapp 下,并执行app.py文件

挂载数据卷时,要使用绝对路径,如果目录不存在则会自动创建

可以在容器中看到在宿主机上新建的hello_world文件

挂载一个主机文件作为数据卷

1
docker run --rm -it -v ~/.bash_history:/.bash_history centos /bin/bash

使用centos镜像创建一个容器,当容器为退出状态时自动删除,加载本机的.bash_history 到容器的.bash_history 中

如果直接挂载一个文件到容器,使用文件编辑工具(vim ,sed等等)时,可能造成文件inode变化,造成报错

加载到容器中的文件仍能使用,但是和本机的文件不同步了(具体问题我也没有找到)

数据卷容器

数据卷容器也是一个容器,专门用来提供数据卷供其他容器挂载,使得多个容器间共享一些持续更新的数据

db1和db2 中都可以看到dbdata 创建的test文件

可以多次使用–volumes-from 参数来从多个容器挂载多个数据卷,还可以从其他已经挂载了容器卷的容器来挂载数据卷

1
docker run -d --name db3 --volumes-from db1 training/postgres

使用–volumes-from 参数所挂载数据卷的容器自身并不需要保持在运行状态

删除了挂载的容器,数据卷并不会被自动删除挂载信息,数据卷信息会保存在/var/lib/docker/volumes下

利用数据卷容器迁移数据

可以利用数据卷容器对其中的数据卷备份、恢复,以实现数据的迁移

备份
1
docker run --volumes-from dbdata -v $(pwd):/backup --name worker centos tar -cvf /backup/backup.tar /dbdata

使用centos 镜像创建 ,根据数据卷容器dbdata来挂载数据卷,将本地当前目录挂载到容器worker的/backup,并将/dbdata 归档为/backup下的backup.tar

恢复
1
docker run --volumes-from dbdata -v $(pwd):/backup --name backup centos tar-xvf  /backup/backup.tar

注意事项

挂载宿主机已存在目录后,在容器内对其进行操作,报“Permission denied”。

可通过两种方式解决:

关闭selinux。

1
2
临时关闭:setenforce 0
永久关闭:修改/etc/sysconfig/selinux文件,将SELINUX的值设置为disabled。

以特权方式启动容器

1
2
指定--privileged参数
docker run -it --privileged=true -v /test:/soft centos /usr/bin/init

docker 容器

Posted on 2018-12-13
Words count in article: 1.4k | Reading time ≈ 5

   docker容器是docker的运行实例,在镜像文件上带有可写的文件层。docker容器是一个轻量级应用,能够随时创建和部署、启动、停止

1.使用docker creat 创建新的容器

1
docker create -it centos  创建以个新的Centos容器

使用docker ps -a 查看容器信息

STATUS 为容器运行状态,UP为正常运行,Exited为停止,Created为尚未启动

    creat 命令和后续的run命令支持的选项都十分复杂,主要包括几大类:与容器运行模式相关,与容器和环境配置相关,与容器资源限制和安全保护相关

2.使用docker start 启动容器

1
docker start 10f

可以看到容器状态为UP 代表已经启动。

3. 使用 docker run 新建并启动容器

1
docker run centos /bin/echo "this is new centos "

当利用docker run 来创建并启动容器时,docker在后台运行的标准操作包括:

  1. 检查本地是否存在指定的镜像,不存在就从共有仓库下载
  2. 利用镜像创建一个容器,并启动该容器
  3. 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层
  4. 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器
  5. 从网桥的地址池配置一个ip 地址给容器
  6. 执行用户指定的应用程序
  7. 执行完毕后容器被自动终止

    使用ps命令,可以看到只运行了bash应用,并无其他进程,用户可以输入exit 命令来退出容器

    对于所创建的bash容器,当使用exit命令退出后,容器就自动处于退出(Exited)状态,对于docker 容器来说, 当运行的应用退出后容器也就没有继续运行的必要了

    有时执行docker run会出错,因为命令无法正常执行容器会退出,可以查看默认返回的错误码

常见的有以下几个

  1. 125 Docker daemon 执行出错,例如指定不支持的参数
  2. 126 指定命令无法执行 例如权限出错
  3. 127 容器内命令无法找到

4. 守护状态运行

使docker容器在后台以守护状态运行(Daemonized) 使用-d 参数

1
2
3
4
docker run -d centos /bin/bash -c "while ture ; do echo hello world ; sleep 2;done" 
docker ps ### 查看容器信息
docker logs ### 获取容器输出信息
docker stop ### 停止容器

5. 终止容器

    docker stop 会终止一个运行中的容器,命令格式为 docker stop [-t | –time=[10]] [container]

    首先向容器发送SIGTERM 信号,等待一段超时时间后(默认10秒 ) 在发送信号来终止容器
    docker kill 会 直接发送 SIGKILL 信号来终止容器

 当Docker容器中指定的应用终结时,容器也会自动终止

1
docker ps -qa 查看所有容器的id

    处于终止状态的容器可以通过 docker start命令重新启动,docker restart 会将一个运行态容器先终止再重新启动

6.进入容器

    在使用-d参数后,容器会进入后台,用户无法操作,如果需要进入可以使用官方的attach、exec,和第三方的nsenter

1
2
3
4
docker attach [--detach-keys[ = [ ] ] ] [--no-stdin] [--sig-proxy[=ture]] container 
--detach-keys[ = [ ] ] : 指定退出attach模式的快捷键,默认是ctrl+q 和ctrl+p
--no-stdin=true|false : 是否关闭从标准输入,默认是打开
--sig-proxy=true|false : 是否代理收到的系统信给应用进程,默认true

多个窗口同时使用attach模式连接到同一容器时,所有窗口都会同步显示

1
2
3
4
5
docker exec [-d|--detach] [--detach-keys[=[ ] ] ] [-i|--interactive] [--privileged] [-t|--tty] [-u|--user[=USER] container COMMAND [ARG..]
-i ,--interactive=true|false : 打开标准输入接受用户输入命令,默认false
--privileged-true|false : 是否给执行命令以最高权限 ,默认false
-t,--tty=true|false ; 分配伪终端,默认false
-u ,--user=" " : 执行命令的用户或ID

   通过指定-it 参数来保持标准输入打开,并且分配一个为终端,推荐使用exec命令对容器进行操作

1
docker nsenter 第三方工具

7.删除容器

1
docker rm [-f|--force] [-l | --link] [-v|--volumes] container [container……]

使用该命令来删除处于终止或退出状态的容器

-f ,–force=false :是否强制终止并删除一个运行中的容器

-l,–link=false :删除容器的连接,但是保留容器

-v,–volumes=false : 删除容器挂载的数据卷

8. 导入导出容器

用于容器的系统迁移

1
docker export [-o|--output[=" " ] ] container

可以通过-o 来指定导出的tar文件名,也可以直接重定向实现

导出的文件可以使用docker import 命令导入变成镜像

1
docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL|-[REPOSITORY[:TAG]]
  • docker save :将一个镜像导出为文件,再使用docker
    load –input 命令将文件导入为一个镜像,会保存该镜像的的所有历史记录。比docker
    export命令导出的文件大,很好理解,因为会保存镜像的所有历史记录。

  • docker export :将一个容器导出为文件,再使用docker import命令将容器导入成为一个新的镜像,但是相比docker save命令,容器文件会丢失所有元数据和历史记录,仅保存容器当时的状态,相当于虚拟机快照。

docker-ce安装 与docker镜像(Centos7)

Posted on 2018-12-12
Words count in article: 3.2k | Reading time ≈ 13

安装docker-ce(设置清华大学镜像站为镜像源)

在centos7 yum仓库 的extras仓库中自带了docker源,都是docker 1.13版本,不建议使用老版本docker.

清华大学在镜像站中给docker做了镜像

在此目录下找到docker的repo文件

我们可以自己建一个docker镜像源仓库,首先要把该repo文件下载到/etc/yum.repos.d 中

下载后打开docker-ce.repo文件,文件中指向的地址是docker官方站点,这个下载速度是很慢的,因此还要修改下载路径

仍然选择清华大学镜像站,来到这个目录下,选择稳定版


可以看到这里有最新版本18.06
选择复制链接中的linux父目录https://mirrors.tuna.tsinghua.edu.cn/docker-ce/然后全局替换docker-ce.repo中的官方地址的linux的父目录
用vim打开,在末行模式下进行替换

可以看到替换成功

yum repolist 显示所有仓库,可以看到存在docker-ce的程序包

yum install docker-ce ,完成

启动docker

1
systemctl  start  docker

设置开机自启动

1
systemctl  enable  docker

很简单
镜像是运行docker容器的基础,容器运行前,必须存在对应的镜像,如果本地没有对应的镜像,docker会自动从默认仓库(DockerHub) 下载镜像,如果有本地镜像,也可以从本地仓库下载镜像
获取镜像的主要方式是从共有仓库(DockerHub)下载

搜索并下载镜像(例如调用ubuntu镜像)

1
1.docker  search  ubuntu  搜索ubuntu镜像

其中列出了查找到的镜像名称、描述、星级、官方 、自动化的

1
2.docker pull  ubuntu 下载镜像
1
3.docker images  查看已经下载的镜像文件

参数含义:

REPOSITORY : 镜像来源于哪个仓库
TAG : 镜像标签
IMAGE ID : 镜像id(唯一标识镜像)
CREATED : 镜像创建时间
SIZE : 镜像大小,优秀的镜像往往体积小

  • 如果不指定镜像系统版本,则会下载最新版本镜像,也可以通过指定TAG的方法来下载特定版本的镜像,在生产中不应忽略镜像标签信息或使用默认的latest标签,内容是不稳定的。
  • docker pull 默认从Docker Hub Registry仓库下载镜像,如果从非官方仓库下载,则需要在仓库名称前指定完整的仓库地址 例如docker pull hub.c.163.com/public/ubuntu14.04 即从网易下载

docker tag 为本地镜像任意添加新的标签

1
4.docker tag ubuntu:latest  myubuntu:latest

该命令添加的标签实际起到了类似链接的作用

1
5.docker inspect 获取镜像详细信息(元数据)

返回的时json格式信息,如果想要其中一项内容时,使用-f参数来指定

1
docker inspect -f {{.RepoTag}} ImageID
1
6.docker history 查看镜像历史

镜像文件由多个层组成,docker history 可以查看镜像的创建过程

启动一个基于该ubuntu镜像的容器,并进入该容器

1
2
7.docker run -idt ubuntu /bin/bash
8.docker exec -it /bin/bash

-i是为了让容器能接受用户的输入,-t是指定docker为容器创建一个tty

1
9.df -TH  查看容器文件系统的磁盘使用

保存和载入镜像

用户可以将镜像保存到本地以载入使用,或者将其复制到另外的文件系统

1
10.docker save -o ubuntu_latest_save.tar ubuntu:latest 保存镜像

可以把保存的镜像文件载入到系统中,并载入标签等镜像文件的元数据

1
2
11.docker load < ubuntu_latest_save.tar  载入镜像
12.docker load --input ubuntu_latest_save.tar

删除镜像

查询后可以看到镜像id

1
13.docker rmi IMAGE ID

报错为该镜像被683容器所使用,需要先删除基于这个镜像所创建的容器

docker ps -a 查询容器可以看到存在基于镜像ubuntu的容器
状态为UP ,表示正在运行

1
14.docker stop CONTAINER ID  停止容器
1
15.docker rm  CONTAINER ID删除该容器
1
16.docker rmi IMAGE ID

镜像已经删除。其中删除容器为rm 删除镜像为rmi。可以在待删除的镜像名称前面加参数-f ,强制删除。
后来在DockerFile中推荐以下的命令写法

1
2
3
17.docker container stop
18.docker container rm
19.docker images rm

创建镜像

创建镜像有三种方法,分别是基于本地模板导入镜像、基于已有镜像的容器创建镜像,基于Dockerfile 创建镜像

1> 基于本地模板导入镜像

如果本地有镜像的模板文件,可以基于该模板创建镜像,镜像模板文件也可以从OpenVZ下载

wget http://download.openvz.org/template/precreated/ubuntu-14.04-x86_64-minimal.tar.gz 下载模板文件

下载完成后,执行以下命令,可以用该模板文件创建文件

1
20.cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu-14.04_minimal_amd64

其中 docker import:从归档文件中创建镜像
用法:docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
-c :应用docker 指令创建镜像;
-m :提交时的说明文字;

可以看到刚刚导出的镜像,启动并运行

2>基于已有的镜像容器创建镜像

接上图
在容器中新建一个for_new_image 目录

与原容器相比此时已经发生变化,,可以提交为新镜像

1
21.docker commit -m "creatd new dir" -a "root" 87acd63067e1 new_ubuntu

其中 docker commit :从容器创建一个新的镜像。
语法: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。

提交成功后会返回镜像ID,可以看到新镜像已经存在

3> 基于Dockerfile 创建镜像

    Dockerfile 是一种被Docker程序解释的脚本,每条指令对应linux下的一条命令, Docker程序可以读取Dockerfile脚本,根据指令生成定制的镜像。
Dockerfile指令分为构建指令和设置指令。构建指令用于构建镜像,不会在容器的镜像上运行;设置指令用于设置镜像属性,其操作可以在容器的镜像上执行

(1)FROM

    构建指令,用于指定基础镜像,必须指定,且必须在Dockerfile所有指令之前指定,因为后续指令都依赖该指令指定的镜像,,可以指定DockerHub中的镜像,也可以指定本地仓库中的

(2)MAINTAINER

    构建指令,用于将镜像制作者相关信息写入镜像中,当我们对该镜像执行docker inspect 命令时,会显示该字段

(3)RUN

    构建指令,用于执行任何被基础镜像所支持的命令,例如ubuntu基础镜像只能使用ubuntu命令,centos基础镜像只能使用centos命令

(4)CMD

    设置指令,用于指定容器启动时执行的操作,可以执行自定义脚本,亦可以执行系统命令,,此命令只能在Dockerfile脚本中设置一次,设置多个只会执行最后一个

(5)ENTRYPOINT (entrypoint)

    设置指令,用于指定容器启动时执行的命令,可以在Dockerfile脚本中设置多次,只有最后一个有效

ENTRYPOINT 使用分两种情况 :

    独自使用时,如果同时使用了CMD命令,且CMD指定的是一个完整可执行命令,那么二者会互相覆盖,只有写在最后的那条指令有效;
与CMD指令配合使用,CMD指令可以指定ENTRYPOINT的默认参数,此时CMD指令指定的仅仅是参数部分,而ENTRYPOINT需要使用JSON方式指定需要执行的命令但不能使用参数

(6)USER

设置指令,用于设置启动容器的用户,默认为root

(7)EXPOSE

    设置指令,用于将容器中的端口映射称为宿主机中的摸个端口。极大方便了访问容器 。 宿主机IP:PORT

    需要两步操作,首先在Docerfile中使用 EXPOSE设置需要映射的容器端口号,然后在 docker run 中使用参数 -p 指定前面的端口号,该端口号就会被随机映射称为宿主机中的一个端口号,也可以指定需要映射到宿主机的哪个端口,但要注意指定的端口没有被占用。

    端口映射是Docker比较重要的一个功能,因为每次运行容器时,容器IP不能被指定,而是桥接模式网卡随机生成的,但是宿主机IP地址是固定的,将容器端口映射称为宿主机上的一个端口,可以免去每次访问容器时都要查看容器IP的麻烦

    一个运行中的容器,使用 ==docker port CONTAINER ID== 查看该端口号在宿主机上的映射端口

(8) ENV (environment)

    构建指令,用于在镜像中设置一个环境变量,设置成功后,后续的RUN 指令都可以使用该指令设置的环境

(9)ADD

    构建指令,用于把本地文件添加到容器,默认所有拷贝到容器中文件和文件夹权限为755(-rwxr-xr-x),UID和GID为0,如果是一个目录,那么会将该目录下的所有文件添加到容器,但不包括目录;如果文件是可识别的压缩格式,则docker会进行解压缩

(10)VOLUME

    设置指令, 指定挂载点,用于使容器中某个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用
由于容器使用AUFS文件系统,不能持久化数据,容器关闭后,所有更改也会消失,因此容器有应用持久化数据存储的需求时,可以使用该指令

(11)WORKDIR

    设置指令,可以多次切换目录(cd),可以在RUN, CMD, ENTRYPOINT 命令前使用

(12) COPY (src)…(dest)

    复制本地主机 src (为Dockerfile所在目录的相对路径、文件或目标)下的内容到镜像中的 dest 下。路径不存在时会自动创建。支持正则。

下面展示一则使用Dockerfile创建Tomcat镜像的实例
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
#Pull base image    // 获取基础镜像
FROM ubuntu:latest
MAINTAINER XXX
# LABEL maintainer="XXX"

#update source //更新镜像源
RUN echo "deb http://cn.archive.ubuntu.com/ubuntu xenial main universe">/etc/apt/sources.list
RUN apt-get update

#Install curl // 安装curl
RUN apt-get -y install curl

#Install JDK 8 //安装JDK,其中的cookie使用burpsuit获取
RUN cd /tmp && curl -L 'http://download.oracle.com/otn-pub/java/jdk/8u191-b12/2787e4a523244c269598db4e85c51e0c/jdk-8u191-linux-i586.tar.gz'
-H 'Cookie:s_fid=1CC16A1445A28C96-0DF2FFDC49166DB3; ELOQUA=GUID=25787B725D6B4A1E98D0D92A1C00A0F7; s_nr=1540978397285-Repeat;
RT="sl=23&ss=1540977568733&tt=40261&obo=21&sh=1540977921638%3D23%3A2 1%3A40261%2C1540977919016%3D22%3A21%3A37654%2C1540977918989%3D21%3A20%3A3
7654%2C1540977913741%3D20%3A19%3A37654%2C1540977913712%3D19%3A18%3A37654&dm=oracle.com&si=6be7a975-8d66-41f3-92c8-a5748709fec8&bcn=%2F%2F1288af
19.akstat.io%2F&nu=http%3A%2F%2Fdownload.oracle.com%2Fotn-pub%2Fjava%2Fjdk%2F8u191-b12%2F2787e4a523244c269598db4e85c51e0c%2Fjdk-8u191-linux-i586
.tar.gz&cl=1540978405737";atgRecVisitorId=127AFu33Mp_NNJQHlgn2ZpQPg5vZT6c4TietQ0-KTTWmfuc8127; gpw_e24=https%3A%2F%2Fwww.oracle.com%2Ftechnetwork
%2Fjava%2Fjavase%2Fdownloads%2Fjdk8-downloads-2133151.html; s_cc=true; s_sq=%5B%5BB%5D%5D; oraclelicense=accept-securebackup-cookie'|tar -zx
RUN mkdir -p /usr/lib/jvm
RUN mv /tmp/jdk1.8.0_191 /usr/lib/jvm/java-8-oracle/

#Set Oracle JDK 8 as default Java //配置Java环境
RUN update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-8-oracle/bin/java 300
RUN update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-8-oracle/bin/javac 300

ENV JAVA_HOME /usr/lib/jvm/java-8-oracle/

#Install Tomcat8 //安装Tomcat
RUN cd /tmp && curl -L 'https://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.34/bin/apache-tomcat-8.5.34.tar.gz'| tar -xz
RUN mv /tmp/apache-tomcat-8.5.34/ /opt/tomcat8/

ENV CATALINA_HOME /opt/tomcat8
ENV PATH $PATH:$CATALINA_HOME/bin

#Expose ports
EXPOSE 8090:8080 //设置映射端口,tomcat的8080端口映射为宿主机的8090端口

#Define default command //运行tomcat,查看日志
ENTRYPOINT /opt/tomcat8/bin/startup.sh && tail -f /opt/tomcat8/logs/catalina.out

或

运行Dockerfile要在Dockerfile所在的目录,”./“应为Dockerfile脚本所在目录,否则就会报上下文环境的错误,MV、COPY、ADD的文件位置都是相对于/root 来说的
第一遍执行(使用的第一条命令)时出现很多错误,最后修改成功了,以下截图是第二遍执行(第二条命令) 因此会报使用缓存

在下载jdk的时候,需要加上cookie,没加时出现以下报错

Java和Tomcat程序的安装包下载地址可能会发生变化,因此使用该脚本时先根据实际下载地址对其进行修改,包括解压后的生成路径也会有改变

运行镜像,启动一个基于镜像tomcat的容器,宿主机输入http://localhost:8090 即可访问tomcat

亲测Hexo+Github个人博客搭建

Posted on 2018-11-15
Words count in article: 1k | Reading time ≈ 4

什么是 Hexo?

Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。

安装 Hexo 相当简单
然而在安装前,您必须检查电脑中是否已安装下列应用程序:

  • Node.js
    https://nodejs.org/dist/v10.13.0/node-v10.13.0-x64.msi(Winx64)
  • Git
    https://github.com/git-for-windows/git/releases/download/v2.19.1.windows.1/Git-2.19.1-64-bit.exe(Win x64)

输入 :

1
2
3
node -v
npm -v
git --version

检查Node.js 和 Git 是否 安装成功

在此处,如果Node.js 版本低,在后面的搭建过程中无法顺利执行,建议各位在官网下载最新版本;Git如果没有加入环境变量需要将Git添加到环境变量

在自己认为合适的位置创建一个个文件夹,我的是E:\Personal-blog\hexo ,在命令行界面进入该文件夹,然后使用 npm 即可完成 Hexo 的安装

1
npm install -g hexo-cli

安装完成,可能会有WARN,但不会影响正常使用
然后输入:

1
npm install hexo --save

在这一步时,我遇到如下报错

1
2
3
4
5
npm WARN deprecated titlecase@1.1.2: no longer maintained
npm ERR! Unexpected end of JSON input while parsing near '...":"^0.3.1","benchmark'

npm ERR! A complete log of this run can be found in:
npm ERR! C:\Users\dell\AppData\Roaming\npm-cache\_logs\2018-11-12T15_46_56_713Z-debug.log

解决办法:
更新npm源即可

1
npm config set registry https://registry.npm.taobao.org

Hexo安装完成,检测是否正确安装

1
hexo -v

Hexo的配置

在当前目录下新建一个名为blog的文件夹,用于存放博客网站的信息
在命令行进入blog,初始化该文件夹,并安装所需组件

1
2
hexo init 
npm install

安装完成后,检测是否安装成功

1
hexo g
1
hexo s

根据提示访问https://localhost:4000/

出现该界面说明Hexo在本地的配置完成了。(因为我改了配置文件,所以显示出我的名字,原位置应为Hexo)

注册GitHub账号与配置

https://github.com/
进入网站后,点击Sign up 进行注册, 填写自己的用户名,邮箱,密码(邮箱后面会用到验证账户)

注册完成后,新建代码仓库
点击网页右上角”+” 中的New repo ,新建仓库

在该界面输入仓库名,描述信息,选择共有或私有仓库
注意仓库名要和你的用户名一致(yourname.github.io),否则后面会访问错误

创建完成后会自动显示你的仓库界面

点击选项栏 Setting ,向下拖至此处,将none 选项选为第一个选项,开启GitHub Pages功能 并Save,可以暂时Change theme,以供暂时访问,但是后面我们使用的是Hexo主题,两者并不冲突

一段时间后即可看到提示创建成功

那么Github一侧的配置已经全部结束了。

将GitHub Page与Hexo关联

配置Git个人信息

1
2
3
git config --golbal user.name "username"
git config --global user.email "xxx@example.com"
git config --list //查看用户信息

可以看到如下信息

在合适的位置新建文件夹daemon ,进入到该文件夹中
右击进入 Git Bash

1
$  git init

该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干

在Git bash中

1
2
3
cd ~/.ssh  
ls
cat id_rsa.pub

就可以看到你自己的公钥,复制下来,进入Github的个人设置界面

点击New Ssh Key

将密钥粘贴上,添加就可以了

1
ssh -T git@github.com
成功。

编辑 hexo下的blog下的_config.yml

1
2
3
4
5
6
# Deployment
## Docs: https://hexo.io/docs/deployment.html
deploy:
type: git
repo: https://github.com/CrimsonRomance/CrimsonRomance.github.io
branch: master

编辑daemon.git 下的config

1
2
3
4
5
6
7
8
9
10
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[branch "master"]
remote = https://github.com/CrimsonRomance/CrimsonRomance.github.io
merge = refs/heads/master

然后进入 hexo\blog ,右击进入 git bash

1
2
hexo g   //  生成
hexo d // 部署

如果在 hexo d 出现下面的 错误,

1
npm install --save hexo-deployer-git

安装此扩展即可 ,然后重新 hexo g , hexo d

然后访问网站(https://youname.github.io/)即可

Hello World

Posted on 2018-11-12
Words count in article: 73 | Reading time ≈ 1

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

123
戴树谦

戴树谦

29 posts
10 tags
GitHub E-Mail
© 2019 戴树谦
Theme — NexT.Mist v5.1.4
0%