Docker安装Mysql

首先确认当前系统中,是否有mysql镜像文件,结果发现没有

4. Docker实战_mysql



再使用docker search命令来搜索hub.docker.com上的mysql镜像文件

4. Docker实战_docker_02



我们就使用starts最多的,官方的mysql镜像。使用docker pull mysql命令,来下载mysql:latest,也就是mysql最新版的镜像

4. Docker实战_nginx_03



根据mysql镜像创建并运行一个容器:


docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123 mysql


docker run -d -p 3306:3306 --name xyz \

-v ~/mysql/conf:/etc/mysql/conf.d \

-v ~/mysql/logs:/logs \

-v ~/mysql/data:/var/lib/mysql \

-e MYSQL_ROOT_PASSWORD=123 \

mysql


查看正在运行着的容器,发现刚刚启动的mysql

4. Docker实战_docker_04



进入运行mysql的容器

4. Docker实战_nginx_05



进入mysql命令行客户端

4. Docker实战_mysql_06



在mysql服务器上创建数据库和表,并加入测试数据

4. Docker实战_mysql_07



再通过windows上的sqlyog来连接linux上的docker中的mysql服务..

4. Docker实战_nginx_08



但是在连接时报错了,因为我们下载的mysql8的加密方法变了!

4. Docker实战_mysql_09



为了解决以上问题,我们在docker下的mysql中使用以下命令来修改密码

alter user 'root'@'%' identified with mysql_native_password by '123';


再次使用sqlyog来登录docker容器中的mysql服务,就成功了!

4. Docker实战_nginx_10



如果我们想备份docker容器中运行着的mysql的数据,该怎么做呢?首先退出容器:ctrl+p+q,然后再键入以下命令即可备份数据:

docker exec magical_buck sh -c 'exec mysqldump --all-databases -uroot -p"123"' > ./all.sql


如果还是连接不上,那可能是宿主机的路由没有开启,需要执行以下命令来开启宿主机的路由:

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

sysctl -p

sysctl net.ipv4.ip_forward



Docker搭建nginx与tomcat的集群环境

拉取nginx镜像

4. Docker实战_docker_11



拉取tomcat镜像

4. Docker实战_nginx_12



简单回顾一下nginx的主要作用

1. http服务器

2. 反向代理

3. 动静分离


在使用nginx+tomcat集群之前,先看一下整体的结构流程图

4. Docker实战_docker_13



接下来,使用tomcat镜像来跑起来3个tomcat容器

docker run -d -p 8081:8080 --name t8081 tomcat

docker run -d -p 8082:8080 --name t8082 tomcat

docker run -d -p 8083:8080 --name t8083 tomcat


4. Docker实战_nginx_14



创建一个web应用,pom.xml内容如下,

<?xml versinotallow="1.0" encoding="UTF-8"?>


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocatinotallow="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>


<groupId>com.gao</groupId>

<artifactId>myweb</artifactId>

<version>1.0-SNAPSHOT</version>

<packaging>war</packaging>


<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<maven.compiler.source>1.8</maven.compiler.source>

<maven.compiler.target>1.8</maven.compiler.target>

</properties>


<dependencies>

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>javax.servlet-api</artifactId>

<version>3.1.0</version>

</dependency>

<dependency>

<groupId>javax.servlet.jsp</groupId>

<artifactId>javax.servlet.jsp-api</artifactId>

<version>2.3.1</version>

</dependency>

</dependencies>


</project>


index.jsp内容如下

<%@ page cnotallow="text/html;charset=UTF-8" language="java" %>

<html>

<head>

<meta charset="utf-8">

<title>index.jsp</title>

</head>

<body>

<h3>Hello, JSP</h3>


本次请求的端口号是:<%=request.getServerPort()%> <br>

会话id: <%=session.getId()%>

</body>

</html>


将该web应用导出为war包:

4. Docker实战_mysql_15



将war包上传到linux:


4. Docker实战_nginx_16



将war包分别部署到3个容中的tomcat中:

docker cp myweb.war t8081:/usr/local/tomcat/webapps

docker cp myweb.war t8082:/usr/local/tomcat/webapps

docker cp myweb.war t8083:/usr/local/tomcat/webapps


然后通过浏览器,分别访问这3个tomcat中的myweb应用

4. Docker实战_nginx_17



4. Docker实战_nginx_18



4. Docker实战_mysql_19



接下来,该配置nginx了,在当前用户家目录下创建一个nginx文件夹,在其中创建nginx.conf配置文件,添加以下内容:

# 指定用户和用户所属的组

user root;


# 指定nginx开启的进程数。 每个nginx进程平均耗费10M~12M内存,建议设置的数字cpu的数量一致

worker_processes 1;


# error_log是一个主模块指令,用来定义全局错误日志文件。

error_log /var/log/nginx/error.log warn;


# 用来指定进程pid的存储文件位置

pid /var/run/nginx.pid;


# events是一个事件指令,用来设定nginx的工作模式及连接数的上限

events {

用于定义nginx每个进程的最大连接数,默认是1024

worker_connections 1024;

}


# http服务器配置

http {

通过server指令指定后端服务器的IP地址和端口

upstream balance {

server 192.168.188.130:8081;

server 192.168.188.130:8082;

server 192.168.188.130:8083;

}

主机配置

server {

listen 80;

location / {

proxy_pass http://balance;

}

}

指定配置文件所包含的媒体类型,如果不包含这个第三方文件的话,

则nginx将无法识别css、js等文件

include /etc/nginx/mime.types;


设定默认为类型为二进制流,也就是当文件类型未定义时使用这种方式

例如在没有配置PHP环境时,nginx是不予解析的,此时浏览器访问PHP

文件就会出现下载的提示

default_type application/octet-stream;


用于开启高校的文件传输模式,也即是传说中的zero copy

sendfile on;


设置客户的连接保持活动连接的超时时间,在超过这个时间之后,服务器就会关闭这个连接

keepalive_timeout 65;

}


然后根据nginx镜像,启动一个nginx容器:

4. Docker实战_nginx_20



docker run -d -p 8082:80 --name pms-front \

-v /root/pms/nginx/nginx.conf:/etc/nginx/nginx.conf nginx


查看正在运行中的容器, 如果没有看到nginx容器处于运行状态的话,要使用“docker logs 容器id”来排查错误

4. Docker实战_nginx_21




此时访问nginx服务,会发现,tomcat集群成功了:

4. Docker实战_mysql_22




Docker安装Redis

docker pull redis


docker run -d -p 6379:6379 redis


# 指定配置文件

docker run -d -p 6379:6379 \

-v /root/redis/redis.conf:/redis.conf redis \

redis-server /redis.conf



Docker安装RabbitMQ

拉去RabbitMQ时,要指定RabbitMQ的版本为management,因为该版本会自带web客户端

docker pull rabbitmq:management

docker run -dit --name MyRabbitMQ -e RABBITMQ_DEFAULT_USER=root \

-e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 rabbitmq:management



4. Docker实战_docker_23



4. Docker实战_nginx_24




Docker安装ElasticSearch

docker pull elasticsearch:7.11.2


docker run --name es -d -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \

-e "discovery.type=single-node" -p 9200:9200 -p 9300:9300 \

elasticsearch:7.11.2



4. Docker实战_nginx_25



Docker安装Kibana

docker pull kibana:7.11.2


docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.188.130:9200 \

-p 5601:5601 -d kibana:7.11.2


4. Docker实战_mysql_26



Docker安装minio

  1. 拉取minio镜像docker pull minio/minio
  2. 启动minio容器

docker run -p 9000:9000 -p 9090:9090 \

--name minio \

-d --restart=always \

-e "MINIO_ACCESS_KEY=minioadmin" \

-e "MINIO_SECRET_KEY=minioadmin" \

-v /mydata/minio/data:/data \

minio/minio server /data --console-address ":9090" -address ":9000"


Docker安装Nacos

docker pull nacos/nacos-server

docker run -d -p 8848:8848 --name nacos8848 -e MODE=standalone nacos/nacos-server


Docker部署SpringBoot项目

1. 准备一个简单的SpringBoot项目

pom.xml

<?xml versinotallow="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocatinotallow="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>


<groupId>com.gao</groupId>

<artifactId>docker-test</artifactId>

<version>1.0-SNAPSHOT</version>


<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>2.4.2</version>

</parent>


<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

</dependencies>


<build>

<plugins>

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

<configuration>

<mainClass>com.gao.App</mainClass>

</configuration>

</plugin>

</plugins>

</build>


</project>


controller

@RestController

@RequestMapping("user")

public class UserController {

@RequestMapping("save")

public String save() {

return "save ok";

}

}


启动类

@SpringBootApplication

public class App {

public static void main(String[] args) {

SpringApplication.run(App.class, args);

}

}


将该springboot项目打包,得到:docker-test-1.0-SNAPSHOT.jar


将docker-test-1.0-SNAPSHOT.jar传给linux

4. Docker实战_nginx_27



2. 利用DockerFile构建镜像


DockerFile脚本

FROM java:8

COPY docker-test-1.0-SNAPSHOT.jar docker-test.jar

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "docker-test.jar"]

注意,为什么基础镜像是"java:8",而不是"tomcat"?因为springboot应用中引入了spring-boot-stater-web,所以应用中自带tomcat。


构建镜像

docker build -f DockerFile -t docker-test .


查看镜像

4. Docker实战_nginx_28



运行容器

4. Docker实战_mysql_29



访问:

4. Docker实战_nginx_30



最后,我们进入这个容器中,看看里面的文件内容:

docker exec -it 882f87f0a910 bash


4. Docker实战_nginx_31





Docker 本地镜像推送到阿里云

为了测试方便

☐ 删除所有容器:docker rm -f $(docker ps -qa)

☐ 删除所有镜像:docker rmi $(docker images -qa)


此时查询容器和镜像,发现都是空的

4. Docker实战_mysql_32



拉取镜像:centos:centos7

4. Docker实战_nginx_33



使用该镜像创建并运行一个容器,该容器中是没有vim命令和ifconfig命令的:

4. Docker实战_docker_34



此时我们为该容器下载这两个命令:

yum -y install vim

yum -y install net-tools


然后我们将这个容器,提交为一个新的镜像,该镜像便是自带vim和ifconfig命令的镜像了!首先使用ctrl+p+q退出但不关闭容器,然后键入以下命令:

容器id mycentos


4. Docker实战_nginx_35


新的镜像mycentos是自带vim和ifconfig命令的镜像


接下来我们要把mycentos这个镜像推送到阿里云! 进入阿里云开发者平台:https://account.aliyun.com

4. Docker实战_docker_36



登录,再进入这个网址: https://cr.console.aliyun.com/进入个人版

4. Docker实战_docker_37



进入镜像仓库:

4. Docker实战_nginx_38



如果你还没有创建镜像仓库,那就要先创建一个镜像仓库


4. Docker实战_mysql_39



选择本地仓库,然后点击创建镜像仓库:


4. Docker实战_nginx_40




至此,镜像仓库创建成功:

4. Docker实战_nginx_41



接着,就准备把本地镜像推送到阿里云!点击管理,即可看到推送的代码。以下就是将本地镜像推送到远程镜像仓库步骤:

4. Docker实战_docker_42



先登录

sudo docker login --username=gaochenyi1211 \

registry.cn-hangzhou.aliyuncs.com


然后设置本地镜像与远程镜像仓库的对应关系,也就是标记本地镜像,将其归入某一仓库。

sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/gaopeng/gaocentos:[镜像版本号]


4. Docker实战_nginx_43



推送本地镜像到远程镜像仓库

sudo docker push registry.cn-hangzhou.aliyuncs.com/gaopeng/gaocentos:[镜像版本号]


4. Docker实战_nginx_44



在镜像中心的镜像搜索中,可以搜索到自己刚刚推送的镜像

4. Docker实战_mysql_45



复制镜像地址:

4. Docker实战_mysql_46



然后我们再次删除本地的所有容器和镜像:

docker rm -f $(docker ps -qa)

docker rmi -f $(docker images -qa)


镜像全都没有了:

4. Docker实战_mysql_47



使用docker pull命令把远程镜像下载下来,记得自己加上版本号!

docker pull registry.cn-hangzhou.aliyuncs.com/gaopeng/gaocentos:1.0


4. Docker实战_docker_48



pull完之后,可以看到一个镜像

4. Docker实战_nginx_49



利用这个镜像,创建并运行一个容器,该容器直接具备vim和ifconfig命令!

4. Docker实战_docker_50


如此,将一个本地镜像推送到阿里云,再从阿里云把镜像pull下来的过程就演示完了。