IDEA的Docker插件实战(Dockerfile篇)

Posted qdwd888

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IDEA的Docker插件实战(Dockerfile篇)相关的知识,希望对你有一定的参考价值。

  1. IntelliJ IDEA: 2018.2.4 (Ultimate Edition)

  2. JDK:1.8.0_181

  3. Maven:3.5.0

  4. Docker服务所在环境:CentOS Linux release 7.6.1810

  5. Docker:1.13.1, build b2f74b2/1.13.1

[](()免费使用正版IntelliJ IDEA

IntelliJ IDEA (Ultimate Edition)是商业版本,目前其License费用为499美金一年,对于学习和非商业用途开发者来说,其实是有机会免费获取此License的,申请和使用的详情可参考[《免费申请和使用IntelliJ IDEA商业版License指南》](();

[](()开启Docker的远程连接

本次实战中,IDEA作为开发电脑,要远程连接到另一台Linux电脑上部署的Docker服务,这就要求Docker服务开启了远程连接,开启方式请参考:[《Docker远程连接设置》](()

准备工作完成了,开始实战吧。

[](()安装Docker插件

  1. 在IDEA的开始页面,点击右下角的"Configure"菜单,再点击下图红框中的"Plugins"按钮,进入插件管理页面:

  1. 点击下图红框中的Browse repositories按钮:

  1. 如下图,红框1位置输入"Docker"之后就会搜到红框2中的Docker插件,再点击红框3中的"Install"按钮开始安装插件:

  1. 安装完成后,原先的"Install"按钮的文案变成了重启,点击该按钮重启IDEA,至此Docker插件安装完成;

[](()连接远程Docker服务

  1. 在IDEA的开始页面,点击右下角的"Configure"菜单,再点击下图红框中的"Settings"按钮,进入设置页面:

  1. 在设置页面,按照下图的数字顺序创建一个Docker server并进行设置,其中"192.168.121.131"是Docker服务所在机器的IP地址,如果连接成功页面上会立即提示"Connection successful":

至此,Docker插件准备完毕,远程连接也已经OK,可以尝试使用该插件了。

[](()创建一个springboot应用

为了验证Docker插件的功能,先开发一个简单的sringboot应用:

  1. 在IEDA上创建一个名为dockerplugindemo的springboot工程,其pom.xml是默认内容:
<?xml version="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:schemaLocation=“http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd”>

4.0.0

org.springframework.boot

spring-boot-starter-parent

2.1.7.RELEASE

com.bolingcavalry

dockerplugindemo

0.0.1-SNAPSHOT

dockerplugindemo

Demo project for Spring Boot

<java.version>1.8</java.version>

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-test

test

org.springframework.boot

spring-boot-maven-plugin

  1. 应用启动类同时作为Controller,增加一个web响应接口:

package com.bolingcavalry.dockerplugindemo;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import java.text.SimpleDateFormat;

import java.util.Date;

@SpringBootApplication

@RestController

public class DockerplugindemoApplication

public static void main(String[] args)

SpringApplication.run(DockerplugindemoApplication.class, args);

@RequestMappi 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 ng(“/test”)

public String test()

return “1. Hello world ! " + new SimpleDateFormat(” [yyyy-mm-dd HH:mm:ss]").format(new Date());

可见这是个最普通的springboot应用,对外提供一个http接口,接下来用Docker插件将此应用构建成镜像并在远程Docker上运行;

[](()用Docker插件将应用构建成镜像并在远程Docker上运行

  1. 在工程dockerplugindemo的pom.xml文件所在目录下,创建名为Dockerfile的文件,内容如下:

Docker image for springboot application

VERSION 0.0.1

Author: bolingcavalry

基础镜像,使用alpine操作系统,openjkd使用8u201

FROM openjdk:8u201-jdk-alpine3.9

Docker-compose实战之搭建LAMP环境

Docker-compose的安装

  • 一开始利用命令pip install docker-compose安装docker-compose会发现在之后的build中一直出错
  • 只能先从github上下载完后移到虚拟机中/usr/local/bin的位置,然后利用docker-compose --version查询当前版本号,返回版本号说明安装成功
    技术图片

Dockerfile编写搭建LAMP(Linux+Apache+MySQL+PHP)环境

  • 以下所有文件放置于/home/ubuntu/docker-compose-lamp目录下

MySql_dockerfile

FROM mysql:5.7

#作者信息
MAINTAINER by Ra9zer

#设置不允许免密登录
ENV MYSQL_ALLOW_EMPTY_PASSWORD no



Apach_dockerfile

FROM httpd

# 作者信息
MAINTAINER Ra9zer

# 最后暴露2422端口
EXPOSE 2422
# Dockerfile中开头为#号的为注释,至此Dockerfile编写完成

php_dockerfile

FROM php:7.4-fpm

# 作者信息
MAINTAINER Ra9zer

RUN apt-get update && apt-get install -y         libfreetype6-dev         libjpeg62-turbo-dev         libpng-dev     && docker-php-ext-install pdo_mysql     && docker-php-ext-configure gd --with-freetype --with-jpeg     && docker-php-ext-install -j$(nproc) gd 

phpmyadmin_dockerfile

FROM phpmyadmin/phpmyadmin

# 作者信息
MAINTAINER Ra9zer

EXPOSE 8080

使用Compose实现多容器运行机制

Docker-compose配置文件docker-compose.yml编写

version: ‘3.7‘

services:

  #构建mysql服务
  mysql:
    image: mysql #镜像名
    container_name: LAMP_mysql #容器名
    build: 
      context: .
      dockerfile: MySql_dockerfile
    ports:
      - "3306:3306"  

  #构建php服务
  web:
    image: php
    container_name: LAMP_php
    build:
      context: .
      dockerfile: php_dockerfile
    depends_on:   #设置依赖的服务
      - mysql
    volumes:
      - ./web/:/home/ubuntu/docker-compose-lamp/web/ #将主机中的目录挂载到容器中的工作目录
    ports:
      - "8080:80" #映射端口,格式为 "主机端口:容器端口"

  #构建phpmyadmin服务
  phpmyadmin:
    image: phpmyadmin
    container_name: LAMP_phpmyadmin
    build:
      context: .
      dockerfile: phpmyadmin_dockerfile
    environment:
      PMA_HOST: LAMP_mysql #设置所连接的MySQL服务器名称
    depends_on:
      - mysql
      - web
    ports:
      - "8081:80"

Index.php文件

  • 该文件放置于/home/ubuntu/docker-compose-lamp/web/目录下
<html>
    <head>
        <title>phpinfo</title>
    </head>

    <body>
        <?php
            echo phpinfo(); #显示php信息
        ?>
    </body>
</html>

通过Compose运行多容器

  • 所有配置文件编写完后因在同一目录中
    技术图片

  • 在文件目录/home/ubuntu/docker-compose-lamp/下使用命令sudo docker-compose up --build运行多容器成功
    技术图片

  • sudo docker ps查看当前运行中容器,可以看到多容器都已同时上线
    技术图片

  • 访问http://0.0.0.0:8080/可以查看PHP信息来验证容器是否正确运行达到目标效果
    技术图片
    在这里有个坑:就是一开始我的docker-compose.yml里的web的文件目录配置错误./web/:/home/ubuntu/docker-compose-lamp/web/导致访问8080端口的时候会出现404的情况,后面百度查询了一下正确的挂载目录应该是./www/:/var/www/html/

通过PHP访问MySql

  • 修改index.php文件内容
<html>
    <head>
        <title>phpinfo</title>
    </head>

    <body>
        <?php
$servername = "LAMP_mysql";    #数据库服务器名称为MySQL容器的名称
$username = "root";
$password = "123456";     

try {
    $conn = new PDO("mysql:host=$servername", $username, $password);
    echo "数据库连接成功";
}
catch(PDOException $e)
{
    echo $e->getMessage();
}
?>
    </body>
</html>

技术图片

  • 又一个坑:一定要在MySql_dockerfile或者docker-compose.yml中声明ENV MYSQL_ROOT_PASSWORD 123456 #设置root下mysql登录密码 不然修改PHP文件也一辈子连不上数据库 (太难了。。。

通过PHP新建数据库

  • 修改index.php文件内容
<html>
    <head>
        <title>phpinfo</title>
    </head>

    <body>
        <?php
$servername = "LAMP_mysql";    #数据库服务器名称为MySQL容器的名称
$username = "root";
$password = "123456";     

try {
    $conn = new PDO("mysql:host=$servername", $username, $password);

    // 设置 PDO 错误模式为异常
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "CREATE DATABASE myDBPDO";

    // 使用 exec() ,因为没有结果返回
    $conn->exec($sql);

    echo "数据库创建成功<br>";
}
catch(PDOException $e)
{
    echo $sql . "<br>" . $e->getMessage();
}

$conn = null;
?>
    </body>
</html>

技术图片

通过PHP新建数据表

  • 修改index.php文件内容
<html>
    <head>
        <title>phpinfo</title>
    </head>

    <body>
        <?php
$servername = "LAMP_mysql";    #数据库服务器名称为MySQL容器的名称
$username = "root";
$password = "123456";     

$dbname = "myDBPDO";
 
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // 设置 PDO 错误模式,用于抛出异常
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
    // 使用 sql 创建数据表
    $sql = "CREATE TABLE test (
    `id` bigint(20) NOT NULL,
    `name` varchar(255),
    `score` int
    )";
 
    // 使用 exec() ,没有结果返回 
    $conn->exec($sql);
    echo "数据表 test 创建成功";
}
catch(PDOException $e)
{
    echo $sql . "<br>" . $e->getMessage();
}
 
$conn = null;
?>
    </body>
</html>

技术图片

通过PHP对表记录的插入修改和删除

  • 修改index.php文件内容
<html>
    <head>
        <title>phpinfo</title>
    </head>

    <body>
        <?php
$servername = "LAMP_mysql";    #数据库服务器名称为MySQL容器的名称
$username = "root";
$password = "123456";     

$dbname = "myDBPDO";
 
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // 设置 PDO 错误模式,用于抛出异常
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "INSERT INTO test (`id`, `name`, `score`)
VALUES
  (2422,‘Ra9zer‘,‘100‘);";
    // 使用 exec() ,没有结果返回 
    $conn->exec($sql);
    echo "新记录插入成功";
}
catch(PDOException $e)
{
    echo $sql . "<br>" . $e->getMessage();
}
 
$conn = null;
?>
    </body>
</html>

技术图片

选做

增加一个phpmyadmin容器,实现web端的数据库管理

  • phpmyadmin容器配置文件在前文已经给出,同时在docker-compose.yml中已完整配置服务。
  • 直接访问0.0.0.0:8081就可以登入
    技术图片

小结

  • 实验3花费的时间大概在20个小时左右吧,相对前两个实验的皮毛操作。感觉实验3才算的上真正的入门。一开始看感觉还是挺懵的,不敢下手,到处百度百度的。感觉要编写的文件一大堆,然后compose.yml配置文件内容又很多的样子。到后面摸索摸索着渐渐就感觉其实也并不难,到最后也能都理解清楚。但是这应该才是锻炼(折磨)的开始趴







以上是关于IDEA的Docker插件实战(Dockerfile篇)的主要内容,如果未能解决你的问题,请参考以下文章

idea 使用docker插件部署docker-compose失败?

Docker-compose实战之搭建LAMP环境

Docker-compose实战之搭建LAMP环境

idea中安装docker插件

idea设置docker远程插件

史上最全idea插件开发入门实战(傻瓜式教程)