文章目录
  1. 1. CentOS 安装 Docker CE
    1. 1.1. 准备工作
      1. 1.1.1. 系统要求
      2. 1.1.2. 卸载旧版本
    2. 1.2. 使用 yum 安装(亲测)
      1. 1.2.1. 安装 Docker CE
    3. 1.3. 使用脚本自动安装(未亲测)
    4. 1.4. 启动 Docker CE
    5. 1.5. 测试 Docker 是否安装正确
    6. 1.6. 镜像加速
    7. 1.7. 检查加速器是否生效
    8. 1.8. 添加内核参数
  2. 2. Nginx
    1. 2.1. Nginx部署静态站点
      1. 2.1.1. 下面的命令将作为一个静态页面服务器启动
      2. 2.1.2. 当然,也可以使用 Dockerfile 来直接将静态页面内容放在镜像中,内容为:
      3. 2.1.3. 进行访问
    2. 2.2. Nginx中间件(代理,负载均衡)
      1. 2.2.1. run nginx镜像
      2. 2.2.2. 看效果,按道理访问 http://192.168.93.128 就会代理到 http://192.168.93.128:8082 这个地址去的,
      3. 2.2.3. 查看默认防火墙状态(关闭后显示not running,开启后显示running)
      4. 2.2.4. 关闭防火墙
      5. 2.2.5. 再次看看,是否正常了
  3. 3. 知识普及
    1. 3.1. CentOS 7.0 防火墙开启/关闭
      1. 3.1.1. 查看默认防火墙状态(关闭后显示not running,开启后显示running)
      2. 3.1.2. 检查防火墙的状态
      3. 3.1.3. 开启防火墙
      4. 3.1.4. 关闭防火墙
      5. 3.1.5. 重启防火墙
      6. 3.1.6. 查看防火墙是否开机自启
      7. 3.1.7. 查看已启动的服务列表
      8. 3.1.8. 开启端口
      9. 3.1.9. 查看已经开放的端口
      10. 3.1.10. 屏蔽FirewallD服务
      11. 3.1.11. 反屏蔽FirewallD服务
      12. 3.1.12. 检查是否已安装防火墙

CentOS 安装 Docker CE

准备工作

系统要求

  • 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10。

卸载旧版本

1
2
3
4
5
6
7
8
9
10
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine

使用 yum 安装(亲测)

1
2
3
$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2

鉴于官方源比较慢:

1
2
3
4
# 官方源
# $ sudo yum-config-manager \
# --add-repo \
# https://download.docker.com/linux/centos/docker-ce.repo

所以建议添加国内源:

  • 方式一

    1
    2
    3
    $ sudo yum-config-manager \
    --add-repo \
    https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
  • 方式二

    • 备份

      1
      $ mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
    • 下载新的CentOS-Base.repo 到/etc/yum.repos.d/

      CentOS 7

      1
      2
      3
      4
      5
      $ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

      或者

      $ curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

安装 Docker CE

更新 yum 软件源缓存,并安装 docker-ce

1
2
$ sudo yum makecache fast
$ sudo yum install docker-ce

使用脚本自动安装(未亲测)

在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,CentOS 系统上可以使用这套脚本安装:

1
2
$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh --mirror Aliyun

执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker CE 的 Edge 版本安装在系统中。

启动 Docker CE

1
2
$ sudo systemctl enable docker   //机器启动后会自动启动docker
$ sudo systemctl start docker

测试 Docker 是否安装正确

1
$ docker run hello-world  //会自动去官方镜像库里面获取对应的镜像,然后启动

镜像加速

鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,强烈建议安装 Docker 之后配置 国内的镜像加速,

对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

1
2
3
4
5
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}

注意,一定要保证该文件符合 json 规范,否则 Docker 将不能启动。

重新启动服务

1
2
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

检查加速器是否生效

配置加速器之后,如果拉取镜像仍然十分缓慢,请手动检查加速器配置是否生效,在命令行执行 docker info,如果从结果中看到了如下内容,说明配置成功。

1
2
Registry Mirrors:
https://registry.docker-cn.com/

添加内核参数

默认配置下,如果在 CentOS 使用 Docker CE 看到下面的这些警告信息:

1
2
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled

请添加内核配置参数以启用这些功能。

1
2
3
4
$ sudo tee -a /etc/sysctl.conf <<-EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

然后重新加载 sysctl.conf 即可

1
$ sudo sysctl -p

Nginx

Nginx部署静态站点

下面的命令将作为一个静态页面服务器启动

1
$ docker run --name html -p 8082:80 -v /data/html:/usr/share/nginx/html:ro -d nginx

当然,也可以使用 Dockerfile 来直接将静态页面内容放在镜像中,内容为:

1
2
FROM nginx
COPY static-html-directory /usr/share/nginx/html

之后生成新的镜像,并启动一个容器

1
2
$ docker build -t my-nginx .
$ docker run --name html -d my-nginx

开放端口,并映射到本地的 8080 端口

1
$ docker run --name html -d -p 8082:80 my-nginx

Nginx的默认配置文件路径为 /etc/nginx/nginx.conf,可以通过映射它来使用本地的配置文件,例如

1
2
3
4
$ docker run -d \
--name html \
-v /root/container/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
nginx

进行访问

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@kunlv ~]# curl http://192.168.93.128:8082
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>XXX系统</title>
<link rel="stylesheet" href="lib/bootstrap/css/bootstrap.min.css" />
<link rel="stylesheet" href="lib/font-awesome/css/font-awesome.min.css" />
<link rel="stylesheet" href="lib/durandal/css/durandal.css" />
<link rel="stylesheet" href="lib/toastr/css/toastr.min.css" />
<link rel="stylesheet" href="css/layout.css" />
<link rel="stylesheet" href="css/login.css" />
</head>
<body>
<div id="applicationHost" class="app-main">
<div class="loading-splash">
<div class="loading-message">
XXX系统
</div>
<i class="fa fa-spinner fa-spin"></i>
</div>
</div>
<script src="lib/require/require.js" data-main="app/main"></script>
</body>
</html>

现在想通过一个nginx来做统一转发,不管什么应用,我都希望ip+port不变,就可以进行访问,该如何实现呢?

引用一张网上的图片加以表述我的想法:

Nginx中间件(代理,负载均衡)

配置 /root/container/nginx/conf/nginx.conf

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
#user  nobody;
worker_processes 1;

error_log /var/log/nginx/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;


events {
worker_connections 1024;
}


http {
include mime.types;
default_type application/octet-stream;

#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';

#access_log /var/log/nginx/access.log main;

sendfile on;
keepalive_timeout 65;

# 新增
# 访问 http://192.168.93.128 代理到 http://192.168.93.128:8081
upstream html1 {
server 192.168.93.128:8081;
}

# 新增
# 访问 http://192.168.93.128 代理到 http://192.168.93.128:8082
upstream html2 {
server 192.168.93.128:8082;
}

server {
listen 80;
server_name localhost;

#charset koi8-r;

#access_log /var/log/nginx/host.access.log main;
#
location /html1/ {
#root /etc/nginx/html/;
#index index.html index.htm;
# 代理 http://html1/ 最后的/一定需要加上去 参考# #https://blog.csdn.net/maliao1123/article/details/53909006
proxy_pass http://html1/;
}

location /html2/ {
#root /etc/nginx/html/;
#index index.html index.htm;
# 代理
proxy_pass http://html2/;
}

location /user/ {
root /etc/nginx/html/;
index user.html index.htm;
}

#访问根路径
location / {
root /etc/nginx/html/;
index index.html index.htm;
}


#error_page 404 /404.html;

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

run nginx镜像

1
$ docker run --name nginx -p 80:80 -v /root/container/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx

看效果,按道理访问 http://192.168.93.128 就会代理到 http://192.168.93.128:8082 这个地址去的,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@kunlv nginx]# curl http://192.168.93.128
<!DOCTYPE html>
<html>
<head>
<title>Error</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>An error occurred.</h1>
<p>Sorry, the page you are looking for is currently unavailable.<br/>
Please try again later.</p>
<p>If you are the system administrator of this resource then you should check
the error log for details.</p>
<p><em>Faithfully yours, nginx.</em></p>
</body>
</html>

出乎意料中,出现了没有想到的错误!(这个错误耗费了很多时间,最终排查到是防火墙没有关闭导致)

查看默认防火墙状态(关闭后显示not running,开启后显示running)

1
2
[root@kunlv nginx]# firewall-cmd --state
running //证明开启中

关闭防火墙

1
2
3
4
[root@kunlv nginx]# systemctl stop firewalld.service
[root@kunlv nginx]#
[root@kunlv nginx]# firewall-cmd --state
not running //证明关闭了

再次看看,是否正常了

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@kunlv nginx]# curl http://192.168.93.128
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>XXX系统</title>
<link rel="stylesheet" href="lib/bootstrap/css/bootstrap.min.css" />
<link rel="stylesheet" href="lib/font-awesome/css/font-awesome.min.css" />
<link rel="stylesheet" href="lib/durandal/css/durandal.css" />
<link rel="stylesheet" href="lib/toastr/css/toastr.min.css" />
<link rel="stylesheet" href="css/layout.css" />
<link rel="stylesheet" href="css/login.css" />
</head>
<body>
<div id="applicationHost" class="app-main">
<div class="loading-splash">
<div class="loading-message">
XXX系统
</div>
<i class="fa fa-spinner fa-spin"></i>
</div>
</div>
<script src="lib/require/require.js" data-main="app/main"></script>
</body>
</html>

大功告成,问题解决,搞了大半天才想起来防火墙没有关闭导致!

知识普及

CentOS 7.0 防火墙开启/关闭

查看默认防火墙状态(关闭后显示not running,开启后显示running)

1
[root@localhost ~]# firewall-cmd --state

检查防火墙的状态

1
2
3
4
5
6
7
8
[root@localhost ~]# systemctl list-unit-files|grep firewalld.service
firewalld.service disabled
或者:
[root@localhost ~]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead) --表示防火墙已经关闭
Docs: man:firewalld(1)

开启防火墙

1
2
3
4
[root@localhost ~]#systemctl start firewalld.service       --启动firewall
[root@localhost ~]# systemctl enable firewalld.service --开机时启动firewall
Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service.

关闭防火墙

1
2
3
4
[root@localhost ~]#systemctl stop firewalld.service            --停止firewall
[root@localhost ~]# systemctl disable firewalld.service --禁止firewall开机启动
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

重启防火墙

1
[root@localhost ~]# systemctl restart firewalld.service

查看防火墙是否开机自启

1
2
3
4
5
6
7
[root@localhost ~]# systemctl is-enabled firewalld.service;echo $?
enabled --自启
0
或者:
[root@localhost ~]# systemctl is-enabled firewalld.service;echo $?
disabled --不自启
1

查看已启动的服务列表

1
2
3
4
5
[root@localhost ~]# systemctl list-unit-files|grep enabled
auditd.service enabled
autovt@.service enabled
avahi-daemon.service enabled
crond.service enabled

开启端口

1
2
3
4
5
6
[root@localhost ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent
success
命令含义:
–zone #作用域
–add-port=80/tcp #添加端口,格式为:端口/通讯协议
–permanent #永久生效,没有此参数重启后失效

查看已经开放的端口

1
2
[root@localhost ~]# firewall-cmd --list-port
80/tcp

屏蔽FirewallD服务

1
2
[root@localhost ~]#systemctl mask firewalld
还可以通过创建一个firewall.service到/dev/null的符号连接来屏蔽防火墙服务。

反屏蔽FirewallD服务

1
2
[root@localhost ~]#systemctl unmask firewalld
这是反屏蔽FirewallD服务,它会移除屏蔽FirewallD服务时创建的符号链接,故能重新启用服务。

检查是否已安装防火墙

1
[root@localhost ~]#yum install firewalld firewall-config
文章目录
  1. 1. CentOS 安装 Docker CE
    1. 1.1. 准备工作
      1. 1.1.1. 系统要求
      2. 1.1.2. 卸载旧版本
    2. 1.2. 使用 yum 安装(亲测)
      1. 1.2.1. 安装 Docker CE
    3. 1.3. 使用脚本自动安装(未亲测)
    4. 1.4. 启动 Docker CE
    5. 1.5. 测试 Docker 是否安装正确
    6. 1.6. 镜像加速
    7. 1.7. 检查加速器是否生效
    8. 1.8. 添加内核参数
  2. 2. Nginx
    1. 2.1. Nginx部署静态站点
      1. 2.1.1. 下面的命令将作为一个静态页面服务器启动
      2. 2.1.2. 当然,也可以使用 Dockerfile 来直接将静态页面内容放在镜像中,内容为:
      3. 2.1.3. 进行访问
    2. 2.2. Nginx中间件(代理,负载均衡)
      1. 2.2.1. run nginx镜像
      2. 2.2.2. 看效果,按道理访问 http://192.168.93.128 就会代理到 http://192.168.93.128:8082 这个地址去的,
      3. 2.2.3. 查看默认防火墙状态(关闭后显示not running,开启后显示running)
      4. 2.2.4. 关闭防火墙
      5. 2.2.5. 再次看看,是否正常了
  3. 3. 知识普及
    1. 3.1. CentOS 7.0 防火墙开启/关闭
      1. 3.1.1. 查看默认防火墙状态(关闭后显示not running,开启后显示running)
      2. 3.1.2. 检查防火墙的状态
      3. 3.1.3. 开启防火墙
      4. 3.1.4. 关闭防火墙
      5. 3.1.5. 重启防火墙
      6. 3.1.6. 查看防火墙是否开机自启
      7. 3.1.7. 查看已启动的服务列表
      8. 3.1.8. 开启端口
      9. 3.1.9. 查看已经开放的端口
      10. 3.1.10. 屏蔽FirewallD服务
      11. 3.1.11. 反屏蔽FirewallD服务
      12. 3.1.12. 检查是否已安装防火墙