To solve this problem, we first need to define the decision variables and the objective function. Let's denote the number of small containers as `x` and the number of bulk size containers as `y`. The profit per small container is $2, and the profit per bulk size container is $7. So, our objective function to maximize profit would be: `2x + 7y`.

The constraints are based on the availability of fish food and filling time. Each small container requires 10 units of fish food, and each bulk size container requires 30 units of fish food. Given that there are 200 units of fish food available, our first constraint is: `10x + 30y <= 200`. 

For the filling time, each small container takes 2 minutes to fill, and each bulk size container takes 7 minutes to fill, with a total of 120 minutes available. Thus, our second constraint is: `2x + 7y <= 120`.

Lastly, we need to ensure that the number of containers cannot be negative, so we have non-negativity constraints: `x >= 0` and `y >= 0`.

Now, let's translate these into Gurobi code in Python:

```python
from gurobipy import *

# Create a new model
m = Model("Fish Food Production")

# Define the decision variables
x = m.addVar(lb=0, vtype=GRB.INTEGER, name="small_containers")
y = m.addVar(lb=0, vtype=GRB.INTEGER, name="bulk_containers")

# Set the objective function to maximize profit
m.setObjective(2*x + 7*y, GRB.MAXIMIZE)

# Add constraints: fish food availability and filling time
m.addConstr(10*x + 30*y <= 200, "fish_food_availability")
m.addConstr(2*x + 7*y <= 120, "filling_time")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution: Produce {x.x} small containers and {y.x} bulk containers.")
    print(f"Maximum profit: ${2*x.x + 7*y.x}")
else:
    print("No optimal solution found.")
```