 Okay, I already today I'm talk about the visualization and At usual, I think many of you know me upon the first day Some of you may not so For who doesn't know me before so I'm Michael and boy. I'm started with pp glam stack for about 10 years ago and I Like programming Your attention Please That's good for my attention You We are investigating the situation, please remain calm and stand by for further instruction. Thank you. Ladies and gentlemen, please pay your attention. It's too hot here. The fire alarm is on. We are investigating the situation, please remain calm and stand by for further instruction. Thank you. You should download the docker, just go to docker.com, docker, just download and install the docker.com, then you can install the toonbox. So basically the docker toonbox is running a docker inside a virtualbox. This is a functional test of systems operation given to it. Wi-Fi? Ah, again? This is a functional test of systems operation given to it. Do you have a Wi-Fi password? Yes. Please do not be afraid. I don't have it here. Public address system test, this is a functional test of systems operation given to it. Thank you very much. Thank you. Then you can try to install the docker toonbox. I think it's easier. Toonbox? On the website, when you go to the download page, it says download docker for Windows, but because this architecture may be different. We run a virtualization inside another virtualization. Basically by default it's run inside a virtual box machine. Okay, let's see if it's started. Just wait for it to be started. This window 10, right? This window 10, right? Oh, okay. It looks nice. Okay, and run the terminal. Good, good, good. So, do you need to install the docker toonbox? Yeah, no need. Everything is running fine now. So, we have to stop every half hour? No, no, no. It's gonna help them all play. Do we need to wait or... Okay, so do we need to wait or... Okay, it's okay. Let us just think and cut the line. Let us think and cut the line. Okay. They need some Wi-Fi password. I think he's passing. Okay, so let's start again. Okay, so... I'm Michael Buoy. I started with PEP about 10 years ago. I'm officially working for a company since 2008, around nine years ago. And I like programming. I like learning new things and I like building things. I like photography, playing chess, traveling, tracking, and I like sports. And I'm father of a lovely doctor. Okay, today, the main topic is virtualization. We have two things about virtualization. One is vagran. The other one is docker. But I think vagran has become outdated nowadays. Yeah, vagran. Okay, so vagran. Previously, vagran is a tool for you to manage some virtualization machine like VMware or VirtualBox. And it boosts up your machine and runs some script to do some stuff like install your component, install your software inside the virtual machine for you. So you have everything ready. And of course, if you use vagran, you can do puppet or chess to do installation for you. Yeah. But running a virtual machine is a bit heavy because we don't really need everything from another operating system. So that is docker come up to solve our problem. It provides the only package, only library and binary files we need to run our application only. So it's really very lightweight. And there's more things for docker. For example, docker introduces, not introduce but the concept of microservices, architectures. So previously, even for vagran or for traditional architecture, they call it monolithic architecture, you have everything installed in one machine or multiple machines but very hard-coded. So you have NGINX to run a web service or you have a PPP to run your application and you have MySQL database and some may have memcache, redis. You install everything there and the configuration is almost hard-coded to your application. By doing like that, it's quite difficult to scale your application. If you want to scale something, you need to scale all the other things as well. So basically you can do something, you can use something like load balancing from AWS to how to scale your servers. But for example, NGINX, redis doesn't need to be scaled because it can handle a very high load. But for database or for PPP, sometimes the load is not so high. So we only want to scale PPP only. And by doing microservices, we separate this component. We run NGINX in an isolated environment. PPP application in isolated environment. Database, depending on your concept, it can be run in an isolated environment or you can run it in a server. Redis can also be run in an isolated environment. So if you want to scale your PPP application, you just need to scale that part only. All the other parts can keep at ease. That architecture, they call it microservices architecture. Even more, you can break down your PPP application into even smaller space. Like for example, you have 0MQ or rabbit MQ to run a message queue. So you have application here and you have a byte ground application running on the byte ground. For example, if you want to process a video or PDF file, it takes a very long time. So one user uploaded. We need to tell the user that OK, your file is uploaded and we are processing. And the processing time shouldn't be affected to the user. The user shouldn't have to wait for us. So basically what we are doing is we upload the file and send a message to a byte ground application through the message queue like 0MQ or rabbit MQ. And by sending the message, we know that OK, the byte ground application will handle the uploaded file and we tell user OK, your file is uploaded already and we are processing in the byte ground and we will inform you when it's done. So by separating the application like that, we can use microservices for each component. Like the main application for your message queue service and for the byte ground services. So for example, if your file is uploaded and you send a message to your byte ground, the byte ground let's just call it video processing. So once video processing is sent another message to another byte ground and another byte ground will say OK, I mean send a notification. A notification can be like email notification, SMS notification or maybe push notification. It's a notification application can be run in a separate service as well. So like for example, video processing is very heavy. You can scale only the video processing to like 100 instant, instant of one. So you don't have any effect to like email notification or SMS notification or push notification. So Docker, the concept is not new but Docker is, when Docker is born, it helps us to build that architecture very easily, very convenient. We have a concept of container and each container will run one service. So from now when we say that a container we're thinking about one service. One service can be a concept of multiple containers if you want to scale it. If you scale a service to 100 instant we may have 100 containers. Can you speak louder? It's up to you to run Harmony machine. It's maybe virtual machine or real machines. So Docker can run in virtual machine or in the real machine. Docker can run in Raspberry Pi as well. So yes, actually it's not running a virtual machine. It's not a virtual machine at all. It's a group of libraries and binary files. So when you work with it, you feel that you're working in a new operating system but it's not actually a full operating system. So now people use Docker in a production environment. And we are moving to production environment. So it's not hard to apply Docker to the application. The hardest part is how to break down the application into a small service so you can separate them. Once you can do that, you can use Docker very easily, very convenient. Later I will show you one application like that. Okay, so any one of you worked with Docker before? Okay, so any question for Docker for now? Okay, let's start with Docker. I will show you a full application first and we try to practice to build our own Docker service and see how Docker works and we get to know with some Docker tools to serve some of our purpose. The tool we use today will be Docker Engine with the core library for Docker. The second one is Docker Compose. Docker Compose is an orchestration tool built in Docker. It will organize your services. You can check out this source. This is the source code for my talk two months ago in PPP Group as well. And once we check it out, we can start. Thank you. This is a functional test of systems operation in the building. Please do not be alarmed. Thank you. This is a functional test of systems operation in the building. Please do not be alarmed. Thank you. You need some bibinish access so you need the key. I think Michael is looking for Power Street. Yes. Where is the result of the comment? Yeah, we downloaded a lot of stuff. I stopped by a party with him because I was running late. But since... Not sure if anything is running in 8th house. In this case, when Docker is running, I say I'm also actually running. You are very fast. It's usually if the port is used already. Then it will say there's a port conflict. And Docker will not run. The latter will not run. You guys check out on the code from this repo. Okay. You don't have to run any command on the readme file. Yes. I will run and show you first. I will make this one. Can you see? Okay. So basically this command lists all the Docker containers running in my machine. And just to show you there's nothing is running here. What I'm going to run is... I will run the depth environment. If you see, I will use the Docker Composer file. Let me zoom it. Can you see it now? From the bottom. Okay. So I run the Docker Composer. I will give the file as my depth file. And I name the project as ppsg depth. And then I run it. I bring them up. And I run it at Daemon. After running this one, I expect that I can open a website as this address. And I can see my application. I can see my application now. Now I try to delete all this service. And I expect that my application will gone. Yes. I will explain in detail later. Now I bring them down. It's done. And as you can see here, we don't have any containers. No containers here. And there we go here. I refresh it. It's gone. Now I bring them up again. And I will show you. I will explain you what happening. The first thing you see is create a network. This network is for the container to communicate to each other. This is internal network for this container. And then after create the network, it will create the container for each service. So as you can see here the number at the end of the container name is the container index for each service. So for example, if the back end, this back end container, if I want to scale this back end container to 100, there will be 100 containers with the suffix like underscore 1 underscore 2 underscore 100. My application is considered a three service here. The first one is a front end. The front end is running Nginx. Back end is PPP application and a database running MySQL. This container will be run up and running just to import basic database into MySQL server. Just enough for the application to run. Okay, by the first time when it's run, all of this container will run at the same time. So my database server is booting up. But this container already started and because it cannot connect to database server, it went through error. It didn't fail to import database. So by this moment, if I open the website, there will be an error. We don't have a database inside our MySQL server. I don't know. Let me check is this one. But this one is the database is being imported already. It's maybe because of the file system is in assisting in my host machine. Okay, but forget about the database restore. Let's focus on the three service, database, back end and front end. So basically, now if I want to scale my back end to 100 instance, I can scale it very easily. So the hyphen f is given the local composer files. The local composer file will define all our architecture. I will open the file and show you later. The hyphen p is named your project. So this project name is ppsg depth. And this one will be our prefix for all the container inside this project. So that's why you can see all the container will be started with ppsg depth. This one just to, I just want to differences between the project for depth and product or test or something like that. Otherwise, if this one is not given, the folder contain the local composer file will be used as a project name. So it doesn't look so nice. So I want to make it nicer. Sorry, can I say again? I will explain the content of this file later. So as you can see here, the back end will have a fine instance. I just scale the number of the back end to fine. So it's created a new local container for the same service. So I expected my application is still running fine. I didn't prepare here, but we can see there are some ways we can see the difference in the back end containers. So this is a kind of load balancing. We have five back end applications and we have one front end only. And front end is running nginx. It's acting like a very basic load balancer for us. So the one question here is, if all of these containers is in one machine, it doesn't make sense, right? Because what we want to do is we want to run a load balancing in a different machine. So we can do that by using another tune for this one. I'm not sure if Docker combos can do that, but have another tune from Docker. It's built in as well since Docker 1.12. They call it Docker swarm. For Docker swarm, you can build a cluster of machine and you can specify this portion of cluster when running database. This portion of Docker can run application, back end. This portion of the cluster will run front end, for example like that. And when you scale your service, it's auto launching in this, in your pre-defined machine only. So for example, if you have five machines, five machines but you only have three containers. So how many containers are organized inside the machine? It's based on the strategy you define. So you can define, the strategy is like, you can launch at least the last machine the better. So it puts all the containers in the minimum machine. But that means the load is way behind. The other one is that you can launch as many machines as possible. So basically the three containers will run each container on one machine. And two machines will be free. So basically manually you can do like this. You can keep monitoring the container and see if it consumes how many resources. Or you can limit the container to a certain resource. Like for example, you can limit a container to use only 10% of memory and 10% of CPU. So when it rigs that limit, then another tune can monitoring that. And one is rigged like 100% of the allocated resource for that container for like five minutes, even automatically launch a new container. In that machine or another machine, it's up to you. That tune is very powerful. Swarm, I think Docker Swarm can do that now. And the tune I'm just mentioning is Kubernetes. So Kubernetes is still one of the most powerful tunes for orchestras to organize your Docker services. This is a function test of systems operation in the building. Okay, so the Docker Compose here is mostly used for development environment. For production, they will use Docker Swarm or they will use Kubernetes. So now I'm going to scale back this back end to only one container. As you can see, it's automatically removed on the unnecessary container for us. And if I list the container here, you can see it's only have three. Do you have power strip? Okay, so we have power strip now. This is not related to version boss. Can I try to restart? You can click there and go to DNS. I'm going to install Docker because this one is not for running the application. This is mainly for how to use Docker to run the application. If the thing goes up, the exit is that way. Okay, so you can start from here. Then you need to put, you need to change this file to your local part. This is a part to your Docker. Yeah, but you need to run this one, this is a dev one. But you need to change this Docker compose.dev.jammu to your local part. Yes. If you check out my project, this file will be inside my project. Inside here. So do you have it running? No, it cannot. Stink cannot? Yes. So I will try this again. My own project and my scale is this one. It shouldn't be that you can try. I'm not sure. I'm not sure you can try it like this. This is the reason. I think it cannot connect to your local. Do you have any firewall? Do you have any firewall installed? Maybe you try to restart your computer. Okay, can you get it running? The port is only allocated, so which command is running? Just now this one. This one, right? Okay, because 8000 is running. So... Yes, so you can run this one. This one will run 8800, it's not 8000. Just give it some time. Do you get it running? Yes, it's a Laravel, a basic Laravel application. I use this because many of us get used to Laravel. Later I'll explain how Laravel is working. You need to install the code first. It's in already, right? Okay. Let me check with John. This one in here. This guy also has the same problem. This one is not running. It's still there. Config in the engine.config, not inside the folder. This one is managed by the local network. No, but I think this one, because it cannot access to the local container. No, it cannot connect. Just one guy, the guy in blue is working. Somebody restore into it. And the folder is missing. So that's why it calls the PP. It's then it's not running properly. And try and try and see. Wait for this to be finished. It just didn't have a problem, right? Okay. It's different. So you have a problem with loading the website, right? Yeah. Okay. Do you have a Composer installed? Yeah, I think it's missing the Composer vendor. Can you go back to your terminal? Yeah. Let me try. Just to write the Composer installed. Where is your Composer? I don't know. Okay. You don't have Composer installed? Okay. I used it last week, so it had to be installed. Last time, right? Yeah. But maybe installing another folder. I think it was installed in a local directory. Yeah. It's Composer.thr, right? Yes, correct. Composer.thr. Never mind, we can just run this. I know where it is. Okay. Where should it be, though? You can copy it here? Copy it into here. Yeah. That's it. End of this project. Yeah. 1000. They have Composer installed. Do you have Composer? Oh, yes. You should have, right? Okay. Where is your Composer? Can you just copy it? No, not only just. Oh, then you have... Yeah, it's inside the folder already. But it doesn't have here? Ah, because I got it. Can you copy this to this folder? No, only one. Ah, this one? Yeah. Not just? Okay. But your network connection? Okay. It's downloaded. Wait for this. This is going to finish. Okay. I've seen most of you is running the application, right? So, now I'm going to explain a bit about the Docker Composer.thr. So, we all understand what is happening inside. Yeah. YAML5. So, as you can see here, what I'm running is I'm running the Docker Composer.thr. .dev.yaml file. This file is inside my folder ppsg1606. So, this is my folder. And I'm now... I'm now open the Docker Composer.dev.yaml. And this is the content of this file. So, basically what... The first thing you can see here, this is version 2. So, the format of this file is version 2. Previously, it had version 1. Quite similar to this one. Actually, version 1 is outdated already. So, they recommend we use version 2. And we keep following by this one. So, the version 1 don't have this version that... So, when you don't see this one, assume that it's version 1. Yeah. And inside this file, I define 4 services. One is frontend. The other one is backend. And then, database restore and database. Database restore is only used for purpose of restore data. And I also define a network. This network is local network. I name it ppsg-dev. And I use a bridge in order to connect to the host. Otherwise, it cannot connect to the host machine. So, we cannot access from our sites. Okay. The first thing I want to talk is about the database container. The database service. The image name is this one. So, where is this name coming from? This coming from this repo. Higari MariaDB. And the one after the colon is the tag of this repo or this image. You can see this one in the Docker Hub. Docker Hub is similar to GitHub. It's where all the Docker image is hosted. Yeah. Docker Hub is located at Hub Docker.com. Okay. I need to log in. Okay. No need. So, I will copy this one to Docker Hub. Yes. R for repo. And this is the repo of the image. And if you see the tag here, you can see there's one tag named 10.1. So, basically the common is like you name the version of the shop where you install this image as the shop where version. Do you have any question about the repo or image name? Okay. All of these five. The first thing is looking up for the image is your local. You can build your own image in local. You don't have to publish into GitHub. But then it's your local. If you don't find the image in your local, it will look up in the Hub. Yes, automatically. Do you want to specify the hub? I think we have to specify the phone hub URL. Okay. Yeah. I haven't tried that one. But we can try. Yeah. So, instead of your own custom registry, your own custom registry of Docker images? Yeah. Yeah. We haven't tried that before. So, we don't know. We can try and show us how it's done. Yes, next week. Yeah. Let's figure it out. It's useful when you have like, I have heard of some companies that actually use that internally. They want to update their Docker images that they need to keep it internal as their private, they have some proprietary stuff inside. So, you can set up your own private registry. Like, I think Ministry of Education, their team there, they reward Docker instances for their servers. And they have their own internal registry for... Basically, this file, this YML file, specifies all the stuff you need to shove into the Docker. Yes. Into that instance. This is an example for DAX for PHP image. As you can see, they have... I'm zoomed in. The name is... They named the DAX for image as a version of PHP. So, this is a common practice. So, we need to follow. And also, if you look at the DAX name, the listed version. We have a major version. We'll be tagged as a major version as well. All the way until the specific version. So, yeah. And here they specify the CLI command for... Different between CLI and FPM version. So, it's much more clearer for us if you want to use. Right. Yeah. It's easy. So, I just only put one. I don't have tag like 10 here. Okay. So, that is the meaning of the image here. We specify the image we want to use. Restart always means once you have any seal inside the container and the container stops, Docker will try to restart it immediately. The network... Here is... I want to use this network. The network name... One of the network names is PHPHC-HC-DAP. This one is D5 below, as you can see here. So, that means I want to use the internal network for this scenario. The POST means I... This one is the internal POST. That means this POST can be accessed when you are inside the container. And this POST is public POST. Oh, okay. Yeah. So, this POST can be used outside the container. Yeah. I use the same POST for our convenience. Okay. Later I'm telling you something else but... Okay, forget. Next. I want to talk about Database Restore. The image name is almost the same thing. Network is the same. Volumes. Volumes is where you define the mapping between the host file system to the internal local file system. So, basically here I will copy the dp.sql to the inside the same folder of the container. And also copy my script. This script will run the command to import the database. Also, in order to import the database, I need to connect to the database container. That's why I want to link this one with the database container so I can connect them together. The link... Yeah. In order this... When I run this script inside this container, right, I have to connect to the database container. Okay. So... Okay, so that's just linking you to the container that's called Database. Yes. So, this one is make... Create a connection between these two containers. Got it. This deep... Otherwise, there will be a lot. Yeah. If you have no connection, you don't know where is the database server. The dp.sql is... Specifies the start order. So, the database container will start first. Yes, in this case, it's only one. So, database container will start first and then the database restore container will start after that. Please take note, this one is the start order of containers, not start order of services. So, the... Sorry, I need to get some water. In this case, the database container is booted. But the MySQL service is not ready because it takes some time to start. So, some of you, when you first run the Docker combos command, you will see something like Homestead database is not found. Because when the database restore container is started, it runs this script to try to import the database. But because the MySQL service is not ready by that moment. So, it cannot import. And when it fails, it just stops. And by that time, when you open the website, you will see that we don't have database. Because the database is not imported yet. That's why when we run a second time, the MySQL service is already... So, now it can import... Can speak a bit louder. You may have to run the command multiple times. It takes like... As soon as the MySQL service is ready, the next time you run the command, it's import the database. Okay, the depend option is just to make sure that this container must be started after the database container. But after it started, it takes some time for the service to be ready. Is there something in your script that tells it? Yes. Actually, we can do something like that. But if you look at this one, it's quite simple. I just want to point to import the file only. So, I don't have any check to make sure that the service is ready. But I have another file. Okay, here. So, this script will try, will loop until the command is running fine. What it does here is it runs a quick command in MySQL server. So, if the quick command is running fine, it can connect. And after it can connect, then we actually run the import command. Okay. Yeah. So, and it sleeps around 0.25 seconds. So, it takes 4 times per second. Yeah. We can change this, but this one is quite its own. I have an update this one. So, you can try another way to do it. In the Docker website, they also mentioned about this issue. Not its issue, but the debug, right? Later I will tell you. Okay. If you go to the Docker Composers link here, when you go to the depends on, they will have a note here. And if you want to control the start of order for the service, you can click on the link. And they have some tune like wait for it or dockerize. Yeah. So, you can use something like this to check. Okay. That depends on the command. I also just mentioned when the Docker is started, this command will be run. And once the command is finished, the Docker will stop. The container will stop. That's why if you go here, if you go to the listing the docker, this is only list the running containers. So, you can see we only have 3 containers running. But you have a flag-a, it will list all the containers. And you will see the restore is running here. Sorry. The restore is created here, but it's not running. It's assisted already. So, after the database is imported, this container will assist. So, this container is just only happen in the first time only. First run only. Yeah. Yeah. Okay. So, here I have similar thing. Image tag, network tag, restart, volume, expose. Okay. Here we also talk about the port. But instead of, instead of publicize the port to the outside of the container, I just want to specifically say that this service is running on port, in local port 9000. And only internal network can access this port. External network cannot access this one. Because it doesn't make sense to external network to access PEP, FPM port, right? So, I don't expose this one. It's not like this. Because this one, because this is a depth. So, I want to see what is inside my database. So, I want to connect for my ID or for my comment easily. Sorry. I think the service use Celeron port. Use what? Celeron port. Yes. Yes, you can, you can, if you have a many port, then you can use it here like, yeah. But the concept microservices is like, you have run only one service in one container. Right. Okay. Yeah. So, we use only one port. And all the services should be accessible by TCP IP layer with IP and port. Yeah. Though you don't need, you shouldn't require the fine system access in order to use the service. That is mentioned in the 12 factor app. The website is also the best practice to build the website for the cloud, to be scale level. All the best practice. Yeah. So, this one is only, if you use the cloud service like AWS, you want to build a cluster of services, then you should follow this one. Okay. And finally, it's a front-end service. Front-end service is running Nginx. It's also connected to the local network. It's restart if it fails somehow. Okay. I have copied some data to the local. And I link this one to backend. So, Nginx can send a request to PPFVM. And so, I spot the port 80 to the public port is 8800. So, 8? Public. Yeah. External port, internal port. And in theory, you can have multiple external ports for one internal port like this. But no use. So, any questions for the docker compose? Sorry. I don't get your question. The problem that I was having was that I didn't have a bunch of the dependencies installed. So, I had to reinstall the compose. Yeah. That was not a problem to find out. So, specifically what happened that we solved it? Some of us not being able to do it. Okay. Our scenario is one of my mistakes because this one we don't have a vendor folder. The source folder. Yes. So, because the vendor folder is missing, so PP application is not running properly. So, all the request to PP application will fail. That's why we can see the websites. The vendor folder is all the dependency for the PP application. Yeah. In your case, since we didn't download it? No. Actually, I just help you to download the dependency by using the PP Composer. Composer is dependency management PP. Yeah. Yes. You can do it. But then just script will be very complex. Oh. Yes. Yeah. No. It can have. Yeah. You can do that. But this one, I have process managers at the back. So, we cannot do it. Yeah. We can have another one called like for example, bike and helper or bike and utility here. Just run once at the beginning to run the Composer's install. Just like importing the database. Yeah. Okay. Back to your question. How we access to containers inside the container to debug? That's a good question. Yeah. Like for example, here we have three containers. I want to access one of them. One of the common way to do that is I use SQL command which I for interactive T for I think two minutes after access, I think so. And then I copy this one. I specify the container names. We can use a container name or container ID here. Both are okay. So, the cryptic ID. And then the last one is we use the bus command. In this case, it's SS. Some another Linux is the bus. So, we can either try our luck on there. Now we can get inside the container already. And you can see this is look similar like a Linux system. And then we can go even go to like for example, here, right? I, what is, okay, front end. So, in the front end, I map the source folder to www. So, I can go to www. And this is my source folder. For NGINX configuration, I map the NGINX configuration in the data folder in the EDC NGINX folder. I can just go, I can just see this file. Here's my NGINX configuration. And this NGINX configuration is mapping to www.public folder. As a Laravel folder. Once you finish debugging inside the container, you can exit and go back. Another command I want to introduce is also the Docker log. So, Docker log, you will see all the log history of the Docker containers. Like for example, you see like I have four requests to this container. This log is outputted from NGINX server. Now if I reload this one, there should be another two. Yes, so we have six now. And we can use the hyphen F to monitoring the log. Like what you have in the tail.f in Linux. So here if I have new request here, even come up immediately here. So it can, you can, it help you to keep monitoring what is happening inside by that moment in the ring time. So one of the, another bad practice is you output on the log to standard output of the container. STD out. And there will be another log collector. We collect on this log and process later. So you don't output the log to the log file as usual. It's one of the, one of the, the, the session inside the 12 factor F as well. The buffer. I'm going to show you now. Yeah. Yeah. So another one is the start. The Koni Docker starts. Yeah. So now you can see the memory. You can see the CPU uses. You can see the network IO. So it provides you the basics thing. Yeah. It looks better now, right? So, yeah, it can provide you a very basic thing for the resource. Sorry. The log. No, it's not in memory. But I think you can say it's in my memory of the containers. Yeah. So when you, when the container is restart the log, I, I'm not sure about if it's lost or not. Yeah. But I don't think it's lost. I try. I remember before it's not lost. Even you restart the container. Yeah. You can try. I'm not sure. Another one is also the PS. No. The Docker top. The Docker top is similar to PS in Linux. What is it? I don't know. I forget the Docker container name. Here is in list on the process running inside the Docker container. Forget about it. So these are the main comments. Very useful comment I often use with Docker. And all the comments can be listed here. If you run Docker-Half-Half, it will list all the comments here for you. Another one I, sometime I used is a Docker-inspect to see what is a configuration, the runtime configuration of the Docker. Like IP address or something like that. You can find more from this list. I think I need one hour, one hour. Yes, okay, we have lunch now, right? Okay, so I think we have a break for lunch first, and then we come back with some practice with Docker. And we can, we will build our own image. We will build our own image. We try to publish this into Hub and to see how it works, what is workflow. And we will see. Yeah. Okay, so far anybody have a question about Docker, about Docker combos, basically understand? Okay, so what I want you to do now is like, we will start build a Docker image. So this is my example of Docker image. Yeah, you can see. So I introduce about the Docker file first. This is the Docker file to, it's like metadata of the Docker image. This describe how you will build your Docker image. The first thing you need to have is the base image. When choosing the base image, you have a multiple options. The first thing is like you can build from scratch, which means you have nothing from scratch, nothing at the beginning. The second option is you base on your, base on the official Docker image. The official Docker image when started, sorry. We have underscore instead of any username here. So if you see in your URL, after the R for repo is underscore, that means this official images from the Docker team. The third option is like we base on user image. Like for example, from here, I base on my gigaree user and the image name is nginx. The label is also the version name is 1.8. Maintenance is not needed. You can skip it and from here, you can use the instruction. This one, I will copy the data from source folder to VW folder and copy the nginx file to the ATC nginx folder. Now, the interesting thing here is, this is inherited from the base container. There will be more command here. And one of the most important command is entry point or command. Let me open the nginx. You see from here, I will have expo instruction. This is my nginx image. This is a basic image from this image. So from here, the expo instruction will automatically inherited and use here. And this nginx image is based on my base image. And this is my base image. I mean, if you look at like this, this means it's an official image from Docker team. This is an unpiled Linux. It's a very minimum Linux distro. It's only five meg instead of a few hundred meg like Ubuntu. And it will inherited the entry point here and the command here. Let me introduce a bit about entry point and command. Entry point is just like the prefixed for your command. And on the parameter, when you run the Docker, will be argument for this command. And seen here, we see the command is empty. That means the argument is empty for now. And you can override this command by provide argument later. Let me show you this argument. I have in my local for now. I want to run this one instead of using Docker compose. I can use Docker run. Kikari nginx 1.8. If I don't provide anything here, that means there's no argument for my entry point. But if I put like A, B, C here, all the A, B, C will be argument for my entry point. So the actual, you see the init here, right? The actual command will run for this container will be slash init A, B, C. So the entry point here is to hard code the command you want run. And later you just need to provide the argument only. So if you want to hard code the command, you don't allow user to change the command use entry point. But if you put, instead of using entry point, I use init here and I run the same command like this. The actual command will run inside the container and just like this, A, B, C only. So it can override the whole command. Sorry, yes. It is binary five from the S6. S6 is a process manager. It's quite famous in Unpy Linux and it's famous in all the Linux distro as well. It's very lightweight. So the thing, why we need a process manager? So basically what we want is like when the service, we need to monitor the service. So if service go down, it can automatically restart the service without restart the container. No, it is provided by the S6 package. You can write your own self script if you want. Yeah, later I will show you how to write. Okay, for example, here I have NGINX container is running here. I will go inside this container and we kill the NGINX process. Then you will see it's automatically restarted. Okay, you will see the NGINX is running here, right? Worker and it is master and even this one is a supervisor of the NGINX. I will kill this process and see it's automatically restarted with a new process ID. So by doing like this, we ensure that our service is still running. Sometimes it's crash for some reason, but if you have a process managers, it's automatically happens to restart the service. Yeah. So okay, but this is a bit advanced for the service manager. Now I will write a very simple image. So you write by your own as well and we also run it. Okay. Okay, what I'm going to do here is I create a Docker folder inside a temp folder and this is completely empty. What I'm doing now is I create a Docker file here to describe how my Docker image will be built and then we will run it. Okay. Okay, so first thing I'm going to use a base image. I'm going to use the Office OPP image. I choose 5.6 or 7. Okay. Let's see what is 7. Okay. It's stored inside the temp slash Docker. You can create any empty folder. Yeah, you can create any folder and create a new file called Docker files. Okay, let me start again. Okay, you see this folder is empty. Now I create a new file inside this folder called Docker file. Docker file. Okay. Now we start writing. I specifically with 7.0 here. That means it will use this image. What I want to do, want to use is I will use this one to, I will use the PPP web server. Your PPP now have a web server viewing from PPP 5.4. And we use this to run my script, to run our script. And let's see what happened here. Okay, forget about this one. Okay. I need to prepare the index.PPP first and run on my host machine to see the result. And I will try to build the image using that PPP image. Okay. It's very simple, just output a hello word here. Okay. The command is running here. PPP-CAPITAL-S and then address is localhost at port whatever you want. T is to given the root document. Okay. So, because my index PPP is running inside tam and Docker. And let's see. Okay. So, this one is listening on localhost on port 1234. I will open my web browser, open 1234 port and see, okay, see hello word here. That means it's running file. I will use this file to copy inside the Docker image. I create a Docker file 7.0. Okay. I copy the index.PPP to VWW folder. And then I run it. Okay. I want to run in port 80, right? So, because this one is running on port 80, I need to expose port 80. So, later we can public port AP to host machine and then we can use this to asset it. Any questions so far? I will save this one. Okay. Here we have two things. Docker and index.PPP. Now, what we want to, what we are going to do now is we will build image file, Docker image file based on this, based on the file we just described. Docker view. Okay. We use the command Docker view. And best practice is when we run the Docker view, we need to give an attack, a name and attack for the image. Just like what we have before, like PPP 5, 7.0 or something like that. So, I will build here is, this is my username and then this is my, this is my image name and this is my label, for example. And this dot is current folder. Current folder is a scope of the Docker view. And only the file in this scope will be used to build the folder. You cannot use any file outside of this scope. Yeah. I need to forget the height. High-fn-t is for tag. You need to specify the high-fn-t so to indicate the tag here. Okay. Now I'm running it. Okay. Because it's haven't seen the PPP 7. So now what it's doing is it download the PPP 7 from Docker Hub and you see the file size is very big. It will take around few minutes to finish this one. And after this one, okay. You see the first step is running this line. Second one is step two is running this line. Step four is running this line. Step three, step four is running this one. And now it's still running in step one. Okay. Step three, step four, it's done. Okay. And as you can see for each step, it have a cap like husky here. This is intermediate container ID. So for each step, it will build a container. And the next step, it will reuse that container to build a next container. So if something is happened in the middle, the previous container still can be reused later. So no need to reuse. So I will list on the Docker image here and we can see we have it here. Now we run it. Can run, sorry. We don't have a tag here. My tag is 1.0. So I need to give in the tag here as 1.0. Yeah. It's running. Okay. It is still running, but I will explain to you why it's happened like this. Because it's running at a foreground, not a background. So the process is just hanging like this. And you can see it's running here. It's already running here. But do you think if we can access, do you think you can access this service? It's running already. We build, right? It's running. How we test it? If this image is running, fine. Okay. I can tell you there's no way to test for now. Unless we have to go inside the container and do a kernel to see. The reason is like, because we have a post-expo here, but we didn't publish it. So it's still usable internally. It's internal. Yeah. So now what I'm doing is I will kill this container first and stop the container by controlling C. Sorry. What the fuck? Why it's not stopped? Nevermind. I can do it here. Locker stop. I can remove it. Okay, it's removed. And this one should access. Okay. Now I need to public the port 80 to my host machine. I can do this by hyphen P. And I can specify port 808123, for example. And I'm able to port 80 for internal. Also I don't want to run as a foreground as before. I want to run it in background as a daemon. So I have hyphen D here. It's daemon. Okay, it's running now. And you can see it's running here and it indicate port 80123 mapping to port 80 here. Sorry. Okay. So now if I open port 80123, I will expect to see the hello world. No. Oh, that's bad. Let's see. Okay. I can guess the reason is because we are running as a local host here. But this local host is only internal local host, not the host machine local host. So let's try to see how pp web server is running without the host name. Okay, yeah. On any interface. So what I'm doing is I will change this one to 0,0,0. Okay. So because we change a step four, all these three steps before will not be run again. It will just restart from step three. Yeah. Okay, I will review it here. You see step 123 is already done. And it says that it's using cache. That means this container is catching before. Now it's just reuse. Okay, now I need to queue this one first. Okay, this is three container we run before. Now we run the container again to see if it works. I hope it works. Yes. Finally. That is how we build docker image, how we run the docker image. Yeah. So now even we have index speed we find here, but it's not running this index speed dot pp anymore. I rename this one to make sure that it's something else just to make sure there's no index find here. Okay. And I still reload this one. So that means the docker image, the docker container is really isolated. And encapsulated. And you can just use this somewhere else without any related to the local environment. Yeah. So the thing is like another question. Now if I want to change the content, like I want to base on the previous image and continuously develop on top of that, I don't want to rebuild from scratch, right? So how we can do that? Like for example, I don't want to display hello world. I want to display hello pp. How are we gonna do that now? Yeah. Without like without the need of the build another image, we still reuse the previous image. Okay. The thing is like for example, I edit the index dot pp five before. I change this one to pp. Since the name is a stain randomly, right? Now the first thing, I need to queue this one first. Okay. Just to make sure that everything is clean. Okay. Now we have only three containers. What I'm doing is quite similar to previously, but the difference is I will copy that file, the file I just edited into the container by using V for volume. I use, this is a fine name. I will map it to www.index.pp. By doing like this, the host file will override the container file. And after override it, it will run the same command. Sorry. Give me a second. They will create include invalid crater for local. Okay. Now I do something like this. I will create a folder for source file. I will move the file into the source file with same name index dot pp. What I'm doing now is I map the source file into the www folder. Okay. It's right here. We have port is already allocated. So that means if we have a conflict in the port, the port is already used. For example, by Apache, this error will be thrown. It's because previously we already have run another container with this port, the same port here. One, two, three. Now I need to remove this container first. Now I rerun the command. Okay. This is running already. And now if I reload the web page, I should see the hello pdp. Oh no. Previously when I make a mistake, previously inside docker here I call the index file. Inside the interaction here is copied by file, not copied by folder. So when we at the runtime, that's one can not be overwritten. So by switching to copy file by copy folder, later on the file in the folder can be overwritten by the runtime argument. So this is showing why, what is the difference between these two? I need to clean this thing first just to make sure that this one is clean. So I run the file, the image. Wig port one, two, three. And okay, I'm going back to the browser just to make sure that it's gone. Okay. So port one, two, three is simulate our production environment. And I will use port one, two, four to simulate our development environment. So in the production environment, I will export the port 80 to port eight, one, two, three here. I run it. And we can see from here it's output. Hello pdp. But the thing is like is the content of file index pdp here is output hello world. So that means in the development environment, we already make change to the file. But inside the container, we already have a file. So in the runtime, we can use the host file to override the container files. So we can test our application to see how it changes reflected. So from here, what is different is like I map a source file into the same part in container, which is VARWW. And I use a different port here. Check to see the difference. Okay, then I run it. Only another map parameter is the same. Okay. And then I reload this one. You see it's hello world, which is inside the host machine. So this is a demo straight how you can development with the existing Docker container. What, this one? Yeah. Okay, so the difference here is only this one. Yeah. And, okay, let me this one. So the source file, the source file is here. And the source file contains the index file. Yeah. This index file will override the index file inside the container. Yeah. Yes. I can just another file as well. You can review the whole thing, but the thing is like, if you already have a conversion, you just only change the source code only. So it doesn't make sense to review everything. And because you want to run it to test it fast and one is running fine, then you can review. You don't want to make change every single, you don't want to build every single chain, right? Okay. Can you start writing your own image? Just very simple, just write it and make something different content and see how it works. Writing step by step, I will open the Docker container file here for you to see. Yeah. Instead of using PHP 7.0, you can use PHP 5.6, for example. And see how it running on your local because later I will tell you how to publish your image. The first thing, prepare your index.pv file first. Do whatever you want with that one. Start writing. Start writing. It's a number too big, man. So this is Docker file. The name is Docker file. You look at the bottom left. That's what it's called Docker file. Yes. Docker file is metadata file to tell Docker to build an image. But where is this file physically as a PHP storm to look at it? Yes, you can. You can open with any editor. It's not this compose file, right? No, it's not composer. It's not that book? Yeah, yeah. This one? Yes. Similar to this. It's a PHP file. No, no, no. PHP is my suffix to differentiate between engineers. You can create a Docker file only. You can create right here or you create on your new folder. I create in a new folder just to show you that you can start from scratch. You don't have to rely on anything. You need Docker. Ah, you don't need. You can start from here already. Yeah, so you don't need Docker compose. Yeah. This is the version from the Docker hub. Yeah. And are adding the other local source folder. The host? It's a code from here to copying here to the image. Yes, to insert the image. Yeah. What is the expose 80? Okay, because you see the last command. I run a web server on port 80. Yeah, right. So that's why I need to expose that port 80. Yeah, so later we can use it. If you don't expose, you can, there's no way to access that port. Oh, okay. So we are exposing the port and then we are utilizing that. Yes. It's my letter in my command. You see I public the port 80 to port 8123. For the port? Yeah. Okay. This is the service running inside the container, right? And this one is serving at the port 80. So the outside cannot access this one. Okay. So says Docker need to have a port mapping or they call it port publishing. And it public port 80 to a certain port outside here. So the port outside here you need to define. If you don't define it outside a random port, which you don't know advanced. So you need to specify in my case above, I use port 8123. So when you access 8123, Docker will map it to port 80. Yes. And the service can serve. Thank you. Yeah. The first thing you need to do is write the pp script first and run the web server with that script to see the result first. Once you finish the result, then you start writing the docker file. Forget about this one. You don't need this. Okay, you start writing a pp script first. Just gonna create a source folder. Yes. Quite similar like this. Don't copy. Start writing. Yeah, because if you copy, you don't know anything. There's your pp, office or pp image like this. Instead of 7.0, you can use 5.6. Yeah. So now what I need to do is... Okay. You just to make sure that your folder is running fine. As our script is running fine, right? By running this s and just serve it port for example, 88. Just to make sure it's not conflict in it. And you just find the folder. Oh yeah, you can get different one here. Because, okay, this is the expose for that. No, this one is only for testing. Oh, okay. For testing on your local first. Okay. Okay, you don't have this one. Can you key in the password? Shit, okay. And what? Edit 01. Okay. Okay, so this one is listening on edit 01. So you open the browser. And see local host. Edit 01. Just to make sure your script is running fine. Okay, yeah. Okay, so. Oh, I'm sorry. What it mean by PHP is PHP running, S for server. So, okay. Yeah, so it's running a viewing web server. So you don't need Nginx on this. Okay. So, okay. Now you stop it. This one. Alpha D is a tag and. That T is for, I think for target, I think so. This is a folder where the index.pp is located. Yeah, okay. When you have this already, you will build the Docker file. And have you built it? Yeah. Okay, so. Okay, good. Now you need to build. Give me a second. Yeah, I'm showing you now. This one. Okay, but remember to change this one to draw the username. This username is Docker Hub username. If you don't have a username in Docker Hub, register one now and use it exactly. Because later, you need to public your image into the Docker Hub. And username must be matched. You need to log in. You need to be able to log in to Docker Hub in order to public your Docker image. Because I think it's for waiting for people. It's up to people how long they take for them to finish. Just start. Okay, good. So I'm going to run, I'm supposed to run the second, same container with the source change, right? Yeah. But do I need to change the Docker file? No, you don't need it. Yeah. So Docker's file will still be the same. Yes, correct. No, no, no, same source. Source? Yeah, still like that. So we cannot override the file files. We can override the folders. Yes. We can override the file on the runtime. Okay. Yeah. So basically, okay. What is this? The thing is like in the development, right? You still using the same file. But you make change here. For example, okay. And while running this one, to specify the source, okay. To override the current source folder to this part in the runtime, you need to have space here. So just to make it clear. What is the B for? B for public post. Public post. Yeah. Yeah. So, okay. Why some D? D for Damian. It's not running in the background. So you can continue interactive which are in terminal. Okay. Yeah. Okay. So by edit, edit and using this one, you override the internal file by the current file. And you can see the change immediately. And what's, okay. Because you still running this part. If you run this one again, it will say that this part is already allocated. So you change to another part. Yes. And run it. Now you open. Wait, the same code file cannot? You cannot override the part. Oh. Yeah. Files in that part. Okay. How did you build the file? You, previously you use index? Yes. Okay. That's why if you use index, you cannot override. If you use a file, you cannot override the file. You can override the folder. But you cannot override the file. So I need to rebuild. Yes. You need to rebuild. Okay. Real world scenario. So I'm just developing a PHP application. So I want to do the changes in my local. Maybe I'm using some... You add a new feature. Yes. Yeah, IDE. I'm just adding some features, new features. How it will be, the same way we need to point this source file to destination Yes. That's why I told you. After you make a change, right? Okay. This is the one first time I'm doing like Docker, right? Okay. Are you sure this one you have? Yeah. Yeah. Okay. When you run, right? I don't have. It's running. Okay. It's running, right? Yeah. So you open on your... Two, three. What the fuck? Do you have... I open in Chrome faster. Okay. Sorry. Okay. Sure. Give me a second. Give me a second. Can you see it now? Yeah. Just for a while. Yes. Okay. Let's see. It's up. It's running. It's spot. Now it's still running localhost, you see? Yeah. So that's why it cannot be... Now you need to rebuild this. Where did you build this one? I forget. Dock view. No, you built it before. I tried it before, but after... killing this one, I didn't... Yeah. That's why it still using the localhost. Okay, okay. Yeah. This one and this one actually. Sorry? This one we are building a new image. Yes. But this one is running using this image. Using this image, we are running. Yes. Okay, okay. Using this image. Okay, okay. This one we will use this image. Okay, okay. So we know it... suppose I'm changing here. Yeah. You need to build that image again. Eventually, yes. You just need to build the image. But during the development, you don't... don't have to. What do you mean by this? Why? Sorry? Why like that? Why we know it too? Because you want to see the change immediately. Okay, yeah. Yeah. The only one you see is that, okay, your chain is ready to go live than your image. Okay, okay. Yeah. Fine. See? Yes. Okay. Now you make change to it. Make change to the index.pp and... Yeah. Since I changed the source at the tool at the back. Okay. But my second Docker... my same Docker for example. I don't know just how. Okay, let me see. After you make a change, have you run the Docker again? Or you haven't? I run... I run my own Docker. They are... I run... Okay, you have two here, right? So I need to kill this Docker first. Yes, you can Docker... to force remove this one. After that, you can rerun it. Is this? Yes. Okay. You should see the result here. You need to kill these two. No, you don't have to... Zero point three. Yeah. Created, created... No, it's only care about... to build this one, this one, right? Let me kill all the Docker. If I run... about one to three, right? And I don't have this one, right? To see what is the result here. If I run with... source... I see different, right? After you make a chain, I think it didn't build it. It didn't rebuild the... Docker image. It means after I make the change to... in that sort of PHP. This one. Okay, see, you don't need to make change this one. You need... You can override the own one as well. So consider is... Okay. Docker image. So basically, you have one to three here, right? Okay, forget about one and... two and three. Remove this one first. And this one. Okay, now we have only... Okay, still have one. Zero point one. Don't use another text. And see... and Docker build... T... Zero point one. It's on the right. It's build here. If we run this one, it's zero point one. Okay? Zero point one. Zero point one. It's one point one. Ah, one point two, okay. Yeah? Now it's all the latest, right? Okay, so now... make change to here. Right? And you run it as another part. Yeah? Using the same image. And you expect this one to be changed. No change. Number two is... It's how PHP work. Yeah, but for me also, it's much easier. No. This one is completely different, right? This one... This is completely different. And use this one. Use this one coming from... the same one. Clean change, right? The same image. That's zero point one. Zero point one. Where the fuck is coming from? Yeah. So there might be the index of case. You might be there, right? And set the value. Yeah, but the thing is, like... by specify this one, we override that. Okay, therefore, like... Maybe we can check this. Then it is still there or not? Yes, let me try. I mean, it still have, but... how to... See? Yeah. It's not overwritten. Yeah. No, but where is this fight coming from? No, it's already been sourced. We have... synced the index of PHP to the... to the W already. So what happening is... it's not deleting the index. It's in the PHP, but it is copying the source to the W folder. So index of PHP is there, as it is in the... I think so. No, I mean, by default, it should override that. The source folder is a new one for the W. So it is newly creating in the W folder. But W folder already have an index of PHP. So the index of PHP is not deleting. It will delay. Because the source is a new one. We are just putting... No, when we put in a new one, it should override the SS thing. No, I created one more temp folder. Yeah. I'm going to put it in the where W means. It won't delete the source folder. We just create a new temp folder thing. No, no, it create it override. Yeah, it's easy. Maybe we can try that one. No, it's really override. So it will... whatever we have, we are just putting everything over right here. All right, but... Did you delete this one? Yeah. Five to ten minutes. Yeah. Mine also. Okay, fine. By right, we should... I was thinking of something I was talking about. The tip jar. What's a jar? The tip jar... Maybe I will debug this one later. Okay, I will go and explore it. Okay, sure. Yeah. But basically, you can override. For me, I was the same thing. Given another port, but still it is giving the same... page page. So, give me a letter. I think it's run out. I am coming later, so... I still have a debug session in half a minute. So, maybe we can do it later. Yeah, I think it's... Yeah. Michael, I know you're a busy man. Yeah. It's a hot topic, right? Yeah. So... But anyway, I'm a dumbass. Yeah. So, I've gotten this brand new thing here. I've created a new folder. And it's called... Index should be inside the source folder. It should be inside the source folder. Index.pp. So, you want a source folder too, huh? Yeah. Because in the Docker file, you copy the... SCR, right? Yeah. Okay, and now index inside there. Okay. Yeah. Now what? Okay, you build. Run the build command. Run the what? The build command. Docker build. I don't... I can't do that yet because I... No, you already have that. I'm showing you the build command here. Okay. The build command is there. What's that? Docker build. Yeah, but I haven't finished this one. The command, blah, blah, blah, blah, blah, blah, blah, blah. No, no. You need to build the image first. After you finish this file, then you build. Run the build command. So, I need to go into terminal, huh? Yes. Correct. Okay. Yeah. After you build image, then you can run the container using the image. Where's the build plan itself? The first one. You have a T, enjoy the name, image name. Is that the Docker build? No, it's the Docker build. The last one is the top session. Oh, okay. Yeah. How do you implement Docker file? Are you in the... Yes. I have Docker file. No. This one. It's the capital D. Oh. And also, they should be inside the software on the... Gigaree. Inside the software. That's almost my name, Gregory. But in Singapore, they say Gigaree. Is it a Gregory? Oh, okay. No, but you need to use your username. Because... How's that your username? Because Gigaree is my username. That's yours, huh? Yeah. So, you need to register on Docker Hub first. And this will be your username in Docker Hub. Okay. Followed by... What? Followed by... Yeah. Whatever name. Whatever name I want. Yes. Just go test. I can just simply call my dog dog. Yeah. And label. I guess that is the name. Yeah. Yeah, okay. Then it's okay. Then you go by your terminal and you choose a tag name. Like 0.1 or 1.0 or whatever. And you do that with the colon? Yeah. Version 1? Yeah. Whatever 1.0 or 0.1 is up to you. Yeah. And... This is 0.1. Yes. Really name. Yes. And you specify the scope. It's current folder. Yeah, why not? Just specify the scope. You need to pass the scope inside the Docker build. Okay, so how do I do that? You already pass it by dot. Dot is current folder. Okay, let's do this. Yeah. And just run it. Sending... I don't know that. Docker file cannot be... I gotta save it. Yeah, you haven't saved it. Isn't there more to it than this, though? No, that's not easy enough. That's enough. Yeah. Yeah. Hey, look at that. It's creating my doc. Yes. Let's put it in there. Okay, you've pushed it already? No, I've created a repo, right? Yeah. Then after that... You don't have to create a repo when you do a push, even push your image. Have you run it on your local? No. That's why I don't know where to start this. Let's say for example, I already have my Docker file. Yeah. Which is this, correct? Okay. And my next page, which I don't put in anything yet. So what do I do next? Okay. Okay. For asos, if you need to publicize... Yeah, so... Suppose port 80, because you're running on port 80. Okay. Yes. Yes. And this is not Docker pp. Okay. Now you need to build using the last command in my first part. Okay. Docker build. Which is... This one? No, this is Docker run. Okay. Docker build. My last... In the middle of the screen, but in the last line of the first... Docker run, is it? No, Docker build. Below that... Below that is Docker... Oh, Docker build. Yes. Okay. We put it inside the Docker... You don't have to put inside the Docker. This is on Steam and local. But now you can run the Docker run. There's this one. No. The first command is under the Docker ps, right? You see the Docker run. Yes, correct. 8123 colon 80. This one. Yeah. Yeah. What does the V mean? V for daemon. V for daemon. Yeah, so you're running in the background. Yes, I just deleted all the containers here. Yeah. And I have to rebuild the game with the new command. Yeah. So if I change the... Yes, correct, correct. Why? I don't know why it's stored. Let me check it, but I don't know why it's... The new file is not at all coming. So maybe just come into... I don't understand why as well. I need to check it. Yeah. But like in my scenario, it's override. Yes, correct. Yeah. Yes, so whatever inside the soft folder, we override the one in www folder. Whatever file inside the soft folder, we override... Yes. Exactly. But I don't know why it's not working there. Why is there a temp here? No, temp is just temp folder. Because I... Oh, my temp folder is this one. Yes, correct. So what do I... So after I have done... After it's created all this... Let me see because, okay, I can see why. Because this one needs to be inside the soft folder. Oh, it has to be in the soft folder. Yeah. Like this. Okay. Then you can run it. Okay. Is it because... Is it because in the Docker file I specified... Yes, correct. It has to be moved to the soft... Yes. From the soft file. Okay, I cannot see. Yeah, it's like this because in the Docker... You see? In Docker file you put the soft file. Oh, okay. It's a soft folder. If I want to be in the current directory... Just put that. Just put a full stop here. Yes. Okay. Yeah. So what I'm doing is after this, after it's published over to... Yeah. You can... You need to run it first to make sure that it's working. Because you publish. Yes. Yeah. This is the demo. Uh-huh. And then you check this one. It's kind of like that. Oh, okay. Yeah. Which means to say that I have basically transferred my file from my local folder to... No, you transferred the file on the build time. Not on the run time. Okay. Yeah. So if you want to transfer the run time, that means now you add the soft file index here and you run the same thing. But instead of that you specify the volume. So this overrides the existing and you choose another port to avoid the conflict. Okay. What? Why it's not overrides? It's only to... I need to check this. Okay. I think many people have the same issue. Yeah. We know it doesn't work. When I had an error, right? Yeah. And actually my NSBHP decided that. Yes. Correct. I did the same error as you did, right? Like you should be seeing this one, right? But this one is using error. Yeah. Maybe it's different. You need to run a PEP file, not pay a HTML file. Can you run a PEP file? No. This is a PEP web server. Hey guys. I think our time is finished. So I need to handle the session to another one. If you have any question, feel free to contact me. I know this one is very long session. So there's a lot of things you want to know about this one. I will explain more personally. Yeah. So feel free to contact me. I still have one more session, but I don't have enough time for now. So we didn't try it on the next chance. So the question is already asked. And thank you for listening and spending time. It's a very long time with me. And this is my ID. If you cannot find me at Baikon Buu at 2812, at the beginning, on Facebook, LinkedIn, Twitter, whatever, you will find me. Yeah. Thank you very much.