MongoDB with Docker in IntelliJ IDEA (2021)

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
Hi, I'm Dalia. Hi, I'm Trisha. And in this video, we're going to show you  how to set up MongoDB in a Docker container.   We're going to be using IntelliJ IDEA. We decided  to pair on this because I have a lot of knowledge   about Docker and Trisha has a lot of knowledge  about MongoDB from the time she worked there. So we're starting here. I'm sharing my  screen. Trisha is going to show me how to   do certain things with Mongo. We actually  recently had to do this exact same thing.   So Trisha, do you want to walk us through? Yep. Exactly. So we created  a spring boot application.   The spring boot application was, the  idea was to allow restaurant bookings. So as a customer, I can book online a restaurant  so I can go there and have a meal out in the real   world. Yay. And this is a microservices  application. The code we're gonna look   at today is the restaurant service. This is the  metadata of restaurants. So, you know, their name,   their opening hours, you know, their capacity,  all the things to do with the restaurant. And we decided for this service to use  MongoDB as the data store for this,   the reason being the thing I learned  when I was working at MongoDB,   is that the way that the  document database works with,   it's sort of flexible schema. It works really  nicely if you're not entirely sure of exactly   the amount of data, you're going to be storing  about an individual entity. So for restaurants,   for example, some of them, you might just have  like name and opening hours and some, you might   have like name and opening hours and indoor  capacity and outdoor capacity and smoking versus   non-smoking. So this kind of flexible schema, it  fits very nicely with the MongoDB way of working. So that's why we decided to  use MongoDB for this service. Yeah that's a great point. It's the  flexible schema is the key here.   And here's our main class. So  if we tried to run it right now,   oh, Trisha is probably going to ask me why  are you not using the shortcuts Ctrl+Shift+F10   in order to get it running, I love these gutter  icons, and it also tells you, oh, go ahead. I do like the gutter icons because they're very  visual. So you know exactly what you're running,   especially if you've got like a test  class, that's more than one thing in there. Yeah. That's a great point too. You can  just run one method or so on and so forth. So there we go, starting here and we see an  error. It'll stop logging here. So if we go   backwards, we'll see that it has an error.  And if you look at the stack it's saying   that it can't find Mongo, which it makes sense  because we don't have Mongo installed right now.   So what we're going to do is we're going  to set up MongoDB with a Docker container. So I'm going to go to my services  window. And I have Docker set up   already. I have Docker running. If I bring  up my icons here, it's running right here. And I have a connected, if you have any questions  of over how I got Docker connected with IntelliJ   IDEA, check out my Docker in IntelliJ IDEA,  video, I go over how to set that up and   a lot of that info. But for here, we're  assuming that Docker's already set up   and we're ready to set up MongoDB. So what I'm  going to do is the first thing I need is an image. So we're going to pull a MongoDB image. So  I'm going to start typing M and actually   IntelliJ IDEA has auto-completion here.  So I can just see the recommendations.   Mongo comes up right away.  I'm going to select that   and then I can leave this blank and it'll  give me the latest or it can choose a version. So Trisha, do you have a preference on. I like to use the version number, an explicit  version number. The most recent one is 5.0.3,   which is pretty new. That came out last month. Cool. And actually, if you're ever  wondering about version numbers   you can also do Ctrl+Space and  you'll see the versions here. If I start typing 5, so it can kind of narrow  it down 0., you said 3 . Perfect. So that's what   we're going to do. And then we're going to click,  not enter, but Ctrl+Enter. I always mix that up   and it's going to start pulling MongoDB  from DockerHub. If you already have the   image locally, it won't take long  because it's already on your system. But if you don't like me, it's going to take some  time. So now we cue the music doo-do-doo-do-do this is the world of video. We can speed this up. That is true. So you'll watch it speed  up. All right. Looks like that's done.   So you'll find under images, the new image right  here, and you'll see all the information about   the image. All right. So now that we have the  image, we can create a container from that image. So we're going to right-click on the image.  Click Create Container. Which will bring up   a configuration window and in here you'll see,  the name of the configuration is set for us.   The server is set for us and the image ID is  set according to what we right-clicked here.   So what we're going to do here is we're  gonna set it set a name for the container. I'm going to call it mongo-container. And  then if you want to add any more options,   you can click modify options and select the option  you want to add. For me, I want to bind the ports.   Mainly because I need to publish the port   that MongoDB is going to be running on.  Otherwise I will not be able to access it. And then Trisha can remind  me of the defaults here.   2 7 0 1 7 2 7 0 1 7. And we can set both of  these to the same. But you don't necessarily   have to do that if you want to set it  to a different host port. That's fine.   And I explained some of that in the networking  video that I made. Mainly because a lot of people   try to mess around with ports and they don't  really understand what exactly it's doing. So   I do have a networking Docker, a video that I talk  about you know, what you're doing here. Exactly. Which I found very helpful because I always  struggle with ports. I'm like, which one is   host and which one is container  and what are they supposed to be? So yes. Do check out it out. The other thing you can do is also  you can bind the mounts. So if you   want the data to stick around after you delete  the container, then you can bind your volumes.   I'm not going to go into that or set it  right now. You can look into that because   for our dev environment, we don't  necessarily want the data persisted we're just in development right  now. But if you want to set it,   you can definitely do that in this window. So  that's all I'm going to do. And then I'm going to   click run. So if you're working in the  terminal, this is the equivalent of   running the Docker run command. You can do that in  the terminal, or you can set it in IntelliJ IDEA   so that you can just keep running the config over  and over you don't have to run the same commands. So I'm going to click Run. Is there a way to see what Docker command it ran  when you did that. The equivalent command line? It used to show up in the config and that  was actually not there anymore. Let's see if   there's a way to see it. It used  to show up at the bottom here.   Show command preview. That's a good point. Right there. Yeah. That's really  helpful in case you also wanna know,   you know, how this would look like if  you're running it from the terminal.   Good point, Trisha. All right, so let's go  back to the log. So there's a bunch of tabs   that are associated with each container and it  has all the information about your container. So here, this is just the build log. So  the process of building your container   and what happened. It looks like  it was created successfully.   And this is the log of the process in the  container. So this is the MongoDB log and   Trisha, I'm going to need your  help here to decipher the log. Everything in MongoDB is JSON So everything's going to have like curly braces  and and inverted comments like that. But yeah,   I would be looking, hopefully there's  something which says the service started, Okay. Let's search. What any of that is?  Yeah. Let's let's see if I can search. Look for the port number. Look for 27017. Oh yeah, let's do that. Here you go, it says starting on that port. Then we got listening... And  waiting for connections. Perfect. So, once you see waiting  for connections, you know,   it's ready and it's waiting  for something to connect to it. Perfect. So that's the main log  line that we look for there.   Any other things that we want to point out here? I think maybethat you have like the  properties, so you can see the name here,   any environment variables that were set  for you. Port bindings volume bindings, and   oh you can even browse the file system.  I thought that was really helpful. Yeah. This is really helpful because for me, I  don't really understand containers cause it's   just this magic black box which happened  somewhere else. And so having the ability   to kind of drill into that black box and see  what's there, I find that extremely helpful. Yeah. Is there anything you  want to do with the container   to make sure it's up and running properly? Yeah, so one of the things that we were doing  when we were playing with MongoDB before   is if you're used to working with  MongoDB, especially if he used to   working from the command line, like we're  often taught in the getting started stuff. Often you want to sort of use the  Mongo command to once, you know,   the database is up and running. You want  to be able to query it and sort of see,   is it really running? And is it  the database I expect it to be?   What I found confusing about Docker was I can't  do that from my terminal command line, right? Because it's not really running,  it's running in a magic container   but Dalia showed me a trick, right? Show me the trick. You can right-click  on the container here and click Exec   and then create and run. Right, so I want to run a command line command  called mongo, which is the repl basically for   MongoDB. So should be able to run commands  just from that, if that goes, see if it works. Is it just mongo or is it mongo bash? You should be able to it from just mongo. All right. Let's try it out.  Let's see. Let's see if it works. Oh, that did work. Okay, cool. If you scroll  up to the top of that. Yeah. Let's do that Then it's basically, yeah, it shows you're  running the Mongo shell. So you basically   that's the same as if you touch  Mongo for the command line and   you're running a local MongoDB . This  is the shell that you'd normally see. So then you can type stuff in here to have  a look at what's going on. So the default,   the first place you want to, the first thing  you want to check is show dbs, just to see   that you've got some databases semi-colon, or  you don't need need a semi-colon. Who knew?,   so, yeah, we've got a nice, empty,  clean instance with basically   no databases and no data in our  admin databases, but it is there and it is working. Perfect. So maybe this is a good time to try to insert  some data. Okay. So we're going to go to our   restaurant controller and we're  going to find the saveRestaurant   method. So let's see it's down here. We're Trisha  showed me this really useful way. Oh, go ahead. Before you click on that,  let me explain what this is. So, this is a spring boot controller. It's  a restful controller. So what it does is it   shows all the URIs that you would usually use  a browser or an external service to call this   service. So what Dalia is going to do here is  instead of using a browser to call these URIs,   we'll use the IntelliJ IDEA  built in HTTP Client to do that. So go ahead, click on that. Let's do that. And so we're doing a POST request. We are running on local host   and I have some JSON data. So y'all, don't  have to sit through us typing that out. You're going to post an individual  restaurant to the restaurant service. Yes. So let's run that and see what happens. So hopefully that works. Okay. Yay. Response  code: 200 that's what we like to say. Yes. So   that means everything went okay. So let's  figure out if there's any restaurants.   We could actually go to our let's see,  localhost and then let's do restaurants. All right. It looks good. Except the other thing  that I like to really check is how things look   in the actual database. And actually the database  Explorer is something that I always use. So let's   set that up really quick. So what this is going to  do is it's going to have a connection to MongoDB,   and it's going to show you your  tables right in IntelliJ IDEA. I like to see the data right there. So  I like to always connect my database   to IntelliJ IDEA. So let's do that Data Source  from URL. And let's type in the URL Trisha,   you're going to have to remind me, is it  mongodb or mongo? It's mongodb. Okay. I   always mix the two, sometimes it's mongo,  sometimes it's mongodb://localhost:27017. Okay, perfect. And then look IntelliJ IDEA picks  up that it's mongoDB one. Perfect. And then let's click.  Okay. And see if it connected.   It's going to bring up the configuration  window and asks you if you want to configure,   anything else. I'm just going to take all the  defaults because everything is set to the default. It doesn't have any drivers. So  if you just click download here,   it's going to go off and  download the missing drivers. I find this the most useful feature of this whole  window, because the number of times that I've been   trying to connect to a database, especially from  JDBC or something like that. And you're like,   what is the magic incantation for my driver  files to connect to my JDBC data source. Totally agree with that. Let's do the test  connection to make sure that it's running properly   and here it is. So it looks  like it's succeeded and   the connection was successful.  So let's click. Okay. That's connecting to MongoDB in  the database Explorer. One of the   things I like about this is it's treating  NoSQL databases, the same as SQL databases   so that you can take a look at the, at your data  sources, take a look at the data that's in there   and poke around with it the same way you would,  if it was MySQL or one of the other SQL database. Yeah, and I always do this with MySQL containers  as well, because a lot of times it's really   easy to set up a MySQL database. And then I just  connect it with a database Explorer and just go on   and create all the tables  and the data and all that.   There it is. It's connected  and it has a restaurant table. Collection. Collection. Yes. See,  I come from a SQL background,   so you're going to have to keep correcting me. I think that's another thing that's  important to notice here is that the   IntelliJ IDEA support for mongo DB is evolving.  It is trying to fit a document shaped database   into a relational database  type shape inside the UI. So restaurant is represented as a  table, even though it's a collection   to say the word collection. And it kind  of has the concept of fields, which is   not quite the same thing in MongoDB.  And then when you click on it,   you get a table of data like this as sort of  output in a tabular way. I quite like this because   firstly you get a visual representation of your  data, which is one of the things I always like. I'm a very visual person. And secondly, if you  are coming to something like MongoDB from a SQL   database, it's kind of nice to see it in a more  familiar form. Whereas normally when you look at   the documentation in MongoDB land, it's all about  using the command line and seeing stuff in JSON and it takes a bit of a mental model shift to get  used to using the MongoDB way. Whereas if you use   it inside IntelliJ IDEA, it kind of, it feels  a bit more familiar. And a bit more database-y. Yeah, I totally agree. This brought it home for me. When I was like  experimenting with it. So you can see that the   record can I call it record? The document,  you can see the document made it in here. And it's all good to go. Anything  else you want to show here? Not really. In here, we don't really have  a lot to show. I mean, the only thing to   really point out is if you scroll to the right.  And look back at the dates the opening days,   whereas the Saturday there, MongoDB  supports this idea of lists as a type. So it's kind of that one field can have multiple  values. So it's shown almost like a Java list. Yes. Yes. That's a good point. Okay. And  do we want to talk about the console? Yeah. Let's just quickly look  at the console, because again,   if you're used to working with MongoDB, you'll  be used to using like a command line console. So if we open the, if we open  the console. This option? Yeah. Let's give that a go. Great. So if this was  a SQL database, this is where you'd be typing your   SQL commands, like SELECT * FROM whatever, but  this is not a SQL database. This is a MongoDB   database. So this works in a slightly different  way. You want to use MongoDB commands here. For example, we can use  show dbs like we did before. And let's see, is it Ctrl+Enter or Enter?  It's probably Ctrl+Enter Let's try that. Cool. So yes. So you can see all the databases  we saw before admin config and local,   but also the new one test, which  is where we ended up putting our   test restaurant data. You can switch to using the  test database by using , or by saying, use test.   Right. Here's one of the things  I want to point out here. This is this is the way the IntelliJ IDEA does  a whole bunch of console stuff. So you could,   if you want to, you can run line one  and line three or the whole thing.   You can run the whole script if you like,  or you just run the individual line.   So I think if you use Ctrl+Enter, I  think you're all on just that one line. I think so actually I noticed something, so I,  you can do auto-completion, code-completion here,   and it'll show you the different databases  that you have. So that's really helpful.   And then you can do let's do Ctrl+Enter. Oh,  it asks me which statement I want to run.   So do I want to just run, use test or all of it? So that's helpful. We're going to do use test. That's one of the things that makes this  different from a terminal command line   in that instead of just doing like one line at a  time, you can build up a set of commands and you   can run all of them or run them into the. Cool.  So you're already on db test, that's useful. So one of the things I like to do is  have a look at everything that's in the   restaurant collection. So we're on  the test database. So it's db dot. You   should be able to say restaurant. So that  means we're going to use that collection   dot and then find you should be able  to get code of completion for find. Right. And again, because the  IntelliJ IDEA is going to give   you code completion with these things ,  it's really helpful. If you're kind of   getting to grips with MongoDB and you're  trying to use something very very new. Yeah. Let's do Ctrl+Enter. And then  we just want to run that. Tada!   There we go. Okay. So it looks like  everything is running properly. After we ran this locally, we want it to run  it with Docker Compose so that it's easier for   everyone else on the team to get the app up  and running. So, we're going to show you how   we set up our application with Docker compose so  that it's both running with two Docker containers,   not just one Docker container,  which is the MongoDB one. So, what I'm going to do is I'm going  to create a Docker compose file.   So let's go to our project window. I'm  gonna insert and then create a new file.   And we're going to call it docker-compose.yml.   Yes, add it. So FYI, we do have a Dockerfile  already for the restaurant service.   So what we did was we containerized our  application using a Dockerfile. So we   already have the Dockerfile. So if you have an  application not running in a Docker container,   you're going to want to create a Dockerfile or a  Docker container for it using a Dockerfile. And   I go into that in my Docker videos. But  we already have it for this restaurant. So, what we're going to do is we're going to  create two services one for the application   itself and one for the MongoDB container. So  first thing is we're going to set the version   and this is the file format  version for Docker compose.   And then we're going to create two  services. One is the MongoDB service. I'm going to just call it MongoDB. And then I'm  going to tell Docker compose what image to use   for that service. And here I can also use  code completion. So I'm going to start   typing and I see Mongo came up. And  then what was the version again? Trisha? 5.0.3 Okay. So that's that. Yes. And  then we're going to set the ports. So this is the equivalent of what we did to do  the run command, to get Mongo up and running.   This basically codifies it in  one file. So you don't have to   create a configuration or do anything  like that or save your commands.   This is going to be a one-stop shop. Click that  run button and get the application up and running. This is what I like about Docker compose.  This makes a lot more sense to me than   running stuff from the command line,  because I've got configuration file,   which spells out exactly what services I  want, what versions they are. And basically   I can use something like IntelliJ IDEA to  just run them consistently the same time. Yeah, exactly. That's why we wanted to set it for  the team so that it's easier for them. And then   27017. So that's all we did in our Docker run.  So that's enough for the services for MongoDB.   So now I need to create the service for my  application. So I'm going to call it restaurant.   You're much better at spelling restaurant than me. We had that. We had a lot of fun  teasing Trisha about that. You had fun.   And then we're going to build the image before we  run the service, if it doesn't exist. So that's   what I'm doing here. And then I'm going to set the  ports. And in this case we're exposing port 8080   so that we can access it via localhost:8080, and  then we need to set the environment variable. So. What this is going to do is  it's going to change the host name   for how to access MongoDB. And I want to explain  that for a second. So when we created the MongoDB   container, initially we created it on  the local machine and exposed port 27017   so that we can access it via local host. Now, when  I create a separate container for the application   and that separate containers, trying  to connect to the MongoDB container. It's two isolated containers and it  doesn't really know how to access   localhost. So what we're going to do  is we're going to tell the services,   the application container to connect to the  MongoDB container via its services name. So the   way that we're going to do that is we're  going to pass in a spring property. And it's going to be spring.data.mongodb.host=.  And that is going to be set to this name here.   So this is going to tell the restaurant service,  when you trying to access the MongoDB container,   access it via this not localhost, because  otherwise it just doesn't really understand.   Localhost means whatever is in the application  itself. Not anything outside of that.   And lastly, what I like to do is I like to add  a depends_on that way I can set MongoDB as a   dependency, so that service starts first. And  then my restaurants service starts because the   restaurant service is not going to start properly  if the database is not up and running already,   and that's all we're going to need to do in the  Docker compose file. So now let's try to run it. And I like the gutter icons here because you  can start and stop services right here. You   don't have to, you know, if you want to just  restart MongoDB, you don't have to restart   everything in here. You can just restart Mongo. I've been using that a lot in Docker  compose. So I won't start the whole thing,   but let's say I want to do some sort of  system level tests with the database. I don't need all the services  running. I just need MongoDB running.   So I start MongoDB and then run  some automated tests against MongoDB Yeah, that's a good point. But I like the way that, because you put the  dependency that depends on in restaurant.   If you start restaurant, it's going to  make. That MongoDB is running because,   and that makes sense because it's, the  restaurants is not gonna work if it's not running. Yeah. And you get some help here in case  you're wondering, you know, what each key   is doing. And this is a YAML file. So you want  to be very careful with your indentation and all   because if you get that wrong then you know it  won't work quite the way that you expect it to. What I love about that the  errors are not very helpful. Yes. Let's see, we did get an error.  You got an error. So it looks like   Failed port. Oh, the port is already  allocated 27017. The reason that we're   getting that is because we already have  a port binding to the host port 27017.   So what we need to do is we need to stop the  containers that are bound to those two ports. And the hint there is cause it's 27017 it's  almost definitely something running MongoDB. Exactly. Yes. So what we're going to need to do is  go to the container we created earlier and stop it   so that it's not a binding that port. And let's try that again. And now it's complaining about 8080. So  now we have to actually stop the 8080 port. We have it running. We don't have it  running in Docker. We have it running   and we have it running from IntelliJ IDEA Yes! We have it running. Locally. And so what  we need to do is we need to stop the run here. So that's a good point. Because sometimes  you think, is it running in a Docker   container? Or is it running locally? No  matter what the end result is the same,   because there, it just means that port is  bound to something or some process out there   and you need to stop that process. So let's  now try it again and see what happens. Looks like things are starting. So the way  I like to look at it is I like to expand   my Docker-compose node here. And I see the  two services, my mongodb, and my restaurant.   Under there I see the container. So if I go  to click it, I can still see the logs here.   And I know Trisha told me that it was the 20. All right. I'm going to search.  It's so much easier - 27017. It's   searching through your containers. Yes, it  is. Let's go back here. Let's do this. And we   are going to try that again, 27017 so it looks  like it's right here. Waiting for connections.   Yes. So that's working and then if we go to the  restaurant container, let's see if that is working And it looks like the logs are pretty clean,  so it should be working. Let's go ahead and   go to the browser and interact with it. So I'm going to refresh. And it's empty this time. The  reason it's empty is because   we're not using the original container anymore.  We're using a new container that Docker compose   created. So if we wanted to populate it again,  we'd have to do the same thing we did last time,   which is go to our restaurant  controller, click on generate request. And then.   You can reuse the one at the top. Oh, good point.  Yeah. If we scroll up, we can just click on that. Looks like it's 200. So if I go  to the browser again and refresh. Looks good! So it's running. So there's  two ways of running your applications with   MongoDB. You could do it from just a local  application connected to your container,   your MongoDB container, or you can set up  Docker, compose and have two containers   talking to each other. And that's all we wanted  to show today. I hope you found it helpful. If you have any questions about, you know,  how to run Docker in IntelliJ IDEA or   just Docker in general, I created a video  series that talks about Docker basics, like,   you know, what an image is, a container is,  Docker compose, networking and, all that.   And I have a specific video about Docker  in intelliJ IDEA in those video series. I'll link that in the description  and you'll find the playlist. So you   can go through all those videos and  learn more about Docker. That's all.   Thank you for watching. And  thank you for joining me, Trisha. Thanks for having me. This was really fun.
Info
Channel: IntelliJ IDEA by JetBrains
Views: 6,956
Rating: undefined out of 5
Keywords: intellij idea, docker, mongoDB, MongoDB image, MongoDB container, Docker Compose, intellij idea tutorial, intellij java
Id: QumOvEDMQ34
Channel Id: undefined
Length: 34min 42sec (2082 seconds)
Published: Wed Oct 27 2021
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.