Skip to main content

[SOLVED] What is the difference between "expose" and "publish" in Docker? - docker

[SOLVED] Understanding the Difference Between “EXPOSE” and “PUBLISH” in Docker

In this article, we will look at some important ideas about Docker networking. We will focus on the difference between the EXPOSE instruction and the -p or --publish option in Docker. Knowing these two things is very important for anyone who wants to manage container apps and how they talk to the outside world. The EXPOSE command helps developers show which ports a container listens on when it runs. The -p option helps connect these container ports to the host system for outside access.

In this chapter, we will check out these solutions:

  • Solution 1: Understanding the EXPOSE Instruction in Docker
  • Solution 2: Understanding the -p or --publish Option in Docker
  • Solution 3: Example of Using EXPOSE in a Dockerfile
  • Solution 4: Example of Using -p for Port Mapping
  • Solution 5: Key Differences Between EXPOSE and -p
  • Solution 6: Common Use Cases for EXPOSE and -p
  • Conclusion

By the end of this article, we will understand how to use the EXPOSE and -p options in Docker. This will help us manage our container apps better and set up networking. If you want to read more on related topics, you can check our guides on copying files from Docker containers and communication between multiple containers.

Solution 1 - Understanding the EXPOSE Instruction in Docker

The EXPOSE instruction in Docker is used in a Dockerfile. It shows which ports the application inside the container will use when it runs. This instruction helps the person who builds the image and the person who runs the container know what to expect.

Key Points about EXPOSE:

  • Purpose: It tells Docker that the container will listen on the specified network ports when it runs. But it does not really publish the ports. It just gives a hint.

  • Syntax:

    EXPOSE <port> [<port>/<protocol>...]

    For example, if your application runs on port 80, you put this line in your Dockerfile:

    EXPOSE 80
  • Multiple Ports: We can expose many ports by listing them:

    EXPOSE 80 443
  • Protocols: We can also say the protocol (TCP or UDP):

    EXPOSE 80/tcp 53/udp
  • Documentation: Using EXPOSE helps others see which ports are for outside communication. They do not need to check the source code.

Important Notes:

  1. No Network Binding: The EXPOSE instruction does not publish the port or make any bindings. To let the port be accessible from outside the container, we need to use the -p or --publish option when we run the container.

  2. Default Behavior: If we do not expose any ports, the container can still run. But it may not be reachable from the outside unless we publish specific ports.

  3. Best Practices: It is good to use EXPOSE to show the ports that your application uses. This is important in multi-container applications. It gives clarity for users of your Docker image.

Here is an example Dockerfile that uses the EXPOSE instruction:

FROM nginx:latest

# Copy static files to the container
COPY ./html /usr/share/nginx/html

# Expose port 80
EXPOSE 80

In this example, the Dockerfile sets up an Nginx web server and exposes port 80. This shows that this port will be used for web traffic.

For more reading on Docker networking, check out Docker Networking.

Solution 2 - Understanding the -p or --publish Option in Docker

The -p or --publish option in Docker is a command-line flag. We use it when we create a container with the docker run command. This option helps us connect a port on the host machine to a port on the Docker container. This connection is very important. It allows outside access to services inside the container. These services can be web servers, databases, or any apps that listen on a network port.

Syntax

The basic way to use the -p option is like this:

docker run -p [HOST_PORT]:[CONTAINER_PORT] [IMAGE_NAME]
  • HOST_PORT: This is the port on the host machine. It will connect to the container’s port.
  • CONTAINER_PORT: This is the port inside the Docker container. This is where the app runs.
  • IMAGE_NAME: This is the name of the Docker image we use to make the container.

Example

Let’s say we have a web app in a Docker container. This app listens on port 80. To run this container and connect it to port 8080 on the host, we would use this command:

docker run -d -p 8080:80 my-web-app

In this example:

  • The -d flag runs the container in detached mode.
  • We can access the web app inside the container via http://localhost:8080 on the host machine.

Multiple Port Mapping

We can also connect multiple ports by using the -p option more than once. For example:

docker run -d -p 8080:80 -p 443:443 my-web-app

Here, port 80 of the container connects to port 8080 on the host. Port 443 of the container connects to port 443 on the host for HTTPS traffic.

Using --publish-all

If we want Docker to automatically connect all exposed ports to random ports on the host, we can use the --publish-all or -P option. For example:

docker run -d -P my-web-app

In this case, Docker will connect each port exposed by the container to a random port on the host. We can check the connections by using the docker ps command. This command shows the port connections.

Key Takeaways

  • The -p or --publish option is very important. It allows outside access to services running in a Docker container.
  • It is easy to use. We can connect host ports to container ports. This helps communication between the host and the apps inside the container.
  • For more advanced networking, we can look into Docker’s networking features, like Docker Networking.

Understanding the -p or --publish option is key for managing Docker containers well. This is especially true when we run services that need to be reachable from outside the container.

Solution 3 - Practical Example of Using EXPOSE in a Dockerfile

We use the EXPOSE instruction in a Dockerfile to show the ports that a container will listen for connections. This instruction does not actually publish the ports. It works as documentation. Other tools like Docker Compose can use it to expose the ports when we run containers.

Syntax of the EXPOSE Instruction

The syntax for EXPOSE in a Dockerfile is simple:

EXPOSE <port> [<port>/<protocol>...]
  • <port>: This is the port number that the application inside the container will use.
  • [<port>/<protocol>]: We can also say the protocol, like TCP or UDP. If we do not say a protocol, Docker assumes TCP by default.

Example Dockerfile Using EXPOSE

Here is a simple example of using the EXPOSE instruction in a Dockerfile. This shows a basic Node.js application that listens on port 3000.

# Use the official Node.js image as a base
FROM node:14

# Set the working directory in the container
WORKDIR /usr/src/app

# Copy package.json and install dependencies
COPY package*.json ./
RUN npm install

# Copy the rest of the application code
COPY . .

# Expose port 3000 for the application
EXPOSE 3000

# Command to run the application
CMD ["node", "app.js"]

Explanation of the Example

  1. Base Image: The Dockerfile starts by saying a base image (node:14) which has Node.js.
  2. Working Directory: The WORKDIR instruction sets the working folder inside the container to /usr/src/app.
  3. Copying Files: The COPY instruction copies package.json and the application code into the container.
  4. Installing Dependencies: The command RUN npm install runs to install the application dependencies.
  5. Exposing the Port: The command EXPOSE 3000 tells Docker that the application will listen on port 3000.
  6. Running the Application: The CMD instruction shows how to run the application.

Building and Running the Docker Container

To build and run the Docker container, we can use these commands in the terminal:

# Build the Docker image
docker build -t my-node-app .

# Run the Docker container
docker run -p 3000:3000 my-node-app
  • The -p 3000:3000 flag in the docker run command connects port 3000 of the host to port 3000 of the container. This allows external access to the application.

Conclusion

Using the EXPOSE instruction helps users and other applications know about the ports that the container will use. This helps us organize containers better and works well when we deploy multi-container applications. For more information on this topic, we can check how to manage ports with Docker here.

Solution 4 - Practical Example of Using -p for Port Mapping

In Docker, we use the -p or --publish option to connect container ports to host ports. This helps us access services inside the container from outside. It is important for applications that need to be reachable from the outside of the Docker network.

Syntax of the -p Option

The basic way to use the -p option when we run a Docker container is:

docker run -p [host_port]:[container_port] [image_name]

Example

Let’s say we have a web application running in a Docker container. This app listens on port 80. We want to reach this app from our host machine using port 8080. Here is how we can do this with the -p option:

docker run -d -p 8080:80 nginx

In this command:

  • nginx is the name of the web server image.
  • The -d flag means we run the container in detached mode.
  • -p 8080:80 connects port 8080 on the host to port 80 on the container.

Accessing the Application

After we run the command, we can go to our browser and type http://localhost:8080. This way, we can check that port mapping is working fine.

Multiple Port Mappings

We can also map many ports by using more -p flags. For example, if our application uses port 443 for HTTPS, we can run:

docker run -d -p 8080:80 -p 8443:443 nginx

Verifying Port Mapping

To check if our ports are mapped right, we can use this command:

docker ps

This command will show all running containers and their port mappings. We should see something like this:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
abcdefgh1234        nginx               "nginx -g 'daemon of…"   5 seconds ago       Up 5 seconds        0.0.0.0:8080->80/tcp,  0.0.0.0:8443->443/tcp   serene_bardeen

Common Use Cases for Port Mapping

  • Web Applications: Make HTTP(S) services available to users.
  • Database Management Tools: Let users access database GUIs inside containers.
  • API Services: Allow RESTful APIs to be reachable from outside apps.

For more information about Docker networking and port management, we can look at our guide on Docker Networking. By using the -p option well, we can ensure smooth communication between our containers and the host. This way, our applications stay functional and easy to access.

Solution 5 - Key Differences Between EXPOSE and -p

We need to understand the key differences between the EXPOSE instruction and the -p (publish) option in Docker. This helps us with container networking and communication. Here are the main points:

  1. Purpose:

    • The EXPOSE instruction tells us which ports a container listens on while it runs. It is mainly for information. It does not publish the ports to the host.
    • The -p or --publish option binds container ports to host ports. This lets outside applications access those ports. It allows communication with services inside the container.
  2. Usage Context:

    • We define EXPOSE in the Dockerfile. It shows which ports the application inside the container will use. It does not change how it runs unless we use it with docker run or a similar command.
    • We use the -p option when we start a container. This command links a port from the container to a port on the host system.
  3. Syntax and Implementation:

    • Using EXPOSE is simple:

      EXPOSE <port> [<port>/<protocol>...]

      Example:

      EXPOSE 8080
    • We use the -p option in the command line like this when starting a container:

      docker run -p <host_port>:<container_port> <image>

      Example:

      docker run -p 8080:8080 my_image
  4. Effect on Networking:

    • Ports we expose with EXPOSE are not accessible from outside the Docker host. We need to publish them with -p. The EXPOSE command does not create real network connections.
    • The -p option makes a direct link and opens the specified ports on the host. This makes services accessible from outside the container.
  5. Visibility:

    • Ports defined with EXPOSE can be seen through the Docker API. We can check them with commands like docker inspect. But they do not help with connections by themselves.
    • Ports published with the -p flag are used for connections. We can interact with them from other hosts or applications.
  6. Best Practices:

    • We should use EXPOSE in our Dockerfiles to show the intended ports for our containerized application.
    • We should use the -p option when we want to run our container and make those ports accessible outside.

In conclusion, both EXPOSE and -p deal with ports in Docker. But they have different purposes and contexts. We need to know these differences to set up our Docker containers right. For more detailed info about Docker networking and port management, check out docker managing ports.

Solution 6 - Common Use Cases for EXPOSE and -p

We need to understand the common uses for the EXPOSE instruction and the -p or --publish option in Docker. This is important for managing our container apps well. Both of these are key for networking in Docker. But they have different roles.

Use Cases for EXPOSE

  1. Documentation:

    • We use the EXPOSE instruction mostly for documentation in a Dockerfile. It shows which ports our application will use. This helps users and developers know about the network interface we plan to use.
    FROM nginx
    EXPOSE 80

    Here, we say that the Nginx server listens on port 80.

  2. Inter-container Communication:

    • If we have many containers in an app that need to talk to each other, EXPOSE helps with this in a Docker network. For example, if we have a web app container that connects to a database container, we can expose the database port. This allows connections.
    FROM postgres
    EXPOSE 5432
  3. Docker Compose:

    • When we use Docker Compose, EXPOSE is useful. It lets us define exposed ports in the Dockerfile. We can then use these in the docker-compose.yml file. This makes it easier to manage services and their ports together.

Use Cases for -p or --publish

  1. Accessing Services Externally:

    • The main use for the -p option is to connect container ports to host ports. This lets us access services running in containers from outside. For example, if we want to run a web server in a container and reach it from our host machine, we use:
    docker run -d -p 8080:80 nginx

    This command connects port 80 in the container to port 8080 on the host.

  2. Running Multiple Instances:

    • When we run many instances of a service on the same host, -p helps us to tell them apart. For example, if we have two web server containers, we can map them to different host ports:
    docker run -d -p 8081:80 nginx
    docker run -d -p 8082:80 nginx
  3. Development Environments:

    • In development, using -p helps us access applications running inside containers. This is useful for testing APIs or web apps while we develop.

Summary of Use Cases

  • We use EXPOSE mainly for documentation and to help containers talk to each other.
  • We use -p or --publish to let outside access to container services. This also helps with port mappings when running multiple instances.

By knowing these common uses of EXPOSE and -p, we can make better use of Docker’s networking features. This will help us improve our container apps. For more info on Docker networking and managing ports, we can check this resource on Docker managing ports. In this article, we look at the differences between the EXPOSE instruction and the -p or --publish option in Docker. These two have important roles in container networking. We need to understand them for good Docker container management. This helps with communication and access.

For more help, we can check our guides on how to access host port from Docker and Docker managing ports. Here are the links: how to access host port from Docker and Docker managing ports.

Comments