1 machines physique = plusieurs machines logiques
✅ Avantages
😱 Inconvénients
sudo unshare -f -p --mount-proc usr/bin/sh
sudo docker container run hello-world
#Lancer un conteneur
sudo docker container run [-it] [-p port_local:port_conteneur] [--name conteneurname] [image_name]
#Voir les conteneurs
sudo docker container ps
#Stopper un conteneur
sudo docker stop [id/name]
#Lancer une commande dans un conteneur
sudo docker exec [id/name] [commande]
#Rentrer dans un conteneur
sudo docker exec -it [id/name] bash
sudo docker container un [-v host/path:conteneur/folder[:ro]] [image_name]
# Téléchargement de la dernière image python
FROM python:3.8.3-alpine
# Création de variable d'environnement
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# Installation de package nécessaire à lxml
RUN apk add --no-cache --virtual .build-deps gcc libc-dev libxslt-dev && \
apk add --no-cache libxslt && \
pip install --no-cache-dir lxml>=3.5.0 && \
apk del .build-deps
# installation du fichier requirements.txt
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
# Run l'application
CMD ["gunicorn", "mysite.wsgi" , "-b", "0.0.0.0:8000"]
docker image build -t myimage:latest .
Si vous êtes en avance faite la même chose avec une base mongodb
On aimerait une macro image de 3 conteneurs
Compose is a tool for defining and running multi-conteneurDocker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features.
docker run -d \
--name mongodb \
-p 27017:27017 \
-e MONGO_INITDB_ROOT_USERNAME=hello \
-e MONGO_INITDB_ROOT_PASSWORD=world \
mongo
version: "3.9"
services:
mongodb:
image: mongo
container_name: mongo
ports:
- 27017:27017
environment:
- MONGO_INITDB_ROOT_USERNAME=hello
- MONGO_INITDB_ROOT_PASSWORD=world
Pour créer un conteneur mongodb + mongo express
docker network create mongo_net
docker run -d \
--name mongodb \
--network mongo_net \
-p 27017:27017 \
-e MONGO_INITDB_ROOT_USERNAME=hello \
-e MONGO_INITDB_ROOT_PASSWORD=world \
mongo
docker run -d \
--network mongo_net \
-e ME_CONFIG_MONGODB_ADMINUSERNAME=hello \
-e ME_CONFIG_MONGODB_ADMINPASSWORD=world \
-e ME_CONFIG_MONGODB_SERVER=mongodb \
-p 8081:8081 \
mongo-express
L'équivalent docker-compose.yml
version: "3.9"
services:
mongodb:
image: mongo
container_name: mongo
ports:
- 27017:27017
environment:
- MONGO_INITDB_ROOT_USERNAME=hello
- MONGO_INITDB_ROOT_PASSWORD=world
mongo-express:
image: mongo-express
ports:
- 8081:8081
environment:
- ME_CONFIG_MONGODB_ADMINUSERNAME: hello
- ME_CONFIG_MONGODB_ADMINPASSWORD: world
- ME_CONFIG_MONGODB_SERVER: mongodb
depends_on:
- mongodb
version: "3.9"
services:
mongodb: # Nom du service
image: mongo # Nom de l'image à utiliser
build : path/to/dockerfile # Si l'image n'est pas en local, on la construit
container_name: mongo # le nom du conteneur --name
ports: # les ports -p
- 27017:27017
environment: # les variables d'env -e ou --env
MONGO_INITDB_ROOT_USERNAME: hello
MONGO_INITDB_ROOT_PASSWORD: world
mongo-express: # Un autre conteneur
image: mongo-express
ports:
- 8081:8081
environment:
ME_CONFIG_MONGODB_ADMINUSERNAME: hello
ME_CONFIG_MONGODB_ADMINPASSWORD: world
ME_CONFIG_MONGODB_SERVER: mongodb
depends_on: # Doit être lancé une fois que la liste est construite
- mongodb
# Lancer un groupe de service en étant dans le dossier du docker-compose.yml
docker-compose [-f file] up
# Éteindre
docker-compose down
# Voir
docker-compose ps
# Exécuter commande
docker-compose exec [container name]
org.testcontainers
testcontainers
1.16.2
test
org.testcontainers
junit-jupiter
1.16.2
test
@conteneur# Annotation pour laisser testconteneurgérer le cycle de vie
private static PostgreSQLContainer<?> postgresDB =
new PostgreSQLContainer<>("postgres:13.2") //nom de l'image
.withDatabaseName("postgres") // passage de variable d'environnement
.withUsername("postgres")
.withPassword("secret");
@Testcontainers
@SpringBootTest
@ContextConfiguration(initializers = {EmployeeServiceTest.Initializer.class})
class EmployeeServiceTest {
@Container
private static PostgreSQLContainer<?> postgresDB =
new PostgreSQLContainer<>("postgres:13.2") // nom de l'image
.withDatabaseName("postgres") // passage de variable d'environnement
.withUsername("postgres")
.withPassword("secret");
static class Initializer
implements ApplicationContextInitializer<ConfigurableApplicationContext> {
public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
TestPropertyValues.of(
"spring.datasource.url=" + postgresDB.getJdbcUrl(),
"spring.datasource.username=" + postgresDB.getUsername(),
"spring.datasource.password=" + postgresDB.getPassword(),
"spring.jpa.hibernate.ddl-auto=create-drop" // pour initialiser la base
).applyTo(configurableApplicationContext.getEnvironment());
}
}
@Test
void getEmployees() {
// GIVEN
// WHEN
Iterable<Employee> employees = employeeService.getEmployees();
// THEN
assertNotNull(employees);
}