Sign In
Sign In

How to Install VNC on Ubuntu

How to Install VNC on Ubuntu
Hostman Team
Technical writer
Ubuntu Servers
15.11.2024
Reading time: 8 min

If you need to interact with a remote server through a graphical interface, you can use VNC technology.
VNC (Virtual Network Computing) allows users to establish a remote connection to a server over a network. It operates on a client-server architecture and uses the RFB protocol to transmit screen images and input data from various devices (such as keyboards or mice). VNC supports multiple operating systems, including Ubuntu, Windows, macOS, and others. Another advantage of VNC is that it allows multiple users to connect simultaneously, which can be useful for collaborative work on projects or training sessions.

In this guide, we will describe how to install VNC on Ubuntu, using a Hostman cloud server with Ubuntu 22.04 as an example.

Step 1: Preparing to Install VNC

Before starting the installation process on both the server and the local machine, there are a few prerequisites to review. 

Here is a list of what you’ll need to complete the installation:

  1. A Server Running Ubuntu 22.04. In this guide, we will use a cloud server from Hostman with minimal hardware configuration.

Image3

  1. A User with sudo Privileges. You should perform the installation as a regular user with administrative privileges.

  2. Select a Graphical Interface. You’ll need to choose a desktop environment that you will use to interact with the remote server after installing the system on both the server and the local machine.

  3. A Computer with a VNC Client Installed

Currently, the only way to communicate with a rented server running Ubuntu 22.04 is through the console. To enable remote management via a graphical interface, you’ll need to install a desktop environment along with VNC on the server. Below are lists of available VNC servers and desktop environments that can be installed on an Ubuntu server.

VNC Servers:

  • TightVNC Server. One of the most popular VNC servers for Ubuntu. It is easy to set up and offers good performance.

  • RealVNC Server. RealVNC provides a commercial solution for remote access to servers across various Linux distributions, including Ubuntu, Debian, Fedora, Arch Linux, and others.

Desktop Environments:

  • Xfce. A lightweight and fast desktop environment, ideal for remote sessions over VNC. It uses fewer resources than heavier desktop environments, making it an excellent choice for servers and virtual machines.

  • GNOME. The default Ubuntu desktop environment, offering a modern and user-friendly interface. It can be used with VNC but will consume more resources than Xfce.

  • KDE Plasma. Another popular desktop environment that provides a wide range of features and a beautiful design.

The choice of VNC server and desktop environment depends on the user’s specific needs and available resources. TightVNC and Xfce are excellent options for stable remote sessions on Ubuntu, as they do not require high resources. In the next step, we will describe how to install them on the server in detail.

Step 2: Installing the Desktop Environment and VNC Server

To install the VNC server on Ubuntu along with the desktop environment, connect to the server and log in as a regular user with administrative rights.

  1. Update the Package List 

After logging into the server, run the following command to update the packages from the connected repositories:

sudo apt update
  1. Install the Desktop Environment 

Next, install the previously selected desktop environment. To install Xfce, enter:

sudo apt install xfce4 xfce4-goodies

Here, the first package provides the basic Xfce desktop environment, while the second includes additional applications and plugins for Xfce, which are optional.

  1. Install the TightVNC Server 

To install TightVNC, enter:

sudo apt install tightvncserver
  1. Start the VNC Server 

Once the installation is complete, initialize the VNC server by typing:

vncserver

This command creates a new VNC session with a specific session number, such as :1 for the first session, :2 for the second, and so on. This session number corresponds to a display port (for example, port 5901 corresponds to :1). This allows multiple VNC sessions to run on the same machine, each using a different display port.

During the first-time setup, this command will prompt you to set a password, which will be required for users to connect to the server’s graphical interface.

Image6

  1. Set the View-Only Password (Optional) 

After setting the main password, you’ll be prompted to set a password for view-only mode. View-only mode allows users to view the remote desktop without making any changes, which is helpful for demonstrations or when limited access is needed.

If you need to change the passwords set above, use the following command:

vncpasswd

Now you have a VNC session.

Image4

In the next step, we will set up VNC to launch the Ubuntu server with the installed desktop environment.

Step 3: Configuring the VNC Server

The VNC server needs to know which desktop environment it should connect to. To set this up, we’ll need to edit a specific configuration file.

  1. Stop Active VNC Instances 

Before making any configurations, stop any active VNC server instances. In this guide, we’ll stop the instance running on display port 5901. To do this, enter:

vncserver -kill :1

Image1

Here, :1 is the session number associated with display port 5901, which we want to stop.

  1. Create a Backup of the Configuration File 

Before editing, it’s a good idea to back up the original configuration file. Run:

mv ~/.vnc/xstartup ~/.vnc/xstartup.bak
  1. Edit the Configuration File 

Now, open the configuration file in a text editor:

nano ~/.vnc/xstartup

Replace the contents with the following:

#!/bin/bash
xrdb $HOME/.Xresources
startxfce4 &
    • #!/bin/bash – This line is called a "shebang," and it specifies that the script should be executed using the Bash shell.
    • xrdb $HOME/.Xresources – This line reads settings from the .Xresources file, where desktop preferences like colors, fonts, cursors, and keyboard options are stored.
    • startxfce4 & – This line starts the Xfce desktop environment on the server.
  1. Make the Configuration File Executable

To allow the configuration file to be executed, use:

chmod +x ~/.vnc/xstartup
  1. Start the VNC Server with Localhost Restriction

Now that the configuration is updated, start the VNC server with the following command:

vncserver -localhost

The -localhost option restricts connections to the VNC server to the local host (the server itself), preventing remote connections from other machines. You will still be able to connect from your computer, as we’ll set up an SSH tunnel between it and the server. These connections will also be treated as local by the VNC server.

The VNC server configuration is now complete.

Step 4: Installing the VNC Client and Connecting to the Server

Now, let’s proceed with installing a VNC client. In this example, we’ll install the client on a Windows 11 computer.

Several VNC clients support different operating systems. Here are a few options: 

  • RealVNC Viewer. The official client from RealVNC, compatible with Windows, macOS, and Linux.
  • TightVNC Viewer. A free and straightforward VNC client that supports Windows and Linux.
  • UltraVNC. Another free VNC client for Windows with advanced remote management features.

For this guide, we’ll use the free TightVNC Viewer.

  1. Download and Install TightVNC Viewer

Visit the official TightVNC website, download the installer, and run it.

Image5

In the installation window, click Next and accept the license agreement.

Then, select the custom installation mode and disable the VNC server installation, as shown in the image below.

Image2

Click Next twice and complete the installation of the VNC client on your local machine.

  1. Set Up an SSH Tunnel for Secure Connection

To encrypt your remote access to the VNC server, use SSH to create a secure tunnel. On your Windows 11 computer, open PowerShell and enter the following command:

ssh -L 56789:localhost:5901 -C -N -l username server_IP_address

Make sure that OpenSSH is installed on your local machine; if not, refer to Microsoft’s documentation to install it.

This command configures an SSH tunnel that forwards the connection from your local computer to the remote server over a secure connection, making VNC believe the connection originates from the server itself. Here’s a breakdown of the flags used:

    • -L sets up SSH port forwarding, redirecting the local computer’s port to the specified host and server port. Here, we choose port 56789 because it is not bound to any service.
    • -C enables compression of data before transmitting over SSH.
    • -N tells SSH not to execute any commands after establishing the connection.
    • -l specifies the username for connecting to the server.
  1. Connect with TightVNC Viewer

After creating the SSH tunnel, open the TightVNC Viewer and enter the following in the connection field:

localhost:56789

You’ll be prompted to enter the password created during the initial setup of the VNC server.

Once you enter the password, you’ll be connected to the VNC server, and the Xfce desktop environment should appear.

  1. Stop the SSH Tunnel

To close the SSH tunnel, return to the PowerShell or command line on your local computer and press CTRL+C.

Conclusion

This guide has walked you through the step-by-step process of setting up VNC on Ubuntu 22.04. We used TightVNC Server as the VNC server, TightVNC Viewer as the client, and Xfce as the desktop environment for user interaction with the server.

We hope that using VNC technology helps streamline your server administration, making the process easier and more efficient.

Ubuntu Servers
15.11.2024
Reading time: 8 min

Similar

Ubuntu

How to Install Google Chrome on Ubuntu 24.04

If you started using the internet post 2008, it is very likely that your first interaction over the internet was via Google Chrome web browser. People were frustrated with Microsoft Internet Explorer (which has reached its end of life and has now been discontinued), so when Google launched its proprietary product, Google Chrome, it was met with great demand, and hundreds of thousands of people switched to Chrome from Internet Explorer.  The reason for this switch was obvious, Chrome was definitely much faster and sleek in comparison to Internet Explorer and it offered a unique user experience. Within 4 years after its launch date, Chrome overtook Internet Explorer in terms of having the most users. Let’s switch gears now and move to the crucial part where we’ll talk about downloading and installing Chrome on Ubuntu 24.04 LTS which happens to be the latest OS at the time. Method 1: Installing Google Chrome via Graphical Interface (GUI) The first method is straight as an arrow and needs no extra skills other than the ability to operate a personal computer. Go ahead and search the term ‘Google Chrome’ in the browser bar.  Of course, you need a browser for this. Nothing to worry about as Ubuntu has a browser that comes built-in, this built-in browser is Firefox. Follow along, see where the arrows are pointing in the screenshots and download the 64 bit .deb (For Debian/Ubuntu).  Once you select the right version, go ahead and click on Accept and Install. Go to the directory where this package is downloaded, in my case, it is downloaded within my Downloads directory. Click on the file twice so it opens up in the Software Center where you will see a green Install button. Click that. Again, click on Install. After following along, complete the authentication by putting in your password. After installation is done, go to apps and search for ‘Google Chrome’. You can click on it to open it and then you can start using it.  Method 2: Installing Google Chrome via Terminal Update Package Information Updating package information is easy, run the update command:  sudo apt update Download Chrome with wget Use the wget utility to download Chrome from the provided URL: wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb This URL is the external source from where you can acquire the stable version of Chrome. Chrome is now downloaded but not yet installed. Install Chrome using dpkg To install this package you need to use the Debian package manager dpkg with the -i flag which indicates the installation. sudo dpkg -i google-chrome-stable_current_amd64.deb Fix Dependency Errors During our procedure, we didn’t come across any dependency error, if you face any then you can use the following command: sudo apt install -f Or: sudo apt-get install -f Run Google Chrome You can either open the browser from GUI or you can run this command and open the browser from within the terminal: google-chrome-stable Method 3: Installing Beta or Unstable Versions of Google Chrome Installing Google Chrome Beta Some developers get super excited when it comes to testing the versions of different products before the general public. If you are one of them, you can install Google Chrome’s beta version. Download Beta Google Chrome  Use wget with the direct URL pointing to an external source from where you can download the beta package of the browser: wget https://dl.google.com/linux/direct/google-chrome-beta_current_amd64.deb Install Beta Google Chrome sudo dpkg -i google-chrome-beta_current_amd64.deb If dependency errors pop up, just use the command shown in Method 2. Run Beta Google Chrome  Open beta version using terminal: google-chrome-beta The beta version of this browser runs smoothly without any issues, if you see any warnings in the terminal simply ignore it and you can use the beta version without any hassle.  Install Unstable Google Chrome If you are someone who likes to do testing way in advance and you are okay with multiple crashes, you can install Unstable Google Chrome.  Unstable Google Chrome has feature access before Beta Chrome. Main difference between Beta Google Chrome and Unstable Google Chrome is that Beta is updated every 4 weeks while Unstable is updated every day. Download Unstable Google Chrome  wget https://dl.google.com/linux/direct/google-chrome-unstable_current_amd64.deb Install Unstable Google Chrome sudo dpkg -i google-chrome-unstable_current_amd64.deb Run Unstable Google Chrome google-chrome-unstable Unstable versions of Chrome run smoothly, warnings or errors might pop up but you can ignore those, it works ok.  Additional Tips As Ubuntu’s default repository does not have Chrome due to proprietary rights, Google Chrome creates its own repo in your system and it updates each time you update your default repository. sudo apt update && sudo apt upgrade Conclusion A vast number of Linux users prioritize their privacy and prefer open-source products. If this is you, you might be aware that Google Chrome is a proprietary product and is owned by Alphabet (parent company of Google) which means it's not open source. If you are looking for something similar and also open source then Chromium is a great browser to consider. Google Chrome came with the concept of extensions and Google enabled them by default in 2009. These extensions extended the performance of the Chrome web browser and offered additional options to accomplish many things in much easier ways than previously. The main thing that really made Chrome “The King of The Market” was its speed and the ability to get updates for new versions. Google Chrome was able to fix issues much faster than competitors and users had a fine way to access all Google Products in one place.  The birth of the Chrome browser was the result of the problems Google workers faced with the browsers in the market at the time. They created a ‘Just Built For Them’ product which was actually what was needed in the market. Internet Explorer was the most used browser at the time but it was slow. It took Google Chrome just a few years to beat Internet Explorer in the market and in the upcoming decade, it completely wiped it off. 
23 May 2025 · 5 min to read
Apache

How to Install Let’s Encrypt with Apache

In the current environment of the internet, the use of HTTPS to secure web traffic is a must. With a free and automated Certificate Authority (CA) service like Let’s Encrypt, adoption of SSL/TLS has changed dramatically because you can quickly obtain trusted certificates at no cost. This guide will walk you through installing a Let’s Encrypt certificate on an Apache web server running Ubuntu 22.04 (Jammy Jellyfish). You will configure Certbot (the official Let’s Encrypt client), set up renewal procedures, and establish good security practices. Prerequisites Before proceeding, ensure you have: An Ubuntu 22.04 system. Update it with: sudo apt updatesudo apt upgrade Apache Installed: Confirm with apache2 -v. If not present, install via: sudo apt updatesudo apt install apache2 A registered domain (e.g., example.com) pointing to your server’s public IP. Check with: ping example.com Firewall Configured: Allow HTTP/HTTPS traffic: sudo ufw allow 'Apache Full'sudo ufw enable   Sudo Privileges: Access to a user account with administrative rights. Step 1: Installing Certbot via Snap Let’s Encrypt recommends using Certbot through Snap for seamless updates. Ubuntu 22.04 includes Snap by default, but make sure it’s updated: sudo snap install coresudo snap refresh core Install Certbot: sudo snap install --classic certbot Create a symbolic link to the Certbot binary for easy access: sudo ln -s /snap/bin/certbot /usr/bin/certbot Step 2: Generating SSL Certificate with Certbot Certbot integrates with Apache to automate certificate issuance and configuration. Run: sudo certbot --apache Follow the interactive prompts: Email Address: Enter for urgent renewal notifications. Terms of Service: Accept by typing A. Domain Selection: Choose the domain(s) to secure (e.g., example.com, www.example.com). HTTP to HTTPS Redirect: Select 2 to enforce HTTPS universally. Certbot will: Generate certificates in /etc/letsencrypt/live/exple.com/. Modify virtual host files to activate SSL. Reload Apache to apply changes. Step 3: Verifying Apache Configuration Certbot updates automatically your configuration. Inspect the virtual host file for your domain: sudo nano /etc/apache2/sites-available/example.com-le-ssl.conf Look for directives like: SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pemSSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pemInclude /etc/letsencrypt/options-ssl-apache.conf Ensure the SSL module is enabled: sudo a2enmod sslsudo systemctl restart apache2 Step 4: Testing SSL/TLS Configuration Validate your setup: Visit https://example.com. Look for the padlock icon. Use curl to check headers: sudo apt install curlcurl -I https://example.com Confirm HTTP/2 200 or HTTP/1.1 200 OK. Run a free analysis at SSL Server Test to discover vulnerabilities. Step 5: Automating Renewal Let’s Encrypt certificates expire every 90 days. Certbot automates renewal via a systemd timer. Test renewal manually: sudo certbot renew --dry-run If successful, Certbot’s timer will handle future renewals. Verify the timer status: systemctl list-timers | grep certbot Troubleshooting Common Issues Port Blocking: Ensure ports 80 and 443 are open: sudo ufw status Incorrect Domain Resolution: Verify DNS records with: dig example.com Configuration Errors: Check logs via: sudo journalctl -u apache2 Certificate Renewal Failures: Inspect Certbot logs at /var/log/letsencrypt/. Advanced Configurations Enforcing HTTPS with HSTS Add the Strict-Transport-Security header to your SSL config: sudo a2enmod headerssudo systemctl restart apache2 Then in the Apache config (/etc/apache2/apache2.conf) configure: Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" Redirecting HTTP to HTTPS Certbot usually handles this, but manually update non-SSL virtual hosts: <VirtualHost *:80> # Define the primary domain name for this virtual host ServerName example.com # Redirect all HTTP traffic to HTTPS permanently (status code 301) # This ensures users always access the site securely Redirect permanent / https://example.com/ </VirtualHost> Optimizing Cipher Suites Edit /etc/letsencrypt/options-ssl-apache.conf to prioritize strong ciphers: SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDHSSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 To further enhance your Apache and Let’s Encrypt setup, consider implementing the following advanced optimizations. These steps will not only improve security but also ensure your server performs efficiently under high traffic and adheres to modern web standards. Implementing OCSP Stapling Online Certificate Status Protocol (OCSP) stapling improves SSL/TLS performance by allowing the server to provide proof of validity, reducing client-side verification delays. Enable OCSP stapling in your configuration (/etc/apache2/apache.conf): SSLUseStapling onSSLStaplingCache "shmcb:logs/stapling-cache(150000)" After making these changes, restart the web server: sudo systemctl restart apache2 Verify OCSP stapling is working: openssl s_client -connect example.com:443 -status -servername example.com Look for OCSP Response Status: successful in the output. Configuring HTTP/2 for Improved Performance HTTP/2 enhances web performance by enabling multiplexing, header compression, and server push. To enable HTTP/2 in Apache, first ensure the http2 module is enabled: sudo a2enmod http2 Then, add the following directive to your SSL virtual host: Protocols h2 http/1.1 Restart Apache to apply the changes: sudo systemctl restart apache2 Verify HTTP/2 is active by inspecting the response headers using browser developer tools or a tool like curl: curl -I -k --http2 https://example.com Setting Up Wildcard Certificates If you manage multiple subdomains, a wildcard certificate simplifies management. To obtain a wildcard certificate with Certbot, use the DNS challenge method. First, install the DNS plugin for your DNS provider (e.g., Cloudflare): sudo snap set certbot trust-plugin-with-root=ok sudo snap install certbot-dns-cloudflare Install pip and the cloudflare package: sudo apt updatesudo apt install python3-pipsudo pip install cloudflare Create a credentials file for your DNS provider: sudo nano /etc/letsencrypt/cloudflare.ini Add your API credentials: dns_cloudflare_api_token = your_api_key Secure the file: sudo chmod 600 /etc/letsencrypt/cloudflare.ini Request the wildcard certificate: sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini -d example.com -d *.example.com Update your configuration to use the wildcard certificate. Monitoring and Logging SSL/TLS Usage Regularly monitoring SSL/TLS usage helps identify potential issues and enhance performance. Apache’s mod_ssl module provides detailed logs. Enable logging by integrating the following to your SSL virtual host configuration: LogLevel info ssl:warnCustomLog ${APACHE_LOG_DIR}/ssl_access.log combinedErrorLog ${APACHE_LOG_DIR}/ssl_error.log Analyze logs for errors or unusual activity: sudo tail -f /var/log/apache2/ssl_error.log For advanced monitoring, consider tools like GoAccess or ELK Stack to visualize traffic patterns and SSL/TLS performance. Enhancing Security with Security Headers Adding security headers to your configuration can protect your site from common vulnerabilities like cross-site scripting (XSS) and clickjacking. Include the following directives in your virtual host file: Header set X-Content-Type-Options "nosniff"Header set X-Frame-Options "DENY"Header set X-XSS-Protection "1; mode=block"Header set Content-Security-Policy "default-src 'self';" These headers make sure that browsers enforce strict security policies, minimizing the risk of attacks. Final Thoughts Securing your Apache as of Ubuntu 22.04 using Let's Encrypt is a must-do to create a trusted quality web presence. In this tutorial, we have learned how to fine-tune some of the advanced configuration options, such as OCSP stapling, HTTP/2, wildcard certificates, as well as monitoring and security headers. These configurations will help you protect your server while increasing its efficiency and scalability. Note that web security is an ongoing process! Stay informed about new and developing threats, updated SSL/TLS standards, and audit your setup and logs regularly to maintain your server security after securing it.
27 March 2025 · 7 min to read
Docker

How To Install and Use Docker Compose on Ubuntu

Docker Compose has fundamentally changed how developers approach containerized applications, particularly when coordinating services that depend on one another. This tool replaces manual container management with a structured YAML-driven workflow, enabling teams to define entire application architectures in a single configuration file.  For Ubuntu environments, this translates to reproducible deployments, simplified scaling, and reduced operational overhead. This guide provides a fresh perspective on Docker Compose installation and usage, offering deeper insights into its practical implementation. Prerequisites Before you begin this tutorial, you'll need a few things in place: Deploy an Ubuntu cloud server instance on Hostman. Ensure you have a user account with sudo privileges or root access. This allows you to install packages and manage Docker. Install Docker and have it running on your server, as Docker Compose works on top of Docker Engine. Why Docker Compose Matters Modern applications often involve interconnected components like APIs, databases, and caching layers. Managing these elements individually with Docker commands becomes cumbersome as complexity grows. Docker Compose addresses this by allowing developers to declare all services, networks, and storage requirements in a docker-compose.yml file. This approach ensures consistency across environments—whether you’re working on a local Ubuntu machine or a cloud server. For example, consider a web application comprising a Node.js backend, PostgreSQL database, and Redis cache. Without Docker Compose, each component requires separate docker run commands with precise networking flags. With Compose, these relationships are organized once, enabling one-command setups and teardowns. Docker Compose Installation Follow these steps to install Docker Compose on your Ubuntu machine: Step 1: Verify that the Docker Engine is Installed and Running Docker Compose functions as an extension of Docker, so verify its status with: sudo systemctl status docker Example output: ● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2025-02-20 08:55:04 GMT; 5min ago TriggeredBy: ● docker.socket Docs: https://docs.docker.com Main PID: 2246435 (dockerd) Tasks: 9 Memory: 53.7M CPU: 304ms CGroup: /system.slice/docker.service └─2246435 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock If inactive, start it using sudo systemctl start docker. Step 2: Update System Packages Refresh your package lists to ensure access to the latest software versions: sudo apt-get update You will see: Hit:1 https://download.docker.com/linux/ubuntu jammy InRelease Hit:2 http://archive.ubuntu.com/ubuntu jammy InRelease Hit:4 http://security.ubuntu.com/ubuntu jammy-security InRelease Hit:5 http://repo.hostman.com/ubuntu focal InRelease Hit:6 http://archive.ubuntu.com/ubuntu jammy-updates InRelease Hit:7 http://archive.ubuntu.com/ubuntu jammy-backports InRelease Hit:3 https://prod-cdn.packages.k8s.io/repositories/isv:/kubernetes:/core:/stable:/v1.31/deb InRelease Hit:8 https://packages.redis.io/deb jammy InRelease Reading package lists... Done Step 3: Install Foundational Utilities Secure communication with Docker’s repositories requires these packages: sudo apt-get install ca-certificates curl  Step 4: Configure Docker’s GPG Key Authenticate Docker packages by adding their cryptographic key: sudo install -m 0755 -d /etc/apt/keyringssudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.ascsudo chmod a+r /etc/apt/keyrings/docker.asc This step ensures packages haven’t been altered during transit. Step 5: Integrate Docker’s Repository Add the repository tailored to your Ubuntu version: echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null The command auto-detects your OS version using VERSION_CODENAME. Step 6: Install the Docker Compose Plugin Update repositories and install the Compose extension: sudo apt updatesudo apt-get install docker-compose-plugin Step 7: Validate the Installation Confirm successful setup with: docker compose version The output displays the Docker Compose version: Docker Compose version v2.33.0 Building a Practical Docker Compose Project Let’s deploy a web server using Nginx to demonstrate Docker Compose’s capabilities. Step 1. Initialize the Project Directory Create a dedicated workspace: mkdir ~/compose-demo && cd ~/compose-demo Step 2. Define Services in docker-compose.yml Create the configuration file: nano docker-compose.yml Insert the following content: services: web: image: nginx:alpine ports: - "8080:80" volumes: - ./app:/usr/share/nginx/html In the above YAML file: services: Root element declaring containers. web: Custom service name. image: Uses the Alpine-based Nginx image for reduced footprint. ports: Maps host port 8080 to container port 80. volumes: Syncs the local app directory with the container’s web root. Step 3. Create Web Content Build the HTML structure: mkdir app nano app/index.html Add this HTML snippet: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Docker Compose Test</title> </head> <body> <h1>Hello from Docker Compose!</h1> </body> </html> Orchestrating Containers: From Launch to Shutdown Let’s explore how you can use Docker Compose for container orchestration: Start Services in Detached Mode Launch containers in the background: docker compose up -d Example output: [+] Running 2/2 ✔ Network compose-demo_default Created ✔ Container compose-demo-web-1 Started Docker Compose automatically pulls the Nginx image if missing and configures networking. Verify Container Status Check operational containers: docker compose ps -a Access the Web Application Visit http://localhost:8080 locally or http://<SERVER_IP>:8080 on remote servers. The test page should display your HTML content. Diagnose Issues via Logs If the page doesn’t load or if you encounter any issues, you can inspect container logs: docker compose logs web Example output: web-1 | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration web-1 | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ web-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh web-1 | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf web-1 | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf web-1 | /docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh … Graceful Shutdown and Cleanup Stop containers temporarily: docker compose stop Example output: [+] Stopping 1/1 ✔ Container compose-demo-web-1  Stopped Remove all project resources: docker compose down Example output: [+] Running 2/2 ✔ Container compose-demo-web-1  Removed ✔ Network compose-demo_default  Removed Command Reference: Beyond Basic Operations While the workflow above covers fundamentals, these commands enhance container management: docker compose up --build: Rebuild images before starting containers. docker compose pause: Freeze containers without terminating them. docker compose top: Display running processes in containers. docker compose config: Validate and view the compiled configuration. docker compose exec: Execute commands in running containers (e.g., docker compose exec web nginx -t tests Nginx’s configuration). Conclusion Docker Compose transforms multi-container orchestration from a manual chore into a streamlined, repeatable process. By adhering to the steps outlined—installing Docker Compose, defining services in YAML, and leveraging essential commands—you can manage complex applications with confidence.
26 February 2025 · 7 min to read

Do you have questions,
comments, or concerns?

Our professionals are available to assist you at any moment,
whether you need help or are just unsure of where to start.
Email us
Hostman's Support