Docker-Compose – Create First Docker-Compose – Learning-Ocean
Mục Lục
Create First docker-compose File
To create multiple containers we need to use docker-compose.yaml file, let’s understand how a docker-compose file works and what instructions need to be defined inside it.
To run a nginx container the manual is
gaurav@learning
-ocean:~$ docker containerrun
-itd nginx
but if the same container if we want to create using docker-compose file then we need to create a YAML file using vi docker-compose.yaml and snippet is shown below
version:
'3'
services:
webapp1:
image:
nginxports:
-"8000:80"
Version :- Property is defined by the specification for backward compatibility but is only informative.
Services:- It defines the number of applications or containers which need to be created. As shown in the above example under webapp1 it defines the first container which will get created using image nginx and expose ports “8000:80”. By giving the image name as nginx, we are specifying the container should get built on nginx and we can give any image name as per the requirement. Ports property defines the port mapping of the host to the container, port 8000 is the host port that will map to port 80 of the container.
After creating the docker-compose.yaml file, run docker-compose up -d and it will create a new container .
output:
gaurav@learning
-
ocean:~/
docker-
compose$ sudo docker-
compose up-
d [sudo] passwordfor
gaurav: Creating network "docker-compose_default"with
thedefault
driver Pulling webapp1 (nginx:)... latest: Pullingfrom
library/
nginx a330b6cecb98: Alreadyexists
e0ad2c0621bc: Pull complete9e56
c3e0e6b7: Pull complete09
f31c94adc6: Pull complete32
b26e9cdb83: Pull complete20
ab512bbb07: Pull complete Digest: sha256:853
b221d3341add7aaadf5f81dd088ea943ab9c918766e295321294b035f3f3e Status: Downloaded newer imagefor
nginx:latest Creating docker-
compose_webapp1_1 ... done gaurav@learning
-
ocean:~/
docker-
compose$ sudo docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES2939
df15d408 nginx "/docker-entrypoint.…" About aminute
ago Up About aminute
0.0.0.0
:8000
->
80
/
tcp docker-
compose_webapp1_1 gaurav@learning
-
ocean:~/
docker-
compose$ sudo docker network ls NETWORK ID NAME DRIVERSCOPE
0022
a9f511fe bridge bridgelocal
b96ba06066a8 docker-
compose_default bridgelocal
3
a33f83c3663 host hostlocal
e4ebd601732cnone
null
local
As shown in the above output ,new nginx container is up and the command also shows the mapping of ports along with the name of the container. Now the Nginx application could be accessed by giving localhost and port in URL as shown below.
Docker-compose command creates the new network and docker compose down will delete all the created configuration
output:
gaurav@learning
-
ocean:~/
docker-
compose$ docker-
compose down Stopping docker-
compose_webapp1_1 ... done Removing docker-
compose_webapp1_1 ... done Removing network docker-
compose_default gaurav@learning
-
ocean:~/
docker-
compose$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES gaurav@learning
-
ocean:~/
docker-
compose$ docker network ls NETWORK ID NAME DRIVERSCOPE
0022
a9f511fe bridge bridgelocal
3
a33f83c3663 host hostlocal
e4ebd601732cnone
null
local
Now, suppose we want to create two containers using docker-compose YAML file. It’s very easy ,just require one more webapp to be defined inside YAML file as shown below
version:
'3'
services:
webapp1:
image:
nginxports:
-"8000:80"
webapp2:
image:
nginxports:
-"8001:80"
Webapp2 is the second container which will bring up the same image as nginx(can be changed as per your choice) and the host port has changed to 8001 and now as shown below webapp2 container is up on 8001 port of host.
output:
gaurav@learning
-
ocean:~/
docker-
compose$ docker-
compose up-
d Creating network "docker-compose_default"with
thedefault
driver Creating docker-
compose_webapp2_1 ... done Creating docker-
compose_webapp1_1 ... done gaurav@learning
-
ocean:~/
docker-
compose$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES4
f4a2060650c nginx "/docker-entrypoint.…"6
seconds ago Up4
seconds0.0.0.0
:8001
->
80
/
tcp docker-
compose_webapp2_1 e7923ed200c0 nginx "/docker-entrypoint.…"6
seconds ago Up5
seconds0.0.0.0
:8000
->
80
/
tcp docker-
compose_webapp1_1 gaurav@learning
-
ocean:~/
docker-
compose$ docker network ls NETWORK ID NAME DRIVERSCOPE
0022
a9f511fe bridge bridgelocal
a6a32f981f30 docker-
compose_default bridgelocal
3
a33f83c3663 host hostlocal
e4ebd601732cnone
null
local
gaurav@learning
-
ocean:~/
docker-
compose$ docker volume ls DRIVER VOLUME NAME gaurav@learning
-
ocean:~/
docker-
compose$
What happens if we re-run the docker-compose file, Will it recreates the same containers again?
The answer to this question is, docker, compose will read the yaml file instruction and it will only recreate the container if it has any changes in any of the properties.
Let’s change the host port of webapp2 to 8002 and rerun the docker-compose command
output:
gaurav@learning-ocean
:~/docker-compose$ cat docker-compose.yamlversion
:'3'
services
: webapp1:image
: nginxports
: -"8000:80"
webapp2:image
: nginxports
: -"8002:80"
gaurav@learning-ocean
:~/docker-compose$ docker-compose up -d docker-compose_webapp1_1 is up-to-date Recreating docker-compose_webapp2_1 ... done gaurav@learning-ocean
:~/docker-compose$
As shown in above output only webapp2 is getting re-created because the host port for it has been changed from 8001 o 8002
Docker-compose up command always search for docker-compose.yaml file in the present working directory and if you change this file name docker compose command will fail as shown below:
output:
Can we Change the docker-compose.yaml’s file name?
There may be a situation in the future where user doesn’t want to give the default name of compose file due to various reasons, the user wants to give its own file name, this could also be achieved by using -f flag of docker compose command and by specifying -f option docker will not search for default file instead it will search for file provided after -f flag.
[email protected]:~/docker-compose$
docker-compose -f docker-compose.yaml.bkp up -d Creating network"docker-compose_default"
with the default driverCreating
docker-compose_webapp1_1 ... doneCreating
docker-compose_webapp2_1 ... done [email protected]:~/docker-compose$
can we write a docker-compose file in JSON or any other format ?
Another important point to highlight is ,it is not mandatory to have only yaml file format for docker compose command, it can also work with JSON file format. Convert the yaml instruction to json and create a json file using vi docker-compose.json
{
"version"
: "3"
,
"services"
: {
"webapp1"
: {
"image"
: "nginx"
,
"ports"
: [
"8000:80"
]
},
"webapp2"
: {
"image"
: "nginx"
,
"ports"
: [
"8002:80"
]
}
}
}
output:
[email protected]:~/docker-compose$
docker-compose -f docker-compose.json up -d Creating network"docker-compose_default"
with the default driverCreating
docker-compose_webapp2_1 ... doneCreating
docker-compose_webapp1_1 ... done [email protected]:~/docker-compose$


















![Toni Kroos là ai? [ sự thật về tiểu sử đầy đủ Toni Kroos ]](https://evbn.org/wp-content/uploads/New-Project-6635-1671934592.jpg)


