Hot answers tagged

86

Not at all. Imagine you're running the version 1.8.0 of Java on both your development machine and the server. By the way, you're working simultaneously on two projects, both using Java. One day, a bug is found in JVM, and the servers which run the first project you're working on are migrated to 1.8.1. By the way, the servers running the second project aren'...


35

You rarely just deploy a "Java App". Your java application has a lot of different support programs around it. We use Apache HTTPD, Apache Tomcat, ActiveMQ for messaging, an FTP Deamon, MySQL and a handful of custom services to integrate with programs that don't work directly with Java. This doesn't even go into the development software that goes along ...


13

This is not an uncommon problem, but Docker isn't really the right tool to solve it. Containers in general (including Docker) are intended to provide an application runtime for a single process, such as a web server, not for a multi-process scenario such as a dev environment. In can be done, but isn't a very elegant solution. A better (and more common) ...


10

For running build-time tests, the preferred way would be to use a multi-stage build. Multi-stage Dockerfiles allow you to have a larger stage with all the dependencies for building and testing, then copy the exact artifacts you tested into another stage for a smaller runtime image. You also want system-level tests of multiple containers, using their ...


9

Docker or not, I'd say don't put both webapp and db server in the same container. Initially, it may work, but if/as application grows, you'll want to scale the frontend and the database individually. Having different containers from the start will make it easier to move them around, duplicate them individually, etc.


9

There is a third way, as you said yourself. I think you are mixing up development, testing and deployment. I propose that the whole SDLC be looked at as a whole, first, to understand what it is you are trying to achieve. This is a big topic, but I will do my best to summarise. TL;DR; In short, you need to separate: your code, from the application ...


8

This question would also be pertinent for golang, where you can just extract statically linked binaries and run them somewhere, as opposed to Python or C++ where you usually have a large number of linked libraries which leads people to just build a docker container out of the development environment. There are two points to answer here: One: there has to ...


8

Here are some reasons why we use docker as part of our software development process (we don't use it in production yet): Consistent and version controlled local deployment environment - we check our docker builds into version control, and we can collaborate on the stack. We can get a completely clean environment by stopping and starting a stack. Ease of ...


7

Microservices should be relatively independent of each other. During developer testing, you should be able to only start the one you are working on and perhaps two or three others, usually related to storage, messaging, or authentication. If you can't, you should work on improving your architecture. If your full application won't fit properly on a ...


7

The recommendations I've seen is to have all-in-one container: Docker Misconceptions: Misconception: You should have only one process per Docker container! It's important to understand that it is far simpler to manage Docker if you view it as role-based virtual machine rather than as deployable single-purpose processes. For example, you'd build ...


7

I am asking myself the exact same question at the moment. I am leaning towards the multi-instance single tenancy solution but have not taken a definitive decision yet. Let me share some of my thoughts : The main historical advantage of the multi-tenant architecture is a better use of infrastructure resources, by mutualisation (single OS, single Database, ...


6

It sounds like your problem is you are putting all your microservices into the same "development environment image" as you describe. So any service container can see all others. What you should be doing is building specific docker images for each microservice, building on a base image docker that contains the appropriate defaults as well as each specific ...


5

The primary advantage of Docker is the ability to create wholly deployable applications as build artifacts. The deployable applications can be run through test suites that verify that they operate correctly before promotion as production images. This differs substantially from install scripts because the testing is done before production and less is ...


5

It often makes sense to version docker-compose.yml files separately from your application, because they are specific to different deployments, and reference multiple docker images from several microservices, which are usually kept in their own individual repositories. Although you should look into solutions like the docker secret command for managing things ...


5

There are a number of reasons: The instances can be scaled differently. For example, databases usually require a minimum of 3 physically-separated nodes for durability, where a web server usually resides in memory and can be restarted quickly, so you might keep it only on one node during low-traffic times and scale it up to more nodes during peak traffic. ...


5

This is a really good question but after working with Docker, I would turn it around: Are the benefits of the JVM negated by containerization (e.g. Docker)? Containers really challenge a lot of the assumptions I have about development that come from my experience. For example, if someone were to hard-code a path to a resource file in an application, a ...


5

I'm not sure why people have downvoted you, other than there is a well documented and easy way to go about this. Docker images are layered, and you can build all your essential-for-all-images packages into one new docker image of our own making, and then extend from that. For example, when you write your docker file, your first line will be FROM ...


5

If we consider the cache to be orthogonal to the architecture (and it's), the first pic is ok. For the same reason that we don't deploy one security service, one API gateway, one message broker or one service locator per POD we don't have to deploy one Cache (in replica-set) per POD.1 Be aware of premature optimizations Caches are meant to solve specific ...


4

Supporting both options is possible also (a pool of tenants across multiple instances). I favor multi-instance cause of the natural isolation. Each customer's instance runs in it's own processes and it's data is isolated in it's own database. You can upgrade instances to new versions on a per customer/instance basis when desired. Tenant based systems come ...


4

Docker allows you to easily create and distribute an environment. You can keep the environment identical on all systems. You can make snapshots of these images and docker will pull them down, and [[whatever]] in them the same on all systems. It is considerably easier to keep this image the same across all users than a VM. It's also considerably more ...


4

Here are some advantages of running Nginx or Apache outside of your application: You want to host several applications running on the same port at different domains (reverse proxy). You want HTTP error responses to occur even if the application container fails. The Apache or Nginx container will return 502 if your application container has failed or is not ...


4

If it's an entirely private Node module, and it works for you, then go ahead. However, I'd say the "correct" answer is No because if you published the module (even to a private corporate npm repo), you're now leaking deployment stuff into the app's configuration. Now you've given anyone that installs your project a way to mess with your build process. Also,...


4

From the information you present us here, it is hard to judge whether it makes sense to use Docker at all. From what you write: We have a python scheduling solution which, at the moment dynamically loads python modules to run each job in a separate process. What would a dockerized scenario bring to the table? If you design for docker, you would ...


4

It depends, what are they actually doing? If you’re handling health or banking records, you should probably secure the communications since there is usually a legal requirement to do so. If you’re pushing around cat videos, maybe not. But one thing to consider is that having the security in place makes it way easier to handle georedundancy and other sort ...


4

Separate services should use separate REDIS instances. Reason: Bad usage of REDIS by another service, causing REDIS outage, should not impact your application. Only queues which are used for inter-service communication should be shared.


3

Looking at your code, I assume the whole logic of your application can be expressed as single Task Execute(). And what you need is pretty simple task cancellation scheme. Your code might look like : public static void Main(string[] args) { Start(); } public static async void Start() { var cts = new CancellationTokenSource(); var starting = ...


3

If you don't trust someone with your code, you shouldn't send your code to their machine. Period. Docker has made quite a few improvements to networking in the latest few releases. If you architect your system to have one container per microservice, you should be able to have development environments talk to a remote server, and production and test ...


3

Managing dependencies and dynamic libraries is not a new problem. In your scenario, the usage of Docker is unrelated to that problem as you are only using Docker to bundle your build toolchain (i.e., compilers). The environment where your application is executed will need all dependencies. However, that does not mean you need to pollute the host system. ...


3

While Docker helps you deploy services, it does not really help you to manage resources. You will have to provide resources for this storage externally. If you will be running your service in some kind of cloud, the cloud provider will likely have a storage product ready to sell to you. Try to estimate how much data in total you will store, and how much you ...


3

A Docker image is identified by: [owner]/[name]:[tag] When you get an official image from Docker Hub, the owner is not required. Example: alpine:latest So, I can pull safely the alpine image and indeed get the official image? When you pull from the Docker Hub (Official Repository) you will get the official Alpine image. My images are only based on ...


Only top voted, non community-wiki answers of a minimum length are eligible