├── .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 |
--------------------------------------------------------------------------------