Bird
Raised Fist0
Dockerdevops~10 mins

EXPOSE instruction for ports in Docker - Step-by-Step Execution

Choose your learning style10 modes available
Process Flow - EXPOSE instruction for ports
Write Dockerfile with EXPOSE
↓
Build Docker Image
↓
Run Container
↓
Port is marked as exposed
↓
Optional: Map port to host
↓
Container can accept traffic on exposed port
This flow shows how the EXPOSE instruction marks a port inside the container as open for communication, which can then be mapped to the host when running the container.
Execution Sample
Docker
FROM nginx:latest
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
This Dockerfile exposes port 80 so the container can receive web traffic on that port.
Process Table
StepActionResultNotes
1Dockerfile read: FROM nginx:latestBase image set to nginxSets base image
2Dockerfile read: EXPOSE 80Port 80 marked as exposedPort 80 is now known as open inside container
3Dockerfile read: CMD ["nginx", "-g", "daemon off;"]Default command setStarts nginx server
4Build imageImage created with exposed port 80EXPOSE info stored in image metadata
5Run container without port mappingContainer runs, port 80 exposed internallyPort 80 not accessible from host by default
6Run container with -p 8080:80Port 80 in container mapped to 8080 on hostHost can access container on localhost:8080
7Send HTTP request to localhost:8080Request reaches nginx inside containerPort mapping works
8Stop containerContainer stopsEnd of lifecycle
💡 Container stopped, port exposure and mapping demonstrated
Status Tracker
VariableStartAfter Step 2After Step 4After Step 6Final
EXPOSED_PORTS[][80][80][80][80]
CONTAINER_RUNNINGfalsefalsefalsetruefalse
PORT_MAPPING{}{}{}{8080:80}{8080:80}
Key Moments - 2 Insights
Does EXPOSE alone make the port accessible from the host machine?
No, EXPOSE only marks the port inside the container as open. To access it from the host, you must map the port using -p or --publish when running the container, as shown in step 6 of the execution table.
What happens if you run the container without port mapping?
The container runs and the port is exposed internally, but the host cannot access it. This is shown in step 5 where the container runs but port 80 is not accessible from outside.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, at which step is the port 80 marked as exposed inside the image?
AStep 4
BStep 2
CStep 5
DStep 6
💡 Hint
Check the 'Action' column for when EXPOSE 80 is read in the Dockerfile.
According to the variable tracker, what is the value of PORT_MAPPING after step 4?
A{8080:80}
B{80:80}
C{}
D[]
💡 Hint
Look at the PORT_MAPPING row and the After Step 4 column.
If you want to access the container's port 80 on your host's port 3000, which step in the execution table would change?
AStep 6
BStep 5
CStep 7
DStep 8
💡 Hint
Port mapping happens when running the container, see step 6.
Concept Snapshot
EXPOSE <port> in Dockerfile marks a port inside the container as open.
It does NOT publish the port to the host.
Use docker run -p hostPort:containerPort to map ports.
EXPOSE helps document which ports the container listens on.
Mapping ports enables host access to container services.
Full Transcript
The EXPOSE instruction in a Dockerfile tells Docker that the container listens on the specified network port at runtime. When building the image, this port is marked as exposed in the image metadata. However, this does not automatically make the port accessible from the host machine. To allow access, you must map the container port to a host port using the -p option when running the container. For example, running 'docker run -p 8080:80' maps container port 80 to host port 8080. Without this mapping, the port is only open inside the container and cannot be reached from outside. This visual execution showed reading the Dockerfile, building the image, running the container with and without port mapping, and how the port exposure and mapping affect accessibility.

Practice

(1/5)
1. What is the main purpose of the EXPOSE instruction in a Dockerfile?
easy
A. To start the container with a specific port
B. To automatically publish ports to the host machine
C. To document which ports the container listens on
D. To stop the container from using any ports

Solution

  1. Step 1: Understand the role of EXPOSE

    The EXPOSE instruction tells Docker which ports the container will listen on internally.
  2. Step 2: Clarify what EXPOSE does not do

    EXPOSE does not publish or map ports to the host automatically; it only documents them.
  3. Final Answer:

    To document which ports the container listens on -> Option C
  4. Quick Check:

    EXPOSE documents ports, does not publish them [OK]
Hint: EXPOSE documents ports, doesn't publish them automatically [OK]
Common Mistakes:
  • Thinking EXPOSE publishes ports to host
  • Confusing EXPOSE with port mapping
  • Assuming EXPOSE starts container on a port
2. Which of the following is the correct syntax to expose port 8080 in a Dockerfile?
easy
A. EXPOSE 8080
B. EXPOSE:8080
C. EXPOSE(port=8080)
D. EXPOSE[8080]

Solution

  1. Step 1: Recall Dockerfile EXPOSE syntax

    The correct syntax is simply EXPOSE followed by the port number without any punctuation.
  2. Step 2: Check each option

    Options A, B, and C use invalid syntax with brackets, colons, or parentheses which are not allowed.
  3. Final Answer:

    EXPOSE 8080 -> Option A
  4. Quick Check:

    Correct syntax is EXPOSE followed by port number [OK]
Hint: EXPOSE followed by space and port number is correct [OK]
Common Mistakes:
  • Using colons or parentheses in EXPOSE
  • Adding brackets around port number
  • Writing EXPOSE in lowercase
3. Given this Dockerfile snippet:
FROM nginx
EXPOSE 80
EXPOSE 443

What ports will the container listen on internally?
medium
A. Ports 80 and 443
B. Only port 443
C. Only port 80
D. No ports are exposed

Solution

  1. Step 1: Identify all EXPOSE instructions

    The Dockerfile exposes port 80 and port 443 explicitly.
  2. Step 2: Understand multiple EXPOSE usage

    Multiple EXPOSE lines add ports cumulatively, so both ports are exposed internally.
  3. Final Answer:

    Ports 80 and 443 -> Option A
  4. Quick Check:

    Multiple EXPOSE lines add ports together [OK]
Hint: Multiple EXPOSE lines add ports cumulatively [OK]
Common Mistakes:
  • Assuming only the last EXPOSE counts
  • Thinking EXPOSE publishes ports to host
  • Ignoring multiple EXPOSE instructions
4. You wrote this Dockerfile snippet:
EXPOSE 80 443

But Docker build gives an error. What is wrong?
medium
A. Port numbers must be in quotes
B. Ports must be separated by commas
C. EXPOSE must be lowercase
D. EXPOSE cannot list multiple ports on one line

Solution

  1. Step 1: Check EXPOSE syntax rules

    EXPOSE accepts multiple ports on one line separated by spaces; it does not require multiple EXPOSE lines.
  2. Step 2: Validate other options

    Ports do not need quotes, EXPOSE is uppercase by convention, and commas are not used to separate ports.
  3. Final Answer:

    EXPOSE cannot list multiple ports on one line -> Option D
  4. Quick Check:

    One port per EXPOSE line only [OK]
Hint: Use one EXPOSE per port, no spaces or commas [OK]
Common Mistakes:
  • Listing multiple ports on one EXPOSE line
  • Adding quotes around port numbers
  • Writing EXPOSE in lowercase
5. You want to run a web app container that listens on port 3000 inside the container. You want to access it on port 8080 on your host machine. Which Docker commands and Dockerfile instructions correctly achieve this?
hard
A. Dockerfile: EXPOSE 8080
Run: docker run -p 3000:8080 image
B. Dockerfile: EXPOSE 3000
Run: docker run -p 8080:3000 image
C. Dockerfile: EXPOSE 3000 8080
Run: docker run -p 3000:8080 image
D. Dockerfile: EXPOSE 8080
Run: docker run -p 8080:8080 image

Solution

  1. Step 1: Understand EXPOSE and port mapping

    EXPOSE should list the internal container port (3000). The run command maps host port 8080 to container port 3000.
  2. Step 2: Check each option's correctness

    Dockerfile: EXPOSE 3000
    Run: docker run -p 8080:3000 image correctly exposes 3000 and maps 8080 on host to 3000 in container. Others either reverse ports or use invalid EXPOSE syntax.
  3. Final Answer:

    Dockerfile: EXPOSE 3000 and run with -p 8080:3000 -> Option B
  4. Quick Check:

    EXPOSE internal port, map host:container ports correctly [OK]
Hint: EXPOSE internal port; map host port to container port with -p [OK]
Common Mistakes:
  • Exposing wrong port inside Dockerfile
  • Reversing host and container ports in -p
  • Listing multiple ports in one EXPOSE line
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard