In general, a differential equation problem consists of two parts: a system of equations and boundary conditions.
Suppose we're dealing with functions of time. The system of equations describes how quantities change over time. The boundary conditions—if they are provided—tell you about how quantities take on specific values at specific times. In this way, the boundary conditions constrain the space of solutions.
Here's a simple example from calculus: I tell you that $$y^\prime = 2x.$$ This is a system containing one equation. There are many solutions to this equation: $y(x) = x^2$, for example, or $y(x) = x^2 - 3$, or $y(x) = x^2 + 17$. Notice (by plugging in) that each of these different functions satisfies the differential equation. In general, for shorthand, we write that the set of solutions is just
$$y(x) = x^2 + C \qquad (\text{for any }C)$$
where each new value of $C$ gives you a different solution, and every solution to the equation can be expressed this way.
But in addition to providing the differential equation $y^\prime = 2x$, I might also give you a boundary condition such as $y(2) = 7$.
Now we must only consider solutions to the differential equation that satisfy this new constraint. In particular, out of the infinitely many possible solutions of the form $y(x) = x^2 + C$, only one of them satisfies the boundary condition— namely,
$$y_\star(x) = 2x + 3.$$
Differential equations may have many— even infinitely many — solutions. Some of these solutions will depend on a choice of constant. The general rule is that any function you find which satisfies the differential equation is a valid solution.
Boundary conditions impose additional constraints— if you have boundary conditions, the solution must satisfy not only the differential equation, but the boundary conditions at well.