diff --git a/docs/modules/solr.md b/docs/modules/solr.md
index a332c7cbcbe..73546dcbd6d 100644
--- a/docs/modules/solr.md
+++ b/docs/modules/solr.md
@@ -9,7 +9,7 @@ Note that it's based on the [official Docker image](https://hub.docker.com/_/sol
You can start a solr container instance from any Java application by using:
-[Using a Solr container](../../modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java) inside_block:solrContainerUsage
+[Using a Solr container](../../modules/solr/src/test/java/org/testcontainers/solr/SolrContainerTest.java) inside_block:solrContainerUsage
## Adding this module to your project dependencies
diff --git a/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java b/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java
index c4172bb8e01..a921eb2f458 100644
--- a/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java
+++ b/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java
@@ -23,6 +23,8 @@
*
Solr: 8983
* Zookeeper: 9983
*
+ *
+ * @deprecated use {@link org.testcontainers.solr.SolrContainer} instead.
*/
public class SolrContainer extends GenericContainer {
diff --git a/modules/solr/src/main/java/org/testcontainers/solr/SolrContainer.java b/modules/solr/src/main/java/org/testcontainers/solr/SolrContainer.java
new file mode 100644
index 00000000000..536afa69dfd
--- /dev/null
+++ b/modules/solr/src/main/java/org/testcontainers/solr/SolrContainer.java
@@ -0,0 +1,156 @@
+package org.testcontainers.solr;
+
+import com.github.dockerjava.api.command.InspectContainerResponse;
+import lombok.SneakyThrows;
+import org.apache.commons.lang3.StringUtils;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.containers.SolrClientUtils;
+import org.testcontainers.containers.SolrContainerConfiguration;
+import org.testcontainers.containers.wait.strategy.Wait;
+import org.testcontainers.utility.ComparableVersion;
+import org.testcontainers.utility.DockerImageName;
+
+import java.net.URL;
+import java.time.Duration;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Testcontainers implementation for Solr.
+ *
+ * Supported image: {@code solr}
+ *
+ * Exposed ports:
+ *
+ * - Solr: 8983
+ * - Zookeeper: 9983
+ *
+ */
+public class SolrContainer extends GenericContainer {
+
+ private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("solr");
+
+ public static final Integer ZOOKEEPER_PORT = 9983;
+
+ public static final Integer SOLR_PORT = 8983;
+
+ private SolrContainerConfiguration configuration;
+
+ private final ComparableVersion imageVersion;
+
+ public SolrContainer(final String dockerImageName) {
+ this(DockerImageName.parse(dockerImageName));
+ }
+
+ public SolrContainer(final DockerImageName dockerImageName) {
+ super(dockerImageName);
+ dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME);
+
+ waitingFor(
+ Wait.forLogMessage(".*o\\.e\\.j\\.s\\.Server Started.*", 1).withStartupTimeout(Duration.ofMinutes(1))
+ );
+ this.configuration = new SolrContainerConfiguration();
+ this.imageVersion = new ComparableVersion(dockerImageName.getVersionPart());
+ }
+
+ public SolrContainer withZookeeper(boolean zookeeper) {
+ configuration.setZookeeper(zookeeper);
+ return self();
+ }
+
+ public SolrContainer withCollection(String collection) {
+ if (StringUtils.isEmpty(collection)) {
+ throw new IllegalArgumentException("Collection name must not be empty");
+ }
+ configuration.setCollectionName(collection);
+ return self();
+ }
+
+ public SolrContainer withConfiguration(String name, URL solrConfig) {
+ if (StringUtils.isEmpty(name) || solrConfig == null) {
+ throw new IllegalArgumentException();
+ }
+ configuration.setConfigurationName(name);
+ configuration.setSolrConfiguration(solrConfig);
+ return self();
+ }
+
+ public SolrContainer withSchema(URL schema) {
+ configuration.setSolrSchema(schema);
+ return self();
+ }
+
+ public int getSolrPort() {
+ return getMappedPort(SOLR_PORT);
+ }
+
+ public int getZookeeperPort() {
+ return getMappedPort(ZOOKEEPER_PORT);
+ }
+
+ @Override
+ @SneakyThrows
+ protected void configure() {
+ if (configuration.getSolrSchema() != null && configuration.getSolrConfiguration() == null) {
+ throw new IllegalStateException("Solr needs to have a configuration if you want to use a schema");
+ }
+ // Generate Command Builder
+ String command = "solr start -f";
+ // Add Default Ports
+ addExposedPort(SOLR_PORT);
+
+ // Configure Zookeeper
+ if (configuration.isZookeeper()) {
+ addExposedPort(ZOOKEEPER_PORT);
+ if (this.imageVersion.isGreaterThanOrEqualTo("9.7.0")) {
+ command = "-DzkRun --host localhost";
+ } else {
+ command = "-DzkRun -h localhost";
+ }
+ }
+
+ // Apply generated Command
+ setCommand(command);
+ }
+
+ @Override
+ public Set getLivenessCheckPortNumbers() {
+ return new HashSet<>(getSolrPort());
+ }
+
+ @Override
+ protected void waitUntilContainerStarted() {
+ getWaitStrategy().waitUntilReady(this);
+ }
+
+ @Override
+ @SneakyThrows
+ protected void containerIsStarted(InspectContainerResponse containerInfo) {
+ if (!configuration.isZookeeper()) {
+ ExecResult result = execInContainer("solr", "create", "-c", configuration.getCollectionName());
+ if (result.getExitCode() != 0) {
+ throw new IllegalStateException(
+ "Unable to create solr core:\nStdout: " + result.getStdout() + "\nStderr:" + result.getStderr()
+ );
+ }
+ return;
+ }
+
+ if (StringUtils.isNotEmpty(configuration.getConfigurationName())) {
+ SolrClientUtils.uploadConfiguration(
+ getHost(),
+ getSolrPort(),
+ configuration.getConfigurationName(),
+ configuration.getSolrConfiguration(),
+ configuration.getSolrSchema()
+ );
+ }
+
+ SolrClientUtils.createCollection(
+ getHost(),
+ getSolrPort(),
+ configuration.getCollectionName(),
+ configuration.getConfigurationName()
+ );
+ }
+}
diff --git a/modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java b/modules/solr/src/test/java/org/testcontainers/solr/SolrContainerTest.java
similarity index 97%
rename from modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java
rename to modules/solr/src/test/java/org/testcontainers/solr/SolrContainerTest.java
index 0e463d11111..f63c4d38164 100644
--- a/modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java
+++ b/modules/solr/src/test/java/org/testcontainers/solr/SolrContainerTest.java
@@ -1,4 +1,4 @@
-package org.testcontainers.containers;
+package org.testcontainers.solr;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrServerException;
@@ -12,7 +12,7 @@
import static org.assertj.core.api.Assertions.assertThat;
-public class SolrContainerTest {
+class SolrContainerTest {
private SolrClient client = null;