Getting started with docker, the step by step tutorial [ with examples ]

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
hey guys welcome to my new tutorial this is darker beginner step-by-step so let's get started I hope I guess you are using darker because it's very famous and you want to know you know how you get some benefits out of that so in this video I'm going to explain to you what are the benefits of darker how to get started and you know what exactly it's a what advanced so let's move on let's move to this 2d to my blog first of all because I have written already in article it's a blog post about this and if you open that there's a link just below the video if you open that then you can follow along and copy all the comments and everything from that post you know into your tutorial materials so what is the human you might you might ask you why I want to use darker what is the problem that is solving for me and the problem the doctor is solving is that if you want to create a web application for example let's say WordPress or you want to use a database like MongoDB or my sequel what we usually do is that we install the related software on our local machine then we do something then we install the latest software on a test machine or a production machine we deploy our code and hope that is all gonna work and hope that everything is going to have the same version and everything now darker version differently darker gives us dedicated environments and separate environments and identical environments most most importantly across all the stages of development so if I create a docker container to run a WordPress application then I can use the same docker container configuration in my production so that will give us the more security and more confidence that those environments are identical and I won't have so many issues or no issues at all because the environments are different so this is this is the darker solution to this you know a long long long problem of identical environments in computing science and um let's go to the terminology so what is dark robot docker has containers that you probably know so containers are running instances of running operations environment of different applications basically and let me show you how that works so if you look at my own computer this is my local Mac so if I see docker PS docker PS lists by the way all the containers that are running on your machine so say dr. PS you can see that I'm running a Mario DB container on my machine right now and if I say docker PS - eh then it will list also the containers that are not running they are stops so you can see that I have an engines proxy and I have two wordpress instances and a mario DB and i usually run node instances as well and all that crap but you know right now this is everything that I have so Mario DB is a running container and this is my local development database so if I go to this guy here this is a my sequel client and open up my sequel kind go to my local host say connect and look at the database then you will see that I have WordPress tables in here and I have WordPress data in here and everything you see here is coming from this local database so before I use docker I used to install my sequel with bit blue as you can see I also have it installed right now I use things to a MongoDB node and VM I noticed with these guys everything with blue and right now if I go my sequel server status then you can see that my secret is not running I'm not running my sequel local anymore because I'm running my sequel in a docker container so simple so this is basically docker you can just get hold of any application you want to use you download the image and start up a container so image is a new term I haven't used it so far so image basically the definition of the environment and if you start up an image that's that is cool a container container is a running instance of an image so you download the definition once you download the image once and then you can start multiple containers multiple instances of the same image that's just like I have done with WordPress for example so I have the WordPress image and I started to WordPress images with some different configurations so that two containers based in the same image I hope you can understand this and I hope this makes sense so um if I go darker images on my machine then you can see that I have a couple of other images here locally don't worry about first first two these are custom images I made them I created them and I will tell you how to do that but let's just say I have an old image which is basically this node I have an engines proxy which is my engine ances on local proxy it's not running anymore any right now but this is what I usually use WordPress I have various image as you have seen I have started two containers from that and I have another node as you see the version is different so this one is the latest node and this one is an exact version of nodes and I can tell you that you better always use the exact version of the environment but I will tell you later by and how that works and I have Mario DB so these are the containers that I'm running right now or these up here these are the containers and these are the images that are present locally and I can use these immediately is to start up new containers and yeah that's the meaning of docker if you want to help start projects in some new technology you just grab an image you start up a container and your environment is ready and then if you want to move that same package same application to staging or production or testing or to another development machine then you very simply grab the same image start up the image with the same configuration and there you go you have the same environment hmm that's the essence of docker that's it and so let's first of all I guess the most important thing is that you have to install a kit on your own machine right so hmm let's go to let's go to my website here and running docking on your machine in this spot we have a link and let's open that link in a new tab here okay here and hmm there's only a few things I wanna talk I'm going to tell you about the installation of docker installation of doc here on Mac and Windows has changed so this environment is changed quickly and when you see some tutorials online they are outdated so when you see a tutorial that is telling you to use darker tool box here or butoh docker then please make sure to understand if you are you need to use that or you can use the the native version of darker so right now the way to install docker is to install the native application on Mac and on Windows and the native application is not butta docker and it's not the darker toolbox so there are certain requirements if you fall under these categories then you can install the native application and you are good to go but if you you know if your Mac was for example produced before 2010 then you need to do the hard way the other way ok so let's get started click this link and please install a darker on your machine and I will be waiting so please start the video I have some water right now hmm okay and once the installation is done let's move on so the Mac installation is a step by step guide the Windows installation is the same thing in step-by-step stuff and all Linux please go to your specific distribution and see how to do that so after you installed you should be having an icon in the top bar that says docker is running so when we say darker is running that means the darker engine is running this part of the terminology so what you need to install and run on your machine is the darker engine so what does the darker engine do the darker engine has the ability to run containers ok so simple so docker engine in the background technically it runs a virtual answer Linux virtual machine and docker containers are based on the Linux container tectum addiction technology and Linux container methodology and all you need to know about this right now and I will show you some details about this later the docker containers are really efficient because they share resources so when I'm running a couple of containers on my machine that means that those containers are sharing the same kernel in the background but for the applet from the application point of view they look like separate and isolated virtual machines so they have their own file system they have their own users that they have their own environments and they have their own resources and so application thing applications think that they are running in an isolated environment because this is what's happening but in the background the containers shared a lot of lot of lot of resources so this makes them very efficient and at the same time they save us a lot of time headache and effort because they just solve some very essential problems of Environment Management ok so now that we have installed docker then the darker engine is running then we should be having the the command-line tools as well so let's go to terminal let's say docker - - version and this is the version of docker and let's say docker compose which is another important component of docker and you see that you should be getting a response to these like some meaningful version number if you run these things this is by the way not the latest China I will agree to the latest very soon it doesn't matter it at this stage ok so now that we have installed docker the question comes we are running containers and we are running web applications in containers that are started from images so this is what we discussed so far so where do image is come from how do I get an image and you get the images on docker hub that's the answer so let's go to hub the docker calm which is this website here let's click Explorer and I did it I click that and this is the repository of docker images online so here we have the technologies and a lot of lot of technologies so if you want to try and develop stuff you know you get UV to play with just do it you want to play with my sequel you want to play with Postgres you want to be note HD PD WordPress you name it you look at this stuff if you say that this is the official image that means that that's really the official image of that technology that means that you know there are images provided officially and there are images provided by the community so third party and I can show that to you so that you can better understand so and gene X for example is the official image here then if I search for engine X then you see that I have a lot of other images by third parties by people by the community that are also somehow related with engine eggs they have some different configuration they are specialized for something okay and how can you understand which is the best image to use it's a very good question you can of course play with them and try them but there are too many then you can google them and see what others use and you know if you want managers get started the official image is usually your best bet so um another hint here is to look at the number of stars which is the rating on the docker hub or you can see look at the number of downloads this is the popularity of an image okay so you go to the docker hub you see all this beautiful technology you will decide which one to use you grab an image and then you start up containers and those containers will run the applications for you okay this is the meaning of docker so let's check out we're going to use nginx in this tutorial and let's see what's behind this nginx page because this is a very important resource and a very useful resource I'm clicking this okay so this is the page and I found that these pages are very resourceful so they are full of valuable information and believe or not this is a kind of documentation that can you get started so thank you well done very very well done you can expect that most of the images on the docker hub have a good documentation and if you look here umm this is a short description official build ok that's fine you see hawker pool which means if you want to get these images do darker pool and then you can grab that it will download that image local into the local image repository okay full description this is the usual use useful part so there is some version information we're going to talk about that in a minute there's a description you know what is nginx nginx by the way is a web server and reverse proxy so we're going to use it as a web server today and then how to use that image this part is pretty cool so it tells you exactly how to how to serve HTML pages from this web server it tells you how to map the port I will show this to you and explain why it gives you some configuration options environment variables and so on and then we have some you can issue description documentation description and there are some community comments and so on as well so this is pretty cool this is very informative let's go to the version numbering so if you look at my doctor images locally you see that I have for example on the from the node this is another image this is a node image and I have 6.6 to 0 and why I also have node the latest and you know this is tricky because the essential idea of of doctor what we want to achieve is to have the same environment everywhere and run our code in the same operating environment so if you want to do that you better use specific versions because if you use a label like latest then the version number behind the latest label male may change so today maybe the latest is six the six is zero but maybe tomorrow the latest will be six or 6.2 and if you're just using the latest then you will end up with different versions in different environments which is not good it will cost you money and pain okay so here you will find all the information related to the 2d versioning you have the latest is this is the latest version number you have a stable number as well so there are latest versions and stable versions and if you go to tags then there is usual even more detailed information about all the versions that were ever available and here some of them are not available even but they are still listed and and so right now what you want to say we need to make a choice whether to pick the latest or pick the stable but let's pick the stable and we need to make a decision whether we want to pick a fine or not a time so what the hell does it mean so that means that as I said docker is based on the Linux container technology and that means that every docker container or docker image is derived from some kind of a Linux distribution and this one here the the motor pine-sol the other one then obviously let's say the default is based on DB and Jesse so DB and Jesse is a Linux distribution it's a Debian I'm sure you heard about that is one of the big names is a very feature-rich very stable very strong distribution of Linux so this version the latest and the stable these two are based on Jesse it's also in the name time on the other hand is a trendy distribution and many docker images started to move in the direction of alpine because it's leaner it's it has a smaller footprint and it's optimized for stability or specialized for stability so sorry this for security so the thing is that we can pick one or the other you can see the size of the size of the Jesse package I can show it to you the size of the Jesse package is 71 megabytes and the size of the pine package is 17 so that that's this is one of the differences but I believe this is not good enough you know to make a good decision or make a good choice and please make your research understand which is best for your own case if you if you do some complex stuff or production stuff or for money before for the tutorial right now I will just say the let's use a time and let's go for the stable version of a pine okay so excuse me oh let's have some water so what we're going to do we're going to grab this package from the docker hub okay so we say dr. Poole nginx let's go to terminal and say dr. pool nginx and then the version number we will is 1 2 2 2 2 1 10 2 2 1 . 10.2 - fine and if you run this then it will pull the image so all it does it's like any other package manager or like github it will just pull that image and save those files locally so it will be done in a second hopefully not more I have some more water now mmm okay so we have downloaded so if I say Locker images images here then you say that there is a new image on my list which is nginx and this version here ok so what do I need to do to start this locally ok the first thing that I got to do is that I can say darker and run docker run is do is the is the command that will run an image and turn in and start the container artery ok so you can also follow along and copy and paste the commands from my from my blog so that you can you will do that easily so you can find a command also here so what we gonna do the first thing we gotta do that we going to give it a name why is why this is important because this is a human readable name that you gave to your containers you can always know what's going on so for example if you do a/b testing then you can say that this is WordPress a and the level is WordPress B for example so let's call this my nginx then there is one very important point that I've explained to you so we are starting a web server an nginx web server and in order to start that we need to understand something and that's something is when we start the container that there will be an engine X server running inside that container it's a web server it's going to expose two ports port 80 and port 44 for 444 sorry for this 443 and and those ports are exposed by the container and that means that those ports are not available as the ports of your own machine they are not exposed on the on the host machine they are only exposed on the container so if you learn multiple containers that exports port 80 you need to understand how to map those to the two ports of the host machine so that you can use all your containers so right now what I will because by default I won't be able to access that port 80 in my container I can only access that if I map it to a port on my host machine so the first port that I have to give here is the host on the port machine and I give it the port 80 which means this is going to be my default local host HTTP server and you have to just show you what I'm doing I'm not serving anything I have no service up and running so I I just map it the port 80 of the container I map that to the port 80 of the host and then I say ok nginx and then one dot 10.2 yes fine okay so I start this up and it's up and running right now so nothing has happened but because I'm running this 99 to foreground so if I click this I have the welcome page of engines here and you see I have one request already listed under this comment so if I do another request I have another line and if I do another request I have another line which means that this is right now my local host server ok so let's celebrate first of all let's smile and say okay you know this is how complexities or how easy it is actually to grab an engine nginx HTTP server locally so you don't need to install you need to configure that much you just pull that image and run that and by the way you can do that in one line so if you say doc you run so if we launch that line here from from the terminal and if the nginx image is not downloaded not yet pool locally dr. Ram we'll pull it for you so with this one single line you can pull that image and start a container so this is how easy it is to replicate one environment to another to a new machine or to a new computer okay let me stop this and I'll tell you something about this so this is pretty pretty pretty important and if I say darker PS right now that you see that I only have Mario DB running and nothing gasps does this image is not running anymore and I will stop Mario DB as well okay just to have a clearer picture okay and if I list all the images then you see that my nginx image that we just started with the nginx container that we started is um is still here so I can restart it okay that's pretty cool but let's see what happens if I want to start it with different parameters so you have seen that our nginx server the container is running in the foreground but if I want to run that in the background all I need to do is add another runtime parameter which says let that dash D which means that um it should run as a daemon but the thing is with engines or with docker containers that you cannot change the runtime parameters of an existing container so that means that for example if you want to change the port mapping on an existing container you cannot do it if you want to change if you want to add another runtime parameter to an existing container you cannot do it even if you stopped it you cannot do it because you created that container and it has those parameters so what you need to do you have to launch and create a new container and it has some practical disadvantages first of all that you know that if I start another container with the same name I'm going to have a conflict and you may think that okay let's not be so stupid let's give it another name but after a vide there will be too many names so what I usually do is that I remove the container before I start it again because then these things will be just you know the stick around and they never go away so let's go darker our M which will remove the container and gene X and I have removed that so if I go dr. PS dish a you see that that thing has gone okay so um let's go back to the starting script here and let's say that I will add like minus D here and now you see I have a long long ID and I got the prompt back which means that this thing is running in the background you see it is running because docker PS says it's running port mapping is okay and I'm still running the localhost so it's T running but I have changed it right now so let's stop it again or okay let's not stop it let's leave it running so okay so the thing is that you cannot change a running container you have to create another one instead of this and this is a lot of lot of implications because if you start up and I strongly suggest that you google this part so if you want to start a container with new runtime parameters you have to create a new container you cannot change the existing container that means that any data or any user-generated content that you have put into your container will not be available in a new and reconfigured container uh-huh and that means that has a lot of implications so for example if you're running a Mario DB and you want to start at Mario DB on different port that means that all the data in that container will just disappear they will not be the in the new container so what we usually do is that we do not put data into our containers and I will show you how we do that we will put data outside the container and map the data into the container with volumes it's very simple I will show you how that works okay so let's do the following I want to create a configuration file and map that configuration five into our nginx container so let's do that okay so first of all this thing is running and now if you show you something very handy now okay so that's darker exact the exact is a comment that can exact execute a command inside the running container hahaha so - Ti is that we're gonna run this in an interactive mode okay and this is the this is the name of the container so I'm gonna run on the my engines runtime this this thing here and we're gonna run in an interactive mode and I will say /bin slash SH BC I'm gonna start shell so right now I'm inside that container and I see this is the root filesystem and yeah Who am I I'm rude ah this is so amazing so it turns out that the container that we are running is it looks like a standalone Linux machine and I am root and I actually I can actually apply changes and run stuff inside a running container those things that are run inside a container we have an effect until this container is running so when you stop the container your changes will disappear but then one ticket for that runtime the changes will be still there so what I want to do is to to give this container a config file from the outside so I happen to know not okay I'm not I don't happen to know I have checked this I show you where to find this so let's go back to docker hub and on docker hub we have the engines description and under complex configuration here look at this line so it is darker on this is the name and this part here says then if you want to add a config file from the outside into this container then you have to map volume mount the volume this is the local directory so whatever you have and map that local directory and the stuff that config file in that local directory into the config file that is at this path in the container so if you do this you will overwrite the config file in the container with a config file on the local machine this is what volume mounting - V means so let's check what's there so let's check at etc' and Gen X and Gen X conf so this is the file that is here so you look at this I'm not cheating and uhm this is the content of this file so let's copy that okay and let's leave the container let's say docker PS I'm gonna stop this because we're gonna change this and I'm also gonna remove this so right now that is gone and let's open up a text editor so sublime text or whichever editor you like I've been using sublime text in the last couple of months again return to my old friend and I already have a config file here so please create a config file in the local directory and copy and paste the contents of the quantity of that file that we just copied from from inside the container what we copied let's copy and paste that into here okay and let's save this so once we have saved this we're going to map that let's change the configuration so let's say how shall we go about this so what okay what I'm essentially what I want to do is the right now this line is commented out so whatever we have is not compressed the responses coming from the HTTP server are not compressed so let's uncomment this line and from now on we're gonna get compressed responses I just wanted to show you that previously in the original setup we we did not compress but let's leave it please believe me or you can take it as a homework and chide you for yourself so previously we were not compressing and not even commented this line so if we apply this config file to the container we're gonna get the zip compression so that is what's going to happen so um let's close this let's come back here and our config file is here so just let take the path of that so this is the path and let's go back here because it is what I like I go back in the history in history and then I say ok let's mount the volume and use this thing here copy and paste and let's not forget to put the config file because we are mapping the entire file and then we are do et Cie nginx nginx pump this is the this is the path inside a container this is the path that we looked up in the documentation because some really nice people put the right thing into the documentation are all means read only many people use this restriction which means that we are mounting this Phi in read-only mode so the container and runtime will not change it that is what it means okay so we have the read-only and everything else stays the same so if we go here and refresh this you will see that this is not running so now we study stuff ok and you see it is running now so if we go into the developer tools in chrome we go to network and let's refresh this page we click on localhost and then you see that the encoding this zips so right now we are we are serving a compressed content and if you if you want to know what I use here this is a clear clear cache plug-in in Chrome I usually use this for development because it helps me clear the cache and then refresh the page so if you cannot see the compression don't worry because if you do this clean cache the stuff then it appears suddenly so it doesn't always work it's not really reliable but if you clear the cache then it becomes reliable so what we did we mapped a config file into our server so let's do something else let's see how we can do development with this stuff so locally if you do local development you have to make sure that your local files and your code get into the container somehow and now I guess you probably understand that what we got to do is to create a mapping and map that stuff map the code into our containers so let's stop this again because we're going to start it in a new configuration okay so I have removed it and okay let's say if you list this I have already created the source directory maybe I will show it in sublime text I have a source directory I have an index.html file under that so please make create something like this on your computer create a new directory and hello word from my this is the content in a paragraph this is the HTML page page XML line that we're going to serve okay so this is our source code so what we're going to do is that we go to that directory so this is the source directory and we take the path of that and we create another mount point so we mount this time we are mounting the directory so we are not mounting individual files we are mounting the entire directory and what is the what is the folder in the container itself again we can go back to docker hub and look up that thing so hosting some simple static content here you see this is this is the part here this is the the director in the container so if you use this we're going to map our source code into that container so if I start this again if it has we started and now if i refresh this hello word from ma it's already there you see so I very simply just mapped my source with source files into the container and the good thing is I mean what is the essence of development let's change this stuff okay so I'm changing this and I'm refreshing this and tada I'm changing the code and the stuff changes pretty cool right okay this is a simple scenario if you want to have hot reloading and all this stuff I don't have a tutorial about this yet but I'm not going to talk about this now maybe later or maybe google it but essentially this is the this is the way that we put stuff into docker okay so um this is pretty neat so what else am I going to tell you okay so um let's quickly go back to to my post and see if I have explained everything so these are containers this we have done this we have executed the shell in the running container we mounted the config file vo so mounted the source code and yeah there's one thing left and um I will do that too so the one thing left is let's create our own docker image so you have seen that I have some custom images running so I'll show you how I've done those so darker stop let's start this thing again my nginx and let's remove that thing as well nginx okay and here in this in this folder I have a docker file so it is a file that's called docker file so the way you create your own images is that you create a file that is called docker file so but first of all why on earth you want to create your own image right that's the question so the answer to this is that that you may want to have a dedicated configuration your own version of an image with special config in a docker file you have an opportunity to install new packages like you know a PT or any other package manager under Linux so you can create your own environment and the good thing about docker file is this this is the basic tutorial so maybe and we talked about this in the next one but essentially what you need to understand and please Google it that you need to understand that the docker file and the docker image is a layered structure so every line on this file is executed one-by-one and it creates a new layer and it commits a new layer into the image and it is important because if one part of that image step-by-step configuration changes then docker will only be it those layers that have changed so the layer that has changed and would order layers up from that you know starting from there will be rebuilt but the layers that are below before the change though those remain untouched so this saves a lot of stuff for example if you if you're using node and you have a package.json then if your package Jason changes then your whole thing will be rebuilt but if your package isn't doesn't change then your your image will not be rebuilt at least the MPM in stores will not run again but some other stuff may run so this saves you a lot of time and effort and so on so but let's not go into detail I'm using it in in my projects and it works pretty well so the best thing all that we want to do right now just create an image okay so we got to start with with the from from is always another image we start from so right now we are starting from this pine nginx image the same version and then you always need to specify something to start from okay maintainer it's you it's he had the best thing is that you can put your name on it your email address if you want to have a lot of lot of bug reports even put your put your phone number that would be a strange idea and okay so what are we going to do we're going to essentially copy that engines config file from the local directory into the image itself so what that means then we are not mapping that volume so it's not a logical reference we are not mounting this thing we are copying the file exactly into the container it's going to be part of the image so whenever we start up that image that configuration will be already included into the image okay so let's see how to do that so what we got to do we got a beard at image so darker beard is the command doctor beard is the comment to be the images and - t t means that you'd be give it a tag and tag means that is a name plus a version so let's call this zip engine X which is you know this is a zip version of engine X because we changed the config file to sleep the stuff and let's say this is 1 2 0 and what we got to do here we put a dot dot means that please use the local director the current directory to be at the stuff so what docker will do is we look into the current directory see if there is a docker file in there and once the docker file is found then it will be an image so let's see how that works it's a breeze it happens in us in a matter of a second or less than a second the image is already there so we can go darker images and then you see that we have a new image that is that says zip engine x1 dot 0 ok so what we're gonna do now so if I go darker PS that's just double check if I close yeah I have stopped everything that also means that if i refresh this nothing will happen pretty cool so um so what are you gonna do we're gonna start up a new container from our new image so yeah let's leave this up again so that we know what's going on and okay so this is the this is the common that we use and most of it will be this same the name will be different because we will call this container my zip engine X and minus D that works well and we need to remove the configuration mapping because the config file is part of the image just remember that and we will be still mapping the source because that's the same thing and the port mapping should be in place this is amazing place and we are not using this image to start the container we are using another image that is called zip and gin X 1.0 okay so let's see what happens so we have started this stuff and let's refresh this hello world it's coming from our own beautiful custom image okay if you go localhost and look at this thing let's refresh this unreliable beast and it says okay I know this issue this is pretty neat so it doesn't say that it's compressed but I know what what I gotta do let's change the source code let's refresh everything's so hello were from mark and now it's the eye suddenly appears this is what I said it's not really it doesn't vary the same way all the time but don't worry we have we have compression butene by default and um we have the source files map so this is the end of the tutorial and ok there's there's a couple of thing before I do the summary so there's one more thing on the on the on the website on the post here in my article and that is docker compose and I think dr. Campos has a place in the beginners tutorial but I don't talk about this too much docker compose is a tool that lets you create multiple containers from one file so you create a composition you can add runtime configuration like you like port mapping and all the stuff that we have done now the command line you can do that in a file and you can do it in a way that you are basically connecting to different component containers in one file and you see dr. Campos up and then you get everything that is in the fire up and running I've used that it's important you understand that you have this possibility to combine compo computer containers and start them from home file in one big move and I think for a beginner this is enough to know that you have this possibility and if you want to use it please go online dr. has pretty good documentation on this part but and there are of course other tutorials and maybe I will do another tutorial on that so let's keep that for later so what we have learned today we have learned how we can install doctor on our own machine we will learn the terminology of docker engine docker containers docker images we learned that docker containers are running instances of docker images we learned that the source the the resource pay place of docker images is basically docker hub so if you want to get docker images then you go to the docker hub well we also learned that those images are typically very popular and common web applications like database these web servers Linux distributions all these things so you can you can essentially grab those images grab those web applications get up those web components grab those runtimes and start them locally and they save you the headache of configuring the hell out of your local machine or they configuring the hell out of your servers in the cloud or wherever you just you just enjoyed the docker engine and the start of the containers and then you get the same environment everywhere so it gives you a lot of benefits and I hope you will really use it and hope hope you will have great success with docker and yeah see you in the next tutorial Cheers
Info
Channel: takacsmark
Views: 218,172
Rating: undefined out of 5
Keywords: docker, docker container, docker images, docker hub, docker development, docker configuration, Dockerfile, docker-compose, docker compose, development tutorial, docker tutorial, docker tutorial for beginners, docker explained, docker introduction, docker basics, docker beginner tutorial, What is docker, learn about docker, how does docker work
Id: Vyp5_F42NGs
Channel Id: undefined
Length: 46min 12sec (2772 seconds)
Published: Mon Nov 14 2016
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.