dockerfile nginx,稳定的静态swagger接口服务
dockerfile nginx,稳定的静态swagger接口服务详细介绍
本文目录一览: docker如何编写网页?
pull一个web服务器
例如nginx
后面启动一下nginx
启动容器
用vim编辑 html文件
把文件传到nginx容器内
完工
Docker 是一种流行的容器化技术,可以帮助开发人员快速创建和部署应用程序。如果您想在 Docker 中编写网页,可以按照以下步骤:
1. 选择一个适合您的 Web 开发框架,例如 Node.js、Ruby on Rails 或 Flask 等。
2. 创建一个 Dockerfile 文件,用于构建 Docker 镜像。您可以在 Dockerfile 中指定所需的操作系统、安装所需的软件包、将应用程序复制到容器中等。
3. 在 Dockerfile 中设置端口映射。这将允许您将容器内部的端口映射到主机上的端口,以便您可以通过 Web 浏览器访问您的网页。
4. 在 Dockerfile 中设置 CMD 指令,以便在容器启动时运行您的应用程序。
5. 使用 docker build 命令构建 Docker 镜像。
6. 使用 docker run 命令启动 Docker 容器,并将主机端口与容器端口进行映射。
7. 在 Web 浏览器中访问您的网页,以确保它可以正常工作。
需要注意的是,Docker 可以帮助您轻松地创建和部署应用程序,但是网页的编写和设计仍然需要您自己完成。
18.需要使用docker在后台运行一个nginx服务器需要
需要使用docker在后台运行一个nginx服务器需要docker容器部署方式。方法如下:1、docker构建mysql环境+docker构建项目自身环境。2、Vue项目:使用docker启动nginx服务器方式代理部署。3、项目使用mysql8.0作为数据源,部署时需要使用docker构建mysql环境及项目自身环境。4、连接出现1251错误时:将项目进行打包:“mumu-0.0.1-SNAPSHOT.jar到此,springboot项目采用docker”方式运行部署结束。5、使用docker容器方式运行nginx服务器即可。
docker+nginx 踩坑之路
????为了这个demo,没有少踩坑。记录之,免得以后又忘记了......
? ? 话不多说,首先在虚拟机中安装 Centos 7.5 版本。安装core版本的话想要界面操作,就需要在安装Gnome桌面。
????安装好了之后,就是 docker的安装,用yum 安装方便快捷。
????然后就是docker 容器中 nginx的安装。
????1.docker pull nginx。? 使用该命令默认安装最新版,指定版本请用:docker pull nginx:1.15。可以使用docker image ls 查看是否安装成功。安装成功会有2个镜像nginx和hello-world,这是默认的;maps是我自己后面加地,如下图。
????2.docker 和nginx都有了,那就开始搞应用程序上去。xftp、xshell 用的比较多,但是最简单的还是系统自带 cp 和scp。cp可以实现在本机的文件拷贝。 scp 可以本地上传至linux服务器,ex: scp -r e:\html\demo root@ remoteIP:/path/file? .-r 表示递归 复制 。注意需要输入服务器登陆密码。scp 可以理解成用了ssh登录的cp命令。
3.文件上传之后需要制作docker用的镜像。以angular工程为例,项目根目录创建 Dockfile 文件,不带后缀名:
文件内容:
FROM 表示使用nginx 作为基镜像创建。
COPY 需要将文件复制到的位置?/usr/share/nginx/html/
ExPOSE?指定容器在运行中监听的端口。
CMD 具体参看
配置好了之后在本机打包angular程序,将Dockerfile 拷贝到 dist文件中,如果dist 下有项目名,则拷贝到项目名下,与assets和src同级。将Dockerfile 修改为:
利用第二步操作,将打包后的项目文件上传之服务器。此处有不同的处理,第一个就是在本机安装Docker 在本机生成docker镜像,第二一个就是上传到服务器,在服务器上生成镜像。由于我是linux新手,所以想多整一下,我就上传到linux 上去生成镜像。
4.制作镜像。docker build 命令。? 例如:
注意:1.我是进入到项目文件的的目录操作的,
? ? ? ? ? 2.一定注意命令最后 的? ?"." 表示在当前目录执行
如果配置成功,生成完成
build 成功后,利用 docker images 查看是否存在,
5.现在开始 让镜像跑起来,就是发布网站嘛。 docker run.
详解:-d 代表让容器在后台运行,不占据命令窗口
? ? ? ? --name 为镜像容器取一个好听的名字? maps
? ? ? ? -p 指定端口。5201是客服端访问的端口,80是上面配置的监听端口。
????????maps:v1.0? 是镜像的名字,这里也可以用镜像的ID。
可以利用 docker ps 查看是否运行成功。成功的话,那么你访问localhost:5201 或者 服务器ip:5201 就可以看到你的应用程序了,开篇第一图。
查阅的资料:
还有好些在实际操作过程中页面关闭了,不好意了大牛们...
感谢以上前辈的付出。
docker下如何搭建MySQL+php-fpm+nginx容器环境,本文详解
配置容器(进入容器)docker exec -it your_mysql bash进入之后,要对用户进行授权,以便使用远程连接连接mysql 输入密码:ziqin666执行如下命令GRANT ALL PRIVILEGES ON *.* TO "root"@"localhost" IDENTIFIED BY "ziqin666";GRANT ALL PRIVILEGES ON *.* TO "root"@"%" IDENTIFIED BY "ziqin666";GRANT ALL PRIVILEGES ON *.* TO "root"@"127.0.0.1" IDENTIFIED BY "ziqin666";FLUSH PRIVILEGES;此时可以使用客户端连接一下看看。(一定要把安全组规则对应端口打开)二、构建php-fpm容器准备工作php.ini 默认是不存在的在/home/app/phpfile文件夹下创建 php.ini文件和conf.d文件夹创建容器 docker run -p 9000:9000 --name your_phpfpm -v /home/app/html:/var/www/html -v /home/app/phpfile:/usr/local/etc/php --link your_mysql:mysql -d php:5.6-fpm命令说明:--name your_phpfpm: 将容器命名为 your_phpfpm。-v /home/app/html:/var/www/html: 将主机中项目的目录 /home/app/html 挂载到容器的 /var/www/html安装 pdo 以便后边测试数据库连接,在docker的php容器中可以这样来安装docker-php-ext-install pdo_mysql安装其他插件也可以使用这种办法并加入到php.iniextension=php_curl.dllextension=php_gd2.dllextension=php_mysql.dllextension=php_mysqli.dllextension=php_pdo_mysql.dllextension=php_pdo_odbc.dllextension=php_pdo.dll如果插件还不够就需要自己定制镜像FROM php:7.0.12-fpmMAINTAINER Tairy
WORKDIR /workingRUN apt-get update --fix-missing && apt-get install -y g++ autoconf bash git apt-utils libxml2-dev libcurl3-dev pkg-config && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone && docker-php-ext-install iconv curl mbstring xml json mcrypt mysqli pdo pdo_mysql zip && docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-png-dir=/usr/include/ --with-jpeg-dir=/usr/include/ && docker-php-ext-install gd && docker-php-ext-enable gd && pecl install /pecl/redis-3.0.0.tgz && docker-php-ext-enable redis && apt-get purge -y --auto-remove && rm -rf /var/cache/apt/* && rm -rf /var/lib/apt/lists/* && rm -rf /pecl三、安装nginx配置文件目录:/home/app/nginx/conf.d(注释:没有的文件自主创建哈)在配置文件目录新建 default.confserver{listen 80;server_name localhost;location / { root /usr/share/nginx/html; index index.html index.htm; }location ~ .php$ { fastcgi_pass your_phpfpm:9000; #此处写docker里边php 的名称: your_phpfpmfastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;include fastcgi_params; } error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}}创建容器docker run -p 81:80 --name your_nginx -v /home/app/nginx/www:/usr/share/nginx/html -v /home/app/nginx/conf.d:/etc/nginx/conf.d --link your_phpfpm:phpfpm -d nginx:latest映射容器中的phpfpm和mysql都为固定,不能修改!这里需要配置nginx使用用户,即把/etc/nginx/nginx.conf里的nginx用户修改为www-data,同时把/home/app/nginx/www下的文件所有者改为www-data:www_data,否则访问会有权限问题chown -R www-data:www-data www四 、 测试1、查看服务docker ps -aSTATUS 皆为up ,即运行中2、测试 php解析在宿主机/home/app/nginx/www/目录下修改 index.php 文件。
<!--?php echo phpinfo();3、测试mysql 链接修改 index.php<?php//echo phpinfo();$dbms="mysql"; //数据库类型$host="your_mysql"; //数据库主机名,此处写mysql 容器的名字$dbport = "3306";$dbName="mysql"; //使用的数据库$user="root"; //数据库连接用户名$pass="123456"; //对应的密码$dsn="$dbms:host=$host;port=$dbport;dbname=$dbName";try { $dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象 echo "successful
"; //你还可以进行一次搜索操作 // foreach ($dbh->query("SELECT * from user") as $row) { // print_r($row); //你可以用 echo($GLOBAL); 来看到这些值 // } $dbh = null;} catch (PDOException $e) { die ("Error!: " . $e->getMessage() . "
");}访问ip , 到正确的输出,就证明我们的配置成功了。最后注意:很多人在学Java高级过程中难免会遇到各种问题解决不了。为此我建了个裙 783802103,里面很多架构师一起交流解答,没基础勿进哦!本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理docker下如何搭建MySQL+php-fpm+nginx容器环境,本文详解标签:名称-name测试数据csharpcatch题解fastcgidata-目的
稳定的静态swagger接口服务
如果你有类似的疑问,这篇文章可以帮助你。
项目源码地址: github
出于稳定性考虑,在提测前不允许发布到测试环境,开发阶段如何保障swagger接口的稳定性?
在安装了docker的机器,通过 run.sh 可以执行镜像build及容器运行。
Dockerfile
就是一个 nginx 服务,提供了http访问json的能力。
Dockerfile
nginx.conf 中配置跨域操作 Access-Control-Allow-Origin *
static 目录下是接口json文件
通过 http://localhost:8080/v2/api-docs 获取json文件,命名后push到git项目 api 目录下
浏览器访问swagger-ui服务,并在窗口输入json文件访问路径 https://localhost:8080/demo_api_2.json ,然后就可以看到swagger接口定义。
看了一下 swagger-ui 的镜像实现,内部也是一个nginx,运行js。所以没必要自己搞一套nginx,直接把json文件copy到 swagger-ui 即可。
更新后到swagger服务Dockerfile如下
关于 缺陷2 可以考虑使用 API_URLS 环境变量实现,但是设置后,不能自定义输入jsonUrl
效果图如下
基于 Docker 安装 Nginx,启动运行,外网访问,映射配置文件
基于 Docker 安装 Nginx
查找Nginx镜像
语法:docker search nginx
示例:
获取Nginx镜像
示例:
启动nginx容器实例
说明:--name nginx nginx 第一个nginx是通过--name指定的nginx容器实例的名称,另一个nginx表示nginx仓库的名称。
查看nginx容器实例的进程信息
通过ps -ef | grep nginx查看
进入nginx容器内
杀死nginx容器实例
停止nginx实例
启动nginx容器实例
重启nginx容器实例
移除nginx容器实例
案例
暴露外部端口
基于docker run -d --name nginx nginx方法启动nginx后,Docker 容器并没有对外暴露访问的端口,即无法通过当前主机外部浏览器器访问nginx。那么该怎么样呢?
语法:
-p 80:80:通过-p来指定Docker容器中nginx实例对外开放的端口。本例中,第一个80端口是对外开放的端口,第二个80端口指对外开放的端口映射到容器里的端口号。
示例:
通过当前主机外的浏览器访问nginx,如下图:
指定外部的配置文件
语法:
说明:
-v: 表示挂载一个本机目录或文件到容器里。
-v /develop/nginx/nginx.conf:/etc/nginx/nginx.conf:将/develop/nginx/nginx.conf配置文件挂载到容器中/etc/nginx/nginx.conf这个配置文件中。
-v /develop:/develop:将/develop这个目录挂载到容器里的/develop这个目录里。
示例:
注意事项:指定外部配置文件,同时需要指定nginx的首页面,否则会抛出404错误,原因就是因为nginx找不到配置文件中默认的index页面。
本例中,使用/develop/apps/static/index.html替代了容器里的nginx默认的index页面,同时,-v /develop:/develop挂载根目录即可访问子目录。
指定网络模式:--net=bridge 默认模式
其中8080是指主机的端口,而80是指容器的端口
我们先看一下端口的状态
docker是运行在Linux上的,在Windows中运行docker,实际上还是在Windows下先安装了一个Linux环境,然后在这个系统中运行的docker。也就是说,服务中使用的localhost指的是这个Linux环境的地址,而不是我们的宿主环境Windows。我们可以通过命令:
找到这个Linux的ip地址,一般情况下这个地址是192.168.99.100,然后在Windows的浏览器中,输入这个地址,加上服务的端口即可启用了。
Ubuntu 16.04下Docker部署SpringBoot、Mysql、Redis、Nginx和Vue
本文以开源项目SpringBlade和Saber为例。
1、创建自定义网络 目的是将用到的服务都放到同一个网络段,以方便互相通信。 docker network create --subnet 172.19.0.0/16 mynetwork
2、Docker安装MySQL、Redis、Nginx (1)安装MySQL docker pull mysql:5.7.30 cd ~ mkdir docker/mysql/{conf,logs,data} -p cd docker/mysql docker run --name mysql_blade --network=mynetwork --ip=172.19.0.6 -p 3307:3306 -v PWD/logs:/var/log/mysql -v PWD/data:/data:rw -v $PWD/conf/redis.conf:/etc/redis/redis.conf:ro --privileged=true --name redis-6389 -d redis redis-server /etc/redis/redis.conf (3)安装Nginx 将Saber发布到Nginx中要用到 docker pull nginx 2、Docker打包SpringBlade
3、Docker打包并发布Saber (1)编写nginx.conf cd Saber touch nginx.conf,写入以下内容: //nginx.conf开始 user root; worker_processes 1;
error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;
events { worker_connections 1024; }
http { include /etc/nginx/mime.types; default_type application/octet-stream;
} //nginx.conf结束 (2)修改env.js文件 baseUrl要与下面的SpringBlade容器的地址和端口匹配:
(3)编写Dockerfile 编写dockerfile并将其放到与dist同一目录: FROM nginx VOLUME /tmp ENV LANG en_US.UTF-8 ADD ./dist/ /usr/share/nginx/html/ COPY./nginx.conf /etc/nginx/ EXPOSE 1889 EXPOSE 443 (4)打包并发布 cd ~ mkdir docker/saber/conf -p cd docker/saber cp ~/Saber/nginx.conf conf yarn run build docker build -t saber:1.0 .(注意最后的.) docker run -itd --name saber --network=mynetwork --ip=172.19.0.8 -p 1889:1889 -v $PWD/conf:/mnt/ saber:1.0
4、Docker打包并发布SpringBlade (1)pom.xml配置 /
10.10.0.127:10080
blade
0.0.1
1.4.10
SpringBlade
src/main/resources
src/main/java
* / .xml
org.springframework.boot
spring-boot-maven-plugin
{project.build.finalName}
repackage
com.spotify
dockerfile-maven-plugin
{project.basedir}
true
{docker.registry.name}/ {docker.image.tag}
target/ {java.version}
${java.version}
UTF-8
-parameters
(2)yml配置 redis及mysql都要与前面的创建容器时的配置相同:
(3)创建私有仓库(利用Harbor) 在harbor管理界面创建项目blade,下面上传镜像的时候要加入项目路径。 (4)打包 mvn clean install dockerfile:build -Dmaven.test.skip=true (5)上传到私有仓库 两种方式: mvn dockerfile:push 或者docker push 10.10.0.127:10080/blade/springblade:0.0.1 然后在Harbor管理后台就可以看到镜像了。 要pull下来的话: docker pull 10.10.0.127:10080/blade/springblade:0.0.1 (6)发布 cd ~ mkdir docker/blade/app -p cd docker/blade docker run -itd --name blade --network=mynetwork --ip=172.19.0.7 -p 9001:9001 -v $PWD/app:/mnt/ 10.10.0.127:10080/blade/springblade:0.0.1
至此,就可以通过localhost:1889来访问Saber了。
另外,我通过uri来区分多租户。例如localhost:1889是管理租户,localhost:1889/test是名为test的租户。这样就避免了在登录界面填写租户id。
Nginx反向代理docker容器进行域名解析绑定的实现方法
可以把多个域名映射到同一个IP地址上
docker 镜像名称由REPOSITORY和TAG组成 [REPOSITORY[:TAG]] ,TAG默认为latest
在宿主机创建持久化 conf--配置目录 html--静态网站目录 logs--日志目录 cert--存放证书目录
将容器内的 nginx.conf 与 default.conf 文件分别拷贝到主机/mnt/nginx与目录/mnt/nginx/conf下,分别执行
conf目录下创建nginx.conf文件
首先要在域名管理中做好域名简析
在conf.d目录下创建 域名为ab.baidu.com的配置文件 ab.baidu.com.conf 文件 包含ssl证书
在conf.d目录下创建 域名为gh.baidu.com的配置文件 gh.baidu.com.conf 文件 包含ssl证书
ginx.conf并没有在etc/nginx/conf目录下。
允许https访问 的 default.conf 文件
将服务器的配置文件挂载到容器中,这样我们修改配置文件会方便一些。
退出nginx容器,将容器中的文件nginx.conf先拷贝到宿主机中,conf.d目录下的 default.conf 文件拷贝出来
执行 docker stop ef 命令停止刚刚创建的nginx容器,ef是容器Id,然后执行 docker rm ef 移除容器,
-v /docker-root/nginx/conf/nginx.conf :/etc/nginx/nginx.conf
/docker-root/nginx/conf/nginx.conf 宿主机中的ngix配置文件 挂载 到容器的 /etc/nginx/nginx.conf 配置文件
-v /docker-root/nginx/conf/conf.d:/etc/nginx/conf.d
/docker-root/nginx/conf/conf.d 宿主机中的 配置目录 conf.d 挂载到 容器的 /etc/nginx/conf.d 目录上
-v /docker-root/nginx/cert:/cert/
映射ssl 证书文件
命令,重新创建nginx容器
这样就可以将配置文件、log、静态页面映射到宿主机中。需要修改或者查看直接在宿主机中修改或者查看就可以了。需要注意的是, 配置文件虽然映射到宿主机中,但是如需配置路径,还需配置成容器中的路径 。
注意发布到 云服务器上 服务器安全组是否开放了443端口。
把 vue 生成的 dist目录下的文件 上传到 服务器
/root/docker-root/vue-mcyl-src
文件目录 dist 目录 Dockerfile 文件
转到 此目录下
使用下面的命令 生成镜像
启动容器
docker run -d mcyl-vue:v1.0
conf.d 目录下的配置文件 default.conf
防火墙原因,需要将通信的端口开放
解决办法:
firewall-cmd --zone=public --add-port=9080/tcp --permanent
firewall-cmd --zone=public --add-port=8080-8080/tcp
参考 http://www.ttlsa.com/web/multiple-https-host-nginx-with-a-ip-configuration/
Docker 入门 (07) 部署nginx 并且映射本地配置文件
目标:
1. 利用docker部署一个nginx容器
2.为nginx 容器设置配置文件 , 并且映射到宿主机(本机)
操作步骤:
1.拉取nginx镜像,并尝试简单运行(忘记怎么操作请参考第五节)
2.在本地新增配置文件 , 为了后面映射容器使用 ,我习惯是放到 /etc/docker/nginx-config , 按你个人习惯新增
3.进入config ,我们需要创建一个简单配置文件 , 这里就来个简单的吧
4.因为我稍后需要占用的是8080端口 , 请确认云服务器端是否开放
5. 万事俱备 , 尝试启动吧
6. 使用你的 服务器ip+8080端口访问测试 , 看到您的写的 index,html 内容, 代表启动成功!
7.具体映射位置 可以 使用?docker?exec?-it?[容器ID]?/bin/bash 命令去参考对应映射文件 ,原理就应该明白了
结语:
通过本节的 nginx 映射本地配置文件 , 应该掌握对docker映射文件的基本使用了 , 希望大家都把自己的nginx跑起来吧
Ingress-nginx日志切割与轮循方案
一, 基础镜像
由于我们已解决了权限的问题,所以不需要initContainer来更改权限。日志切割和轮循,基于镜像:hub.c.163.com/combk8s/logrotate:v1.1
从history看,这个镜像也只是在alpine之上,安装了bash,logrotate软件,然后,拷贝并启动了start.sh文件。
二, Dockerfile
为了不与k8s绑死,我们不使用configmap作配置文件,而是使用使用环境变量生成nginx.log配置。
Dockerfile
nginx.log模板
start.sh重写
脚本使用传入的环境变量,替换掉nginx.log模板文件中的对应变量。没有环境变量时,也提供必要默认值。
暂时计划是每天凌晨产生备份,只保存最近两个备份。
三, Yaml集成
在ingress应用的yaml文件里,植入一个新的container即可。
四,验证
kubectl logs -f pod可以看到crontab输出
五, logrotate和crontab联动细节想像
start.sh中写入/etc/crontabs/root文件中的数据:
0 */2 * * * /usr/sbin/logrotate -v /etc/logrotate.conf
表示logrotae命令每2小时执行一次,它会将nginx.log配置中的周期(daily)写入/etc/periodic/daily/logrotate文件(如果设置了size,会无视 daily, weekly,monthly 指令,所以size的优先级比较高。)。
/etc/periodic/daily/logrotate中的动态生成的内容如下:
此文件会被/etc/crontabs/root中的如下行触发:
0 2 * * * run-parts /etc/periodic/daily
于是,这时就会在每天凌晨2点,生成日志切割和归档文件。
神奇~
六,Logrotate参数
compress/nocompress---gzip压缩/不压缩
copytruncate/nocopytruncate---用于还在打开中的日志,把当前日志备份并截断/备份但是不截断
create mode ower group/nocreate---指定文件模式创建新的日志文件/不创建新的日志文件
delaycompress/nodelaycompress ---和compress一起,日志到下一次转存是压缩/转存同时压缩
ifempty/notifempty ---空文件也转存,默认/空文件不转存
mail address / nomail--- 日志发送到指定的mail地址
olddir directory/noolddir--- 转存后日后i文件放入指定目录,必须和当前日志文件同一个文件系统
prerotate/endscript--- 在执行转存之前需执行的命令,关键字必须单独占行
postroutate/endscript ---在执行转存之后需执行的命令,关键字必须单独占行
daily ---周期每天
weekly ---周期每周
monthly ---周期每月
rotate count ---转存次数,0表示不备份,5表示保留5个备份
size size ---当指定文件达到指定大小时才转存
tabootext[+] list ---不转存指定的扩展名,默认扩展名含.rpm-oring
error address ---错误信息发送到指定的mail地址
missingok ---如果日志文件丢失,进入到下一个不发出错误消息
sharedscripts ---可以写多个日志文件,同时执行一个脚本,搭配脚本关键字
include ---包含文件
dateext ---为日志打上日期标签
七,参考URL
https://my.oschina.net/u/4605142/blog/4521708
https://www.jb51.net/article/183828.htm