系统学习docker践行DevOps理念05--(Docker Compose)

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

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时空恋旅人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值