Docker部署nginx+tomcat+mysql+redis+fastdfs

Linux内存清理

清除cache
echo 1 > /proc/sys/vm/drop_caches

Docker-compose

1.安装略
2.docker-compose -v
3.docker-compose pull:拉取镜像
4.docker-compose up -d:容器启动并后台运行

日志查看

docker logs -f “xxx”

nginx

  1. Dokcerfile构建

下载nginx(-P可以指定目录)

wget -P ./ http://nginx.org/download/nginx-1.9.7.tar.gz

Dockerfile:

FROM centos
 
RUN yum -y install gcc make pcre-devel zlib-devel tar zlib
ADD nginx-1.15.2.tar.gz /usr/src/
RUN cd /usr/src/nginx-1.15.2 \
    && mkdir /usr/local/nginx \
    && ./configure --prefix=/usr/local/nginx && make && make install \
    && ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ \
    && nginx
 
#RUN rm -rf /usr/src/nginx-1.15.2
 
EXPOSE 80

后台启动容器
–name nginx:容器名称。
-p 80:80: 端口进行映射。
-d nginx: 设置容器在在后台一直运行。

docker run -d -p 80:80 --name nginx nginx:v1

查看状态,但是此时不能访问80接端口

docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES
dde4748b6210        nginx:v1            "/bin/bash"         7 seconds ago       Up 5 seconds        0.0.0.0:80->80/tcp   nginx

进入容器,启动nginx后可以访问80端口

root@instance-20y0syed:~# docker exec -it nginx bash
[root@dde4748b6210 /]# nginx
[root@dde4748b6210 /]# exit 
  1. 直接拉取nginx镜像
docker pull nginx:latest

启动容器后会自动启动nginx

 docker run -d -p 81:80 --name nginx_81  nginx:latest 
  1. 外部资源挂载

创建需要挂载的文件夹

mkdir -p /usr/jrdee/nginx/{
    
    conf,logs,static}

编辑nginx.conf


#user  root;
worker_processes  1;

events {
    
    
    worker_connections  1024;
}

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
    
    
        listen       80;
        server_name  localhost;
		
		location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma|ico)$ {
    
    
			root /static;	
			expires 30d;
		}
		location ~ .*\.(js|css)?$ {
    
    
			root /static;
			expires 1h;
		}
		
        location / {
    
    
			proxy_set_header Host $host;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_pass http://127.0.0.1:2727/;
		}

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

PS:root /static
查找资源在docker容器中绝对位置,与本机路径无关

启动容器并实现挂载

docker run -p 80:80 --name nginx_80 -v $PWD/static:/static -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf -v $PWD/logs:/wwwlogs  -d --privileged=true nginx

PS:这里指定了挂载的位置,如上面的-v $PWD/static:/static,等于是将本机文件夹拷贝到了容器中,后面的nginx.conf同理

Mysql

直接拉取5.7

docker pull mysql:5.7

创建挂载目录

mkdir -p /usr/jrdee/mysql/{
    
    conf.d,data}
vim /usr/jrdee/mysql/my.cnf

my.cnf内容:

[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

启动容器

docker run --restart=always --privileged=true -d -v $PWD/data/:/var/lib/mysql -v $PWD/logs:/var/log/mysql -v $PWD/my.cnf:/etc/mysql/my.cnf -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

–privileged=true:容器内的root拥有真正root权限,否则容器内root只是外部普通用户权限
–restart=always:当 Docker 重启时,容器自动启动

使用docker-compose:

version: '0.0.1'
services:
    mysql:
        environment:
            MYSQL_ROOT_PASSWORD: "123456"
        image: "mysql:5.7"
        restart: always
        volumes:
            - "$PWD/data/:/var/lib/mysql"
            - "$PWD/logs:/var/log/mysql"
            - "$PWD/my.cnf:/etc/mysql/my.cnf"
        ports:
            - "3306:3306"

Redis

拉取镜像

docker pull redis

创建文件夹data和文件redis.conf

requirepass health_123
appendonly yes
daemonize no

docker-compose

version: '0.0.1'
services:
    redis:
        image: redis
        restart: always
        command: redis-server /etc/redis/redis.conf
        volumes:
                          - "./redis.conf:/etc/redis/redis.conf"
                          - "./data:/data"
        ports:
            - 6379:6379

tomcat

  1. Dockerfile
FROM centos
MAINTAINER ld

ADD jdk-8u221-linux-x64.tar /usr/jrdee/tomcat
#将宿主机的tomcat目录下的文件拷至镜像的/usr/tomcat目录下
ADD apache-tomcat-8.5.45.tar /usr/jrdee/tomcat

#设置环境变量
ENV JAVA_HOME=/usr/jrdee/tomcat/jdk1.8.0_221
ENV JRE_HOME=$JAVA_HOME/jre
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH=/sbin:$JAVA_HOME/bin:$PATH

#公开端口
EXPOSE 8080
#设置启动命令
ENTRYPOINT ["/usr/jrdee/tomcat/apache-tomcat-8.5.45/bin/catalina.sh","run"]

tomcat和jdk自己准备

  1. 启动挂载
docker run -d -p 8080:8080 -v $PWD/webapps:/usr/jrdee/tomcat/apache-tomcat-8.5.45/webapps -v $PWD/tomcat-users.xml:/usr/jrdee/tomcat/apache-tomcat-8.5.45/conf/tomcat-users.xml -v $PWD/context.xml:/usr/jrdee/tomcat/apache-tomcat-8.5.45/webapps/manager/META-INF/context.xml -v $PWD/logs:/usr/jrdee/tomcat/apache-tomcat-8.5.45/logs --name tomcat --link mysql:tomysql 
--link myredis:myredis tomcat:latest 

–link:连接其他容器,冒号前面为容器名称,后面为自定义主机名
a.webapps文件夹:资源应用
b.tomcat-users.xml:tomcat-manager用户配置
c.context.xml:配置远程访问manager-ui界面,不然会403
d.logs文件夹:tomcat日志

FastDFS

拉取镜像

docker pull delron/fastdfs

创建tracker和storage文件夹
创建tracker容器

docker run -d --network=host --name tracker -v /usr/jrdee/fastdfs/tracker:/var/fdfs delron/fastdfs tracker

创建storage容器

docker run -d --network=host --name storage -e TRACKER_SERVER=IP:22122 -v /usr/jrdee/fastdfs/storage:/var/fdfs -e GROUP_NAME=group1 delron/fastdfs storage

更改上面的IP,改成自己的IP
进入storage,发现在nginx目录下,默认端口8888
JAVA
pom

<dependency>
	<groupId>com.github.tobato</groupId>
	<artifactId>fastdfs-client</artifactId>
	<version>1.26.5</version>
</dependency>

application.yml

fdfs:
  so-timeout: 1501
  connect-timeout: 601
  thumb-image:             #缩略图生成参数
    width: 200
    height: 200
  tracker-list:            #TrackerList参数,支持多个
    - IP:22122

工具类


@Component
public class FastdfsClientUtil {
	
	@Autowired
	private FastFileStorageClient storageClient;
	@Autowired
	private ThumbImageConfig thumbImageConfig;


    private Set<MetaData> createMetaData() {
        Set<MetaData> metaDataSet = new HashSet<MetaData>();
        metaDataSet.add(new MetaData("Author", "tobato"));
        metaDataSet.add(new MetaData("CreateDate", "2016-01-05"));
        return metaDataSet;
    }
	
	// 上传文件
	public String upload(MultipartFile myfile) throws Exception {
		// 文件名
		String originalFilename = myfile.getOriginalFilename()
				.substring(myfile.getOriginalFilename().lastIndexOf(".") + 1);
		// 文件扩展名
		String ext = originalFilename.substring(originalFilename.lastIndexOf(".") + 1, originalFilename.length());
		StorePath storePath;
		if (ext.endsWith(".jpg") || ext.endsWith(".png")) {
			storePath = this.storageClient.uploadImageAndCrtThumbImage(myfile.getInputStream(), myfile.getSize(),
					originalFilename, null);
		}else {
			FastFile fastFile = new FastFile(myfile.getInputStream(), myfile.getSize(),
					originalFilename, createMetaData());
			storePath = this.storageClient.uploadFile(fastFile);
		}

		String path = storePath.getFullPath();
		return path;
	}

	/**
	 * 删除文件
	 * 
	 * @Param fileUrl 文件访问地址
	 */
	public void deleteFile(String fileUrl) {
		if (StringUtils.isEmpty(fileUrl)) {
			return;
		}
		try {
			StorePath storePath = StorePath.parseFromUrl(fileUrl);
			storageClient.deleteFile(storePath.getGroup(), storePath.getPath());
		} catch (FdfsUnsupportStorePathException e) {
		}
	}
}

默认端口8888,进行查看图片或者下载文件

猜你喜欢

转载自blog.csdn.net/qq_36382225/article/details/85628288