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 $ sudo yum-config-manager \ --add-repo \ https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.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
即可
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 ~] <!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
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] <!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] running //证明开启中
关闭防火墙 1 2 3 4 [root@kunlv nginx] [root@kunlv nginx] [root@kunlv nginx] 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] <!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 2 3 4 5 6 7 8 [root@localhost ~] firewalld.service disabled 或者: [root@localhost ~] ● 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 ~] [root@localhost ~] 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 ~] [root@localhost ~] Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
重启防火墙
查看防火墙是否开机自启 1 2 3 4 5 6 7 [root@localhost ~] enabled --自启 0 或者: [root@localhost ~] disabled --不自启 1
查看已启动的服务列表 1 2 3 4 5 [root@localhost ~] auditd.service enabled autovt@.service enabled avahi-daemon.service enabled crond.service enabled
开启端口 1 2 3 4 5 6 [root@localhost ~] success 命令含义: –zone –add-port=80/tcp –permanent
查看已经开放的端口 1 2 [root@localhost ~] 80/tcp
屏蔽FirewallD服务 1 2 [root@localhost ~] 还可以通过创建一个firewall.service到/dev/null的符号连接来屏蔽防火墙服务。
反屏蔽FirewallD服务 1 2 [root@localhost ~] 这是反屏蔽FirewallD服务,它会移除屏蔽FirewallD服务时创建的符号链接,故能重新启用服务。
检查是否已安装防火墙