├── .gitignore ├── JavaDocker.pdf ├── LICENSE ├── README.md ├── docker-compose ├── .gitignore ├── pom.xml ├── scripts │ ├── Makefile │ ├── docker-compose.yml │ ├── make-app.mk │ └── services │ │ ├── app │ │ └── Dockerfile.development │ │ └── postgres │ │ └── Dockerfile.development └── src │ └── main │ └── java │ └── ru │ └── petrelevich │ └── SqlAppl.java ├── docker ├── .gitignore ├── forDockerImage │ ├── openjdk-alpine-musl │ │ ├── Dockerfile │ │ └── build.sh │ ├── openjdk-alpine │ │ ├── Dockerfile │ │ └── build.sh │ └── openjdk-centos │ │ ├── Dockerfile │ │ └── build.sh ├── pom.xml └── src │ └── main │ └── java │ └── ru │ └── petrelevich │ └── Docker.java └── testContainers ├── pom.xml └── src └── test ├── java └── example │ └── ContainersTest.java └── resources ├── 00_createTables.sql └── 01_insertData.sql /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled class file 2 | *.class 3 | 4 | # Log file 5 | *.log 6 | 7 | # BlueJ files 8 | *.ctxt 9 | 10 | # Mobile Tools for Java (J2ME) 11 | .mtj.tmp/ 12 | 13 | # Package Files # 14 | *.jar 15 | *.war 16 | *.nar 17 | *.ear 18 | *.zip 19 | *.tar.gz 20 | *.rar 21 | 22 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 23 | hs_err_pid* 24 | -------------------------------------------------------------------------------- /JavaDocker.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/petrelevich/java-docker/5b58d62e0de48d8e1150138b19101c8cfa85b24f/JavaDocker.pdf -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Sergey Petrelevich 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # java-docker 2 | java in docker 3 | -------------------------------------------------------------------------------- /docker-compose/.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled class file 2 | *.class 3 | 4 | # Log file 5 | *.log 6 | 7 | # BlueJ files 8 | *.ctxt 9 | 10 | # Mobile Tools for Java (J2ME) 11 | .mtj.tmp/ 12 | 13 | # Package Files # 14 | *.jar 15 | *.war 16 | *.nar 17 | *.ear 18 | *.zip 19 | *.tar.gz 20 | *.rar 21 | 22 | *.iml 23 | target 24 | .idea 25 | 26 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 27 | hs_err_pid* 28 | -------------------------------------------------------------------------------- /docker-compose/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 4.0.0 7 | 8 | ru.petrelevich 9 | docker-compose 10 | 1.0-SNAPSHOT 11 | 12 | 13 | UTF-8 14 | 11 15 | 11 16 | 17 | 18 | 19 | 20 | org.postgresql 21 | postgresql 22 | 42.2.5 23 | 24 | 25 | 26 | 27 | sqlAppl 28 | 29 | 30 | org.apache.maven.plugins 31 | maven-shade-plugin 32 | 3.1.1 33 | 34 | 35 | package 36 | 37 | shade 38 | 39 | 40 | 41 | 42 | ru.petrelevich.SqlAppl 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /docker-compose/scripts/Makefile: -------------------------------------------------------------------------------- 1 | include make-app.mk 2 | -------------------------------------------------------------------------------- /docker-compose/scripts/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.3' 2 | 3 | services: 4 | postgres: 5 | build: 6 | context: services/postgres 7 | dockerfile: Dockerfile.development 8 | command: postgres 9 | ports: 10 | - "5432:5432" 11 | volumes: 12 | - "~/.bash_history:/.bash_history" 13 | - "/tmp:/tmp:delegated" 14 | app: 15 | build: 16 | context: services/app 17 | dockerfile: Dockerfile.development 18 | command: java -jar ./sqlAppl.jar 19 | network_mode: host 20 | volumes: 21 | - "~/.bash_history:/.bash_history" 22 | - "/tmp:/tmp:delegated" 23 | depends_on: 24 | - postgres 25 | 26 | -------------------------------------------------------------------------------- /docker-compose/scripts/make-app.mk: -------------------------------------------------------------------------------- 1 | USER = "$(shell id -u):$(shell id -g)" 2 | 3 | app: 4 | docker-compose up 5 | 6 | app-build: 7 | docker-compose build 8 | 9 | app-bash: 10 | docker-compose run --user=$(USER) app bash 11 | -------------------------------------------------------------------------------- /docker-compose/scripts/services/app/Dockerfile.development: -------------------------------------------------------------------------------- 1 | FROM bellsoft/liberica-openjdk-alpine-musl:11.0.3 2 | ENV PROJECT_ROOT /usr/src/app 3 | WORKDIR $PROJECT_ROOT 4 | EXPOSE 8090 5 | ADD sqlAppl.jar sqlAppl.jar 6 | CMD java -jar ./sqlAppl.jar 7 | 8 | -------------------------------------------------------------------------------- /docker-compose/scripts/services/postgres/Dockerfile.development: -------------------------------------------------------------------------------- 1 | FROM postgres:12-alpine 2 | -------------------------------------------------------------------------------- /docker-compose/src/main/java/ru/petrelevich/SqlAppl.java: -------------------------------------------------------------------------------- 1 | package ru.petrelevich; 2 | 3 | import java.sql.Connection; 4 | import java.sql.DriverManager; 5 | import java.sql.SQLException; 6 | import java.util.Properties; 7 | 8 | public class SqlAppl { 9 | public static void main(String[] args) throws SQLException { 10 | System.out.println("application is starting..."); 11 | new SqlAppl().start(); 12 | System.out.println("application finished"); 13 | } 14 | 15 | private void start() throws SQLException { 16 | try(Connection connection = makeConnection()) { 17 | System.out.println(connection.isValid(1)); 18 | } 19 | } 20 | 21 | private Connection makeConnection() throws SQLException { 22 | String url = "jdbc:postgresql://localhost/postgres"; 23 | Properties props = new Properties(); 24 | props.setProperty("user","postgres"); 25 | props.setProperty("password","password"); 26 | props.setProperty("ssl","false"); 27 | return DriverManager.getConnection(url, props); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /docker/.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled class file 2 | *.class 3 | 4 | # Log file 5 | *.log 6 | 7 | # BlueJ files 8 | *.ctxt 9 | 10 | # Mobile Tools for Java (J2ME) 11 | .mtj.tmp/ 12 | 13 | # Package Files # 14 | *.jar 15 | *.war 16 | *.nar 17 | *.ear 18 | *.zip 19 | *.tar.gz 20 | *.rar 21 | 22 | *.iml 23 | .idea 24 | target 25 | 26 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 27 | hs_err_pid* 28 | -------------------------------------------------------------------------------- /docker/forDockerImage/openjdk-alpine-musl/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM bellsoft/liberica-openjdk-alpine-musl:11.0.3 2 | ENV PROJECT_ROOT /usr/src/app 3 | WORKDIR $PROJECT_ROOT 4 | COPY ./testJavaAppl.jar testJavaAppl.jar 5 | CMD java -jar testJavaAppl.jar 6 | 7 | -------------------------------------------------------------------------------- /docker/forDockerImage/openjdk-alpine-musl/build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | docker build --tag=java-docker-alpine-musl --rm=true . -------------------------------------------------------------------------------- /docker/forDockerImage/openjdk-alpine/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM bellsoft/liberica-openjdk-alpine:11.0.3 2 | ENV PROJECT_ROOT /usr/src/app 3 | WORKDIR $PROJECT_ROOT 4 | COPY ./testJavaAppl.jar testJavaAppl.jar 5 | CMD java -jar testJavaAppl.jar 6 | 7 | -------------------------------------------------------------------------------- /docker/forDockerImage/openjdk-alpine/build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | docker build --tag=java-docker-alpine --rm=true . -------------------------------------------------------------------------------- /docker/forDockerImage/openjdk-centos/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM bellsoft/liberica-openjdk-centos:11.0.3 2 | ENV PROJECT_ROOT /usr/src/app 3 | WORKDIR $PROJECT_ROOT 4 | COPY ./testJavaAppl.jar testJavaAppl.jar 5 | CMD java -XX:+UseContainerSupport -Xmx10g -Xms10g -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1026 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar testJavaAppl.jar 6 | 7 | -------------------------------------------------------------------------------- /docker/forDockerImage/openjdk-centos/build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | docker build --tag=java-docker-centos --rm=true . -------------------------------------------------------------------------------- /docker/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 4.0.0 7 | 8 | ru.petrelevich 9 | docker 10 | 1.0-SNAPSHOT 11 | 12 | 13 | UTF-8 14 | 11 15 | 11 16 | 17 | 18 | 19 | testJavaAppl 20 | 21 | 22 | org.apache.maven.plugins 23 | maven-shade-plugin 24 | 3.1.1 25 | 26 | 27 | package 28 | 29 | shade 30 | 31 | 32 | 33 | 34 | ru.petrelevich.Docker 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | org.apache.maven.plugins 43 | maven-antrun-plugin 44 | 1.8 45 | 46 | 47 | build Docker image 48 | package 49 | 50 | run 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /docker/src/main/java/ru/petrelevich/Docker.java: -------------------------------------------------------------------------------- 1 | package ru.petrelevich; 2 | 3 | import java.lang.management.ManagementFactory; 4 | import java.util.ArrayList; 5 | import java.util.List; 6 | import java.util.concurrent.TimeUnit; 7 | 8 | /* 9 | 1) 10 | docker run java-docker-centos 11 | docker run java-docker-alpine 12 | docker run java-docker-alpine-musl 13 | 14 | 2) 15 | docker run -it java-docker-centos /bin/bash 16 | docker run -it java-docker-alpine /bin/bash 17 | docker run -it java-docker-alpine-musl /bin/bash 18 | 19 | 3) 20 | docker run java-docker-centos 21 | docker run --memory=58m --memory-swap=58m --cpus 2 java-docker-centos 22 | dmesg -T 23 | 24 | 4) 25 | docker run --memory=100m --memory-swap=100m --cpus 2 -it java-docker-centos /bin/bash 26 | free -h 27 | 28 | docker run --memory=100m --memory-swap=100m --cpus 2 -it -v /var/lib/lxcfs/proc/meminfo:/proc/meminfo java-docker-centos /bin/bash 29 | 30 | docker run --memory=100m --memory-swap=100m --cpus 2 -v /var/lib/lxcfs/proc/meminfo:/proc/meminfo java-docker-centos 31 | 32 | 5) 33 | docker run -p1026:1026 java-docker 34 | 35 | 36 | */ 37 | 38 | public class Docker { 39 | public static void main(String[] args) throws InterruptedException { 40 | 41 | com.sun.management.OperatingSystemMXBean osMBean = (com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); 42 | 43 | System.out.println("availableProcessors:" + Runtime.getRuntime().availableProcessors()); 44 | System.out.println("total physical memory, mb:" + osMBean.getTotalPhysicalMemorySize() / 1024 / 1024); 45 | System.out.println("totalMemory, mb:" + Runtime.getRuntime().totalMemory() / 1024 / 1024); 46 | System.out.println("maxMemory, mb:" + Runtime.getRuntime().maxMemory() / 1024 / 1024); 47 | System.out.println("freeMemory, mb:" + Runtime.getRuntime().freeMemory() / 1024 / 1024); 48 | 49 | // Thread.sleep(TimeUnit.HOURS.toMillis(1)); //Демонстрация OOM 50 | List list = new ArrayList<>(); 51 | for (long idx = 0; idx < Long.MAX_VALUE; idx++) { 52 | Thread.sleep(1); 53 | list.add(System.currentTimeMillis()); 54 | list.add(System.currentTimeMillis()); 55 | list.add(System.currentTimeMillis()); 56 | } 57 | System.out.println(list.size()); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /testContainers/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 4.0.0 7 | 8 | ru.petrelevich 9 | testContainers 10 | 1.0-SNAPSHOT 11 | 12 | 13 | UTF-8 14 | 11 15 | 11 16 | 1.11.4 17 | 5.3.2 18 | 1.2.3 19 | 20 | 21 | 22 | 23 | org.postgresql 24 | postgresql 25 | 42.2.5 26 | 27 | 28 | 29 | org.slf4j 30 | slf4j-api 31 | 1.7.25 32 | 33 | 34 | ch.qos.logback 35 | logback-classic 36 | ${logback.version} 37 | 38 | 39 | ch.qos.logback 40 | logback-core 41 | ${logback.version} 42 | 43 | 44 | 45 | 46 | org.testcontainers 47 | testcontainers 48 | ${testcontainers.version} 49 | test 50 | 51 | 52 | 53 | org.testcontainers 54 | junit-jupiter 55 | ${testcontainers.version} 56 | test 57 | 58 | 59 | 60 | org.testcontainers 61 | postgresql 62 | ${testcontainers.version} 63 | test 64 | 65 | 66 | 67 | 68 | org.junit.jupiter 69 | junit-jupiter-api 70 | ${junit.jupiter.version} 71 | test 72 | 73 | 74 | org.junit.jupiter 75 | junit-jupiter-params 76 | ${junit.jupiter.version} 77 | test 78 | 79 | 80 | org.junit.jupiter 81 | junit-jupiter-engine 82 | ${junit.jupiter.version} 83 | test 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /testContainers/src/test/java/example/ContainersTest.java: -------------------------------------------------------------------------------- 1 | package example; 2 | 3 | import org.junit.jupiter.api.DisplayName; 4 | import org.junit.jupiter.api.Test; 5 | import org.slf4j.Logger; 6 | import org.slf4j.LoggerFactory; 7 | import org.testcontainers.containers.BindMode; 8 | import org.testcontainers.containers.PostgreSQLContainer; 9 | import org.testcontainers.junit.jupiter.Container; 10 | import org.testcontainers.junit.jupiter.Testcontainers; 11 | 12 | import java.sql.Connection; 13 | import java.sql.DriverManager; 14 | import java.sql.PreparedStatement; 15 | import java.sql.ResultSet; 16 | import java.sql.SQLException; 17 | import java.sql.Statement; 18 | import java.util.Properties; 19 | 20 | import static org.junit.jupiter.api.Assertions.assertEquals; 21 | import static org.junit.jupiter.api.Assertions.assertTrue; 22 | 23 | @Testcontainers 24 | public class ContainersTest { 25 | private static final Logger logger = LoggerFactory.getLogger(ContainersTest.class); 26 | 27 | // will be started before and stopped after each test method 28 | @Container 29 | private PostgreSQLContainer postgresqlContainer = new PostgreSQLContainer<>("postgres:12-alpine") 30 | .withDatabaseName("testDataBase") 31 | .withUsername("owner") 32 | .withPassword("secret") 33 | .withClasspathResourceMapping("00_createTables.sql", "/docker-entrypoint-initdb.d/00_createTables.sql", BindMode.READ_ONLY) 34 | .withClasspathResourceMapping("01_insertData.sql", "/docker-entrypoint-initdb.d/01_insertData.sql", BindMode.READ_ONLY); 35 | 36 | @Test 37 | @DisplayName("Connection test") 38 | public void connectionTest() throws SQLException { 39 | try (Connection connection = makeConnection()) { 40 | boolean connectionStatus = connection.isValid(1); 41 | logger.info("connection validation:{}", connectionStatus); 42 | assertTrue(connectionStatus); 43 | } 44 | } 45 | 46 | @Test 47 | @DisplayName("Insert and Select test") 48 | public void insertSelectTest() throws SQLException { 49 | String userName = "Ivan"; 50 | long expectedUserId = 3; 51 | try (Connection connection = makeConnection()) { 52 | try (PreparedStatement ps = connection.prepareStatement("insert into account(user_name) values (?)", Statement.RETURN_GENERATED_KEYS)) { 53 | ps.setString(1, userName); 54 | int rows = ps.executeUpdate(); 55 | assertEquals(1, rows, "Inserted rows"); 56 | try (ResultSet rs = ps.getGeneratedKeys()) { 57 | rs.next(); 58 | long createdUserId = rs.getInt(1); 59 | assertEquals(expectedUserId, createdUserId, "Expected new userId"); 60 | } 61 | 62 | } 63 | 64 | try (PreparedStatement ps = connection.prepareStatement("select user_id, user_name from account where user_id = ?")) { 65 | ps.setLong(1, expectedUserId); 66 | try (ResultSet rs = ps.executeQuery()) { 67 | while (rs.next()) { 68 | long userIdFromDb = rs.getLong("user_id"); 69 | String userNameFromDb = rs.getString("user_name"); 70 | logger.info("selected userId:{}, userName:{}", userIdFromDb, userNameFromDb); 71 | assertEquals(expectedUserId, userIdFromDb, "Expected selected userId"); 72 | assertEquals(userName, userNameFromDb, "Expected selected userName"); 73 | } 74 | } 75 | } 76 | } 77 | } 78 | 79 | private Connection makeConnection() throws SQLException { 80 | String url = postgresqlContainer.getJdbcUrl(); 81 | Properties props = new Properties(); 82 | props.setProperty("user", postgresqlContainer.getUsername()); 83 | props.setProperty("password", postgresqlContainer.getPassword()); 84 | props.setProperty("ssl", "false"); 85 | return DriverManager.getConnection(url, props); 86 | } 87 | 88 | } 89 | -------------------------------------------------------------------------------- /testContainers/src/test/resources/00_createTables.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE account( 2 | user_id serial PRIMARY KEY, 3 | user_name VARCHAR (50) UNIQUE NOT NULL 4 | ); -------------------------------------------------------------------------------- /testContainers/src/test/resources/01_insertData.sql: -------------------------------------------------------------------------------- 1 | insert into account(user_name) values ('Vasy'); 2 | insert into account(user_name) values ('Jack'); 3 | --------------------------------------------------------------------------------