To solve the given optimization problem, we first need to translate the natural language description into a symbolic representation. This involves defining variables for the quantities of interest (small and bulk size containers of fish food), formulating the objective function that represents the profit, and specifying the constraints based on the available resources (fish food units and filling time).

Let's define:
- $x_1$ as the number of small containers of fish food produced.
- $x_2$ as the number of bulk size containers of fish food produced.

The objective is to maximize profit. Given that the profit per small container is $2 and per bulk size container is $7, the objective function can be represented algebraically as:
\[ \text{Maximize:} \quad 2x_1 + 7x_2 \]

Now, let's consider the constraints:
1. **Fish Food Availability Constraint:** Each small container requires 10 units of fish food, and each bulk size container requires 30 units. The company has 200 units available. Thus, the constraint can be written as:
\[ 10x_1 + 30x_2 \leq 200 \]
2. **Filling Time Availability Constraint:** It takes 2 minutes to fill a small container and 7 minutes for a bulk size container. With 120 minutes available, this constraint is represented by:
\[ 2x_1 + 7x_2 \leq 120 \]
3. **Non-Negativity Constraints:** Since the company cannot produce a negative number of containers, we also have:
\[ x_1 \geq 0 \]
\[ x_2 \geq 0 \]

Given this symbolic representation, the problem can be summarized as follows:

```json
{
  'sym_variables': [('x1', 'number of small containers'), ('x2', 'number of bulk size containers')],
  'objective_function': '2*x1 + 7*x2',
  'constraints': ['10*x1 + 30*x2 <= 200', '2*x1 + 7*x2 <= 120', 'x1 >= 0', 'x2 >= 0']
}
```

Now, let's implement this optimization problem using Gurobi in Python:

```python
from gurobipy import *

# Create a new model
m = Model("Fish_Food_Production")

# Define the variables
x1 = m.addVar(lb=0, vtype=GRB.INTEGER, name="small_containers")
x2 = m.addVar(lb=0, vtype=GRB.INTEGER, name="bulk_size_containers")

# Set the objective function
m.setObjective(2*x1 + 7*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(10*x1 + 30*x2 <= 200, "fish_food_availability")
m.addConstr(2*x1 + 7*x2 <= 120, "filling_time_availability")

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution: {x1.varName} = {int(x1.x)}, {x2.varName} = {int(x2.x)}")
    print(f"Maximum Profit: ${int(m.objVal)}")
else:
    print("No optimal solution found.")
```