1.目标
docker 部署java项目:https://www.jianshu.com/p/ab0de243736a
https://blog.csdn.net/qq_22638399/article/details/82660868
通过Docker Compose部署一个wordpress(WordPress是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用PHP语言和MySQL数据库开发的,用户可以在支持 PHP 和 MySQL数据库的服务器上使用自己的博客。)
2.获取image
获取镜像太慢了,配置一个镜像加速器:https://blog.csdn.net/qq_34930488/article/details/80016935
针对Docker客户端版本大于1.10.0的用户,您可以通过修改daemon配置文件/etc/docker/daemon.json
来使用加速器:
然后执行两条命令:
sudo systemctl daemon-reload
sudo systemctl restart docker
镜像加速器配好以后就可以拉取镜像了,将wordpress和mysql的image拉到本地:
先运行mysql指定数据卷,指定他的容器参数,不需要暴露端口,创建一个叫wordpress的数据库。
docker run -d --name mysql -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=133309 -e MYSQL_DATABASE=wordpress mysql:latest
创建一个wordpress的容器:指定了他要访问的数据库,因为链接到了mysql,所以可以直接通过mysql来访问。
docker run -d -e WORDPRESS_DB_HOST=mysql:3306 --link mysql -p 8080:80 wordpress
然后访问8080 端口显示数据库没有链接,不知道什么原因,
可以进入mysql容器中查看一下,然后重新启动时删除原来的数据卷试试,然后删除镜像试试,都试了,不知道什么原因。
然后运行就好了:然后选择简体中文继续
然后登陆:
ok,证明了可以的。两个容器。
但是我们想把这些容器定义为一个组,统一的启动,统一的停止,然后dockers compose就出现了。
3.Compose
多容器APP太恶心,所以dockerCompose就扮演了一个批处理的这样一个角色。
yml文件时核心:
Servcies:
Volumes:
network:
下面时wordpress的yam文件的示例:
#表示docker Compose的第三个版本
version: '3'
services:
wordpress:
image: wordpress
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD: root
networks:
- my-bridge
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
volumes:
- mysql-data:/var/lib/mysql
networks:
- my-bridge
volumes:
mysql-data:
networks:
my-bridge:
driver: bridge
4.docker Compose的安装和使用
Mac和Win在安装docker的时候就默认安装了docker-compose,但是linux就不行。
官方文档:https://docs.docker.com/compose/install/
执行命令,安装compose的可执行文件
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
然后给目录一个可执行的权限:
chmod +x /usr/local/bin/docker-compose
然后就可以查看compose的版本了
然后通过之前展示的docker-compose的示例来启动容器组,主要包含两个容器,一个wordpress,一个mysql
找到docker-compose.yml文件的地方执行:
docker-compose up
查看容器的运行状态:
docker-compose的其他命令:
docker images:
如何进入容器里面呢?比如说进入mysql容器里面
通过docker-compose down可以将 这个compose里面的services,容器等等都删掉
再来一个实验,就是将之前的python-web的项目用docker-compose来实现
docker-compose.yml,这个是通过镜像来生成Image
version: "3"
services:
redis:
image: redis
web:
build:
context: .
dockerfile: Dockerfile
ports:
- 8080:5000
environment:
REDIS_HOST: redis
Dockerfile:
FROM python:2.7
LABEL maintaner="Peng Xiao xiaoquwl@gmail.com"
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 5000
CMD [ "python", "app.py" ]
docker-compose up就行了
最后我们完一个SpringBoot 整合mysql整合redis项目的一个部署
项目显示:使用了Mysql和redis
项目地址:https://github.com/WangAlainDelon/SpringBoot7.git
https://blog.csdn.net/weixin_38187317/article/details/81487301
ok 项目有了 下面测试docker 部署:
遇到了好所问题,主要是针对数据库的,要么报数据库无法创建,要么报找不到数据库,现在我先用docker-compose来测试数据库的启动。数据库连接的坑:https://blog.csdn.net/jinhaijing/article/details/83503645
指定数据库的挂载目录的时候需要关闭linux的SELinux,关闭方法祥见:https://blog.csdn.net/xinluke/article/details/51925293
整个文件的目录:
新建一个springboot项目,暂时不要配置文件:
package com.wx.testdocker.comtroller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@Controller
public class TestController {
@RequestMapping("/")
public String helloworld(){
return getInfFromMySQL();
}
private String getInfFromMySQL(){
try {
Class.forName("com.mysql.cj.jdbc.Driver");
//注意链接不是localhost,是mysql(容器名)
Connection connection = DriverManager.getConnection("jdbc:mysql://mysql:3306","root","root");
String sql = "select \"HelloWorld\"";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
resultSet.next();
String out = resultSet.getString(1);
resultSet.close();
preparedStatement.close();
connection.close();
return out;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}
web工程的Dockerfile:
FROM java
MAINTAINER AndersIves
COPY /test-docker-0.0.1-SNAPSHOT.jar /app.jar
CMD java -jar /app.jar
EXPOSE 8080
数据库的dockerFile,数据库容器启动的时候,要执行sql,
FROM registry.saas.hand-china.com/tools/mysql:5.7.23
MAINTAINER wangxiang
ADD init.sql /docker-entrypoint-initdb.d/
mysql_db.cnf:
# mysql_db.cnf
[mysqld]
lower_case_table_names=1
character_set_server=utf8
max_connections=500
init.sql:
CREATE DATABASE `persontest` CHARACTER SET 'utf8';
use persontest;
CREATE TABLE `persontest`.`userinfo` (
`id` int(0) NOT NULL,
`username` varchar(255) NULL,
PRIMARY KEY (`id`)
);
INSERT INTO userinfo(id,username) VALUES(0,'CSDN yunlingfly');
INSERT INTO userinfo(id,username) VALUES(1,'dakl');
INSERT INTO userinfo(id,username) VALUES(2,'dhasjk');
docker-compose.yaml:
version: "3"
services:
mysql:
container_name: mysql
build:
context: .
dockerfile: dbDockerfile
hostname: mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- ./mysql_data:/var/lib/mysql
- ./mysql_db.cnf:/etc/mysql/conf.d/mysql_db.cnf
expose:
- "3306"
networks:
- "c7nNetwork"
web:
container_name: web
build:
context: .
dockerfile: Dockerfile
hostname: web
expose:
- "8080"
ports:
- "8080:8080"
networks:
- "c7nNetwork"
links:
- mysql
networks:
c7nNetwork:
driver: bridge
然后docker-compose up:
ok,启动了两个容器,
数据库也创建好了:
接下来要做的是在代码里面写上查询数据库的逻辑,然后将数据显示在页面上。顺便将redis一起整合进去
所以docker-compose文件变成了这样:
version: "3"
services:
mysql:
container_name: mysql
build:
context: .
dockerfile: dbDockerfile
hostname: mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- ./mysql_data:/var/lib/mysql
- ./mysql_db.cnf:/etc/mysql/conf.d/mysql_db.cnf
expose:
- "3306"
networks:
- "c7nNetwork"
redis:
image: "redis:latest"
container_name: redis
networks:
- "c7nNetwork"
ports:
- "6379:6379"
web:
container_name: web
build:
context: .
dockerfile: Dockerfile
hostname: web
expose:
- "8080"
ports:
- "8080:8080"
networks:
- "c7nNetwork"
links:
- mysql
- redis
networks:
c7nNetwork:
driver: bridge
项目源码的地址:https://github.com/WangAlainDelon/SpringBoot7.git
一切就绪以后,启动容器:可以看到有三个容器
然后从数据库查询的和从redis查询的数据:
参考博客:
https://blog.csdn.net/qiuhao9527/article/details/81079206