Cara Deploy NGINX di AWS EC2 Menggunakan Docker
Pelajari cara deploy NGINX dengan Docker di AWS EC2 secara lengkap. Panduan pemula ini mencakup konfigurasi EC2 instance, instalasi Docker, implementasi Docker volumes untuk data persistence, dan pembuatan custom Dockerfile.
Pendahuluan
Docker telah merevolusi cara pengembangan dan deployment aplikasi dengan teknologi containerization yang memungkinkan pengemasan kode aplikasi beserta seluruh dependensinya dalam lingkungan yang terisolasi dan portabel. Kontainer Docker menjamin konsistensi operasional di berbagai lingkungan komputasi, dari development hingga production, sekaligus menyediakan efisiensi resource yang superior dibanding virtual machine tradisional.
Integrasi Docker dengan Amazon Web Services (AWS) menciptakan solusi yang powerful untuk deployment aplikasi yang skalabel, resilient, dan cost-effective. Meskipun AWS menyediakan layanan container orchestration seperti Amazon ECS (Elastic Container Service) dan EKS (Elastic Kubernetes Service), pemahaman fundamental tentang deployment Docker pada EC2 instance tetap menjadi keterampilan esensial bagi cloud engineer.
Prasyarat dan Persiapan
Sebelum memulai, pastikan Anda memiliki:
- Akun AWS dengan akses ke layanan EC2
- Basic understanding tentang command line interface
- Pengetahuan dasar tentang konsep networking dan web server
Konfigurasi EC2 Instance yang Optimal
Pemilihan dan Inisialisasi Instance
- Akses AWS Management Console dan navigasi ke layanan EC2
- Pilih Launch Instance dari dashboard
- Pada bagian Application and OS Images, pilih Ubuntu Server sebagai AMI
- Instance Type Selection: Pilih t3.small (recommended) atau t2.small sebagai minimum requirement
- 2 vCPU
- 2 GiB RAM
- Network performance yang memadai untuk workload container
Konfigurasi Security Group dan Network
Key Pair Management:
- Buat new key pair atau gunakan existing key
- Format
.pemuntuk OpenSSH clients - Format
.ppkuntuk PuTTY users
Security Group Configuration: Buka akses untuk port berikut:
- Port 22 (SSH): Untuk remote administration
- Port 80 (HTTP): Untuk web traffic
- Port 443 (HTTPS): Untuk secure web connections (opsional untuk testing)
Untuk environment production, batasi source IP addresses yang dapat mengakses instance melalui security group rules.
Instalasi Docker Engine dengan Konfigurasi Optimal
Persiapan System dan Repository
Sumber: Install Docker Engine on Ubuntu
Update system packages dan install dependencies:
1
2
3
4
5
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
Tambahkan Docker’s official GPG key dan repository:
1
2
3
4
5
6
7
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF
Installation dan Post-Configuration
Install Docker packages:
1
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Konfigurasi Docker untuk startup otomatis dan non-root user access:
1
sudo systemctl enable docker && sudo systemctl start docker && sudo usermod -aG docker $USER
Verifikasi instalasi:
1
2
docker --version
sudo docker run hello-world
Setelah menambahkan user ke docker group, logout dan login kembali untuk menerapkan perubahan permissions.
Implementasi NGINX Container dengan Best Practices
Basic Container Deployment
Pull official NGINX image dari Docker Hub:
1
docker pull nginx:latest
Buat dan jalankan container dengan port mapping:
1
docker run -d --name nginx-container -p 80:80 nginx:latest
Verifikasi container status:
1
2
docker ps
docker logs nginx-container
Custom Content Management
Buat project directory dan custom HTML content:
1
mkdir -p ~/docker-project/html && cd ~/docker-project/html
Buat custom index.html:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Welcome to Docker on AWS</title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 800px;
margin: 0 auto;
padding: 20px;
background-color: #f5f5f5;
}
.container {
background: white;
padding: 30px;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
h1 { color: #333; }
.status { color: #28a745; font-weight: bold; }
</style>
</head>
<body>
<div class="container">
<h1>🚀 Successfully Deployed!</h1>
<p>NGINX is running inside a Docker container on AWS EC2</p>
<p class="status">Status: <span id="status">Active</span></p>
<p><strong>Environment:</strong> Docker on AWS EC2</p>
<p><strong>Container Name:</strong> nginx-container</p>
<p><strong>Timestamp:</strong> <span id="timestamp"></span></p>
</div>
<script>
document.getElementById('timestamp').textContent = new Date().toLocaleString();
</script>
</body>
</html>
Copy file ke running container:
1
docker cp index.html nginx-container:/usr/share/nginx/html/
Implementasi Docker Volumes untuk Data Persistence
Persistent Storage Configuration
Hentikan dan hapus existing container:
1
2
docker stop nginx-container
docker rm nginx-container
Buat directory structure dan content:
1
2
mkdir -p ~/docker-project/web-content
cd ~/docker-project/web-content
Buat updated HTML file:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Docker Volume Demo</title>
<style>
body { font-family: Arial, sans-serif; margin: 40px; }
.volume-demo { color: #dc3545; font-weight: bold; }
</style>
</head>
<body>
<h1>🔗 Docker Volume Implementation</h1>
<p>This content is served via <span class="volume-demo">Docker Volume</span> mounted to the container</p>
<p>Real-time file synchronization is active!</p>
</body>
</html>
Jalankan container dengan volume mounting:
1
2
3
4
docker run -d --name nginx-volume \
-p 80:80 \
-v /home/ubuntu/docker-project/web-content:/usr/share/nginx/html \
nginx:latest
Perubahan pada host directory langsung terefleksi dalam container tanpa perlu rebuild atau restart container.
Otomasi Deployment dengan Dockerfile
Custom Image Creation
Buat Dockerfile untuk automated build:
1
2
cd ~/docker-project
nano Dockerfile
Konten Dockerfile:
1
2
3
4
5
6
7
8
9
10
11
FROM nginx:latest
LABEL maintainer="your-email@example.com"
LABEL description="Custom NGINX image for AWS deployment"
COPY web-content/ /usr/share/nginx/html/
EXPOSE 80
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost/ || exit 1
Build custom Docker image:
1
docker build -t custom-nginx-aws .
Jalankan container dari custom image:
1
docker run -d --name nginx-custom -p 80:80 custom-nginx-aws
Verifikasi deployment:
1
2
3
docker images
docker ps
curl http://localhost
Monitoring dan Maintenance
Basic Container Management Commands
Monitor container performance:
1
2
3
4
5
docker stats nginx-custom
docker logs nginx-custom
docker inspect nginx-custom
Management operations:
1
2
3
4
5
6
7
docker stop nginx-custom
docker start nginx-custom
docker restart nginx-custom
docker rm nginx-custom
Cleanup Operations
Hapus unused resources:
1
2
3
4
5
docker container prune
docker image prune
docker system prune
Best Practices dan Security Considerations
Security Hardening
- Regular Updates:
1 2
sudo apt update && sudo apt upgrade -y docker system prune -a
- Non-Root User:
1
docker run --user 1000:1000 nginx:latest - Resource Limits:
1
docker run -d --memory="512m" --cpus="1.0" nginx:latest
Production Recommendations
- Gunakan Amazon ECR untuk managed container registry
- Implementasikan Application Load Balancer untuk traffic distribution
- Configure CloudWatch untuk monitoring dan logging
- Gunakan IAM roles untuk secure credential management
Troubleshooting Common Issues
Connection Problems
1
2
3
4
5
6
docker ps
docker port nginx-custom
docker network ls
docker network inspect bridge
Permission Issues
1
2
3
sudo chown -R $USER:$USER ~/docker-project
docker exec nginx-custom whoami
Kesimpulan
Implementasi NGINX dalam container Docker pada AWS EC2 memberikan fondasi yang solid untuk deployment aplikasi web yang scalable dan maintainable. Eksperimen ini mendemonstrasikan:
- Isolation dan Portability: Containerization memastikan konsistensi environment across different stages
- Resource Efficiency: Docker containers menggunakan resources lebih efisien dibanding traditional virtualization
- Rapid Deployment: Docker images memungkinkan quick provisioning dan scaling
- DevOps Integration: Dockerfile memfasilitasi CI/CD pipeline implementation
Untuk project production, pertimbangkan menggunakan Amazon ECS atau EKS untuk container orchestration yang lebih robust, serta implementasi security best practices yang komprehensif.
Dengan menguasai fundamental Docker pada AWS EC2 ini, Anda telah membangun foundation yang kuat untuk mengeksplorasi advanced container technologies dan cloud-native application development.





