This is post in continuation of Docker: Orchestrate multiple containers with docker-compose
The same application environment is specified using the docker-compose V2 specification. This looks very similar but with a simplified syntax and some extra features.
STEP 1: List the existing images
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.0.0.245:5000/test_app.v7 flat 53ac9d27fbb3 5 days ago 1.699 GB
docker.io/wnameless/oracle-xe-11g latest 38037473cce1 9 weeks ago 2.234 GB
We can see that we already have two images with our test application based on Glassfish application container and a copy of the official oracle 11g image.
STEP 2: Create the Dockerfile configuration file for the DB.
Create a new directory for the environment “my_app_env” and under it another for DB files “db” and in it then create Dockerfile configuration file:
# mkdir my_app_env
# cd my_app_env
# mkdir db
# mcedit Dockerfile
Paste as the content of the Dockerfile file the following:
FROM wnameless/oracle-xe-11g
ADD init.sql /docker-entrypoint-initdb.d/
CMD /usr/sbin/startup.sh && /usr/sbin/sshd -D
where:
FROM = specifies the base image we are using to create our custom image
ADD = add aditional data to the base image in the specified location
CMD = add a custom command used to start-up a container from this image
Then create the database initialization script:
# cd ..
# mkdir db
# mcedit init.sql
Here we can create tablespaces, add users, import data etc.
-- USER SQL
create user myuser IDENTIFIED by password default tablespace USERS temporary tablespace temp;
-- ROLES
GRANT "CONNECT" TO "myuser" ;
GRANT "RESOURCE" TO "myuser" ;
STEP 3: Create the Dockerfile configuration file for the APP.
Create a new directory and then create Dockerfile configuration file:
# mkdir app
# mcedit Dockerfile
Paste as the content of the Dockerfile file the following:
FROM nexus:5555/my_app:v6
CMD /opt/testScripts/startAll.sh
where:
FROM = specifies the base image we are using to create our custom image
CMD = add a custom command used to start-up a container from this image
STEP 4: Create the docker-compose.yml configuration file for the application environment.
Create a new directory and then create Dockerfile configuration file:
# cd ..
# mcedit docker-compose.yml
Paste as the content of the docker-compose.yml file the following:
version: '2'
services:
my_app:
build: ./app
ports:
- "7000:7000"
- "7002:7002"
- "7006:7006"
- "7032:7032"
- "7036:7036"
links:
- oracle:oracle
stdin_open: true
tty: true
oracle:
build: ./db
ports:
- "1521:1521"
where:
version: tell the docker-compose this is a version 2 yml file
my_app: the name we give to the application container
build: the directory where the image build files reside. Here we usually have the Dockerfile and all the additional files needed to build the image
ports: mapping of internal ports to the host ports. This is equivalent of -p from docker run command
links: link to a dependency container. This is the equivalent of the –link from docker run command
command: this is the command line used to start the container. Note that we have here a call to a shell script where we start several Glassfish domains and other applications.
stdin_open: true = this starts interactive mode. This is the equivalent of the -i from docker run command
tty: true = this allocates a terminal. This is the equivalent of the -t from docker run command
oracle: the name given to the DB container. Note that this is the name referred in the above –link option.
build: the directory where the image build files reside. Here we usually have the Dockerfile and all the additional files needed to build the image
ports: mapping of internal ports to the host ports. This is equivalent of -p from docker run command. It is not necessary to map this port for my_app to be able to access it. We are doing this mapping just to be able to connect from the host directly to the DB with a client like sqldeveloper or toad.
STEP 5: Initialize the environment
# cd test_app
# docker-compose up
The docker-compose will create two new images the will instantiate containers and start them up.
REPOSITORY TAG IMAGE ID CREATED SIZE
10.0.0.245:5000/test_app.v7 flat 53ac9d27fbb3 5 days ago 1.699 GB
docker.io/wnameless/oracle-xe-11g latest 38037473cce1 9 weeks ago 2.234 GB
my_app_envcomposev2_my_app latest a6f495d75046 15 hours ago 2.542 GB
my_app_envcomposev2_oracle latest 2880b4ee4984 17 hours ago 2.234 GB
We can check out the running containers:
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce02c9b9f31b my_app_envcomposev2_my_app "/bin/sh -c /opt/test" 15 hours ago Up 15 hours 4848/tcp, 0.0.0.0:7000->7000/tcp, 0.0.0.0:7002->7002/tcp, 7001/tcp, 0.0.0.0:7006->7006/tcp, 0.0.0.0:7032->7032/tcp, 7031/tcp, 8080/tcp, 8181/tcp, 9009/tcp, 0.0.0.0:7036->7036/tcp my_app_envcomposev2_my_app_1
6a09af4ce7ae my_app_envcomposev2_oracle "/bin/sh -c '/usr/sbi" 17 hours ago Up 15 hours 22/tcp, 8080/tcp, 0.0.0.0:1521->1521/tcp my_app_envcomposev2_oracle_1
48c832c6333c 541a6732eadb "/entrypoint.sh /etc/" 4 months ago Up 17 hours 0.0.0.0:5000->5000/tcp
STEP 6: Start/Stop, rebuild the environment
To stop the containers created just call
# docker-compose stop
To start again the containers created just call
# docker-compose start
In case changes are added to rebuild again the images and create new containers just call
# docker-compose up --build
[paypal_donation_button]