## Problem Description and Formulation

The problem is a classic example of a linear programming problem. The company needs to decide how many small and bulk size containers of fish food to produce in order to maximize profit, given the constraints on available fish food and filling time.

Let's define the decision variables:

* `s`: number of small containers of fish food to produce
* `b`: number of bulk size containers of fish food to produce

The objective function is to maximize profit:

* Profit per small container: $2
* Profit per bulk size container: $7
* Total profit: `2s + 7b`

The constraints are:

* Available fish food: 200 units
* Fish food used per small container: 10 units
* Fish food used per bulk size container: 30 units
* Total fish food used: `10s + 30b <= 200`
* Available filling time: 120 minutes
* Filling time per small container: 2 minutes
* Filling time per bulk size container: 7 minutes
* Total filling time: `2s + 7b <= 120`
* Non-negativity constraints: `s >= 0`, `b >= 0`

## Gurobi Code

```python
import gurobi

# Create a new Gurobi model
m = gurobi.Model()

# Define the decision variables
s = m.addVar(lb=0, name="small_containers")
b = m.addVar(lb=0, name="bulk_containers")

# Define the objective function
m.setObjective(2 * s + 7 * b, gurobi.GRB.MAXIMIZE)

# Define the constraints
m.addConstr(10 * s + 30 * b <= 200, name="fish_food_constraint")
m.addConstr(2 * s + 7 * b <= 120, name="filling_time_constraint")

# Optimize the model
m.optimize()

# Print the solution
if m.status == gurobi.GRB.OPTIMAL:
    print("Optimal solution found.")
    print(f"Number of small containers: {s.varValue}")
    print(f"Number of bulk containers: {b.varValue}")
    print(f"Maximum profit: {m.objVal}")
else:
    print("No optimal solution found.")
```