Tentang aplikasi node ini
Aplikasi ini berisi package.json, server.js, dan file .gitignore, yang cukup sederhana untuk mudah dilakukan.
.gitignore
node_modules/*
package.json
{"Name": "Docker-Dev", "Versi": "0.1.0", "Deskripsi": "Docker Dev", "Dependencies": {"Connect-Redis": "~ 1.4.5", "Express": "~ 3.3.3", "Hiredis": "~ 0.1.15", "Redis": "~ 0.8.8.8.8 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~.server.js
var express = membutuhkan ('express'), app = express (), redis = membutuhkan ('redis'), redisstore = membutuhkan ('connect-redis') (express), server = membutuhkan ('http'). createServer (app); app.configure (function () {app.use (express.cooke-cookiEparser ('Keyboard-c-c-c-c-c-c-c-c-c-c-c-c-c-c-c-c-c-c-c-c-c-c-c-c-c-c-c-c-c-c-c-c-c-c-c-c-corder () Redisstore ({host: process.env.redis_host || 'localhost', port: process.env.redis_port || 6379, db: process.env.redis_db || 0}), cookie: {kedaluwarsa: false, maxage: 30 * 24 * 60 * 60 * 1000} {{{false); res.json ({status: "ok"});}); var port = process.env.http_port || 3000; server.listen (port); console.log ('Mendengarkan di port' + port);Server.js menarik semua dependensi dan meluncurkan aplikasi tertentu. Aplikasi khusus ini diatur untuk menyimpan informasi sesi di Redis dan memperlihatkan titik akhir permintaan yang akan menanggapi pesan status JSON. Ini semua adalah hal yang sangat standar.
Satu hal yang perlu diperhatikan adalah bahwa informasi koneksi untuk REDIS dapat ditulis ulang menggunakan variabel lingkungan - ini akan berperan dalam migrasi kemudian dari lingkungan pembangunan dev ke lingkungan produksi.
File Docker
Untuk kebutuhan pengembangan, kami akan memiliki redis dan node run di wadah yang sama. Untuk melakukan ini, kami akan menggunakan DockerFile untuk mengonfigurasi wadah ini.
Dockerfile
Dari DockerFile / Ubuntuantaintainer Abhinav Ajgaonkar <[email protected]># instal redisrun / apt -get -y -qq instal python redis -server# instal noderun / cd / opt && / wget http://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-x64.tar.gz &&/tar -xzf node-v0.10.28-linux-x64.tar.gz &&/mv node-v0.10.28-linux-linux-- -s/opt/node/bin/*. && /rm -f /opt/node-v0.10.28-linux-x64.tar.gz# Tetapkan direktori kerja yang berfungsi /srccmd [" /bin /bash"]
Mari kita pahami satu per satu,
Dari Dockerfile/Ubuntu
Kali ini, Docker disuruh menggunakan gambar DockerFile/Ubuntu yang disediakan oleh Docker Inc. sebagai gambar benchmark untuk dibangun.
BERLARI /
apt -get -y -qq menginstal python redis -server
Gambar benchmark tidak mengandung apa pun - jadi kita perlu menggunakan apt -get untuk mendapatkan semua yang perlu dijalankan oleh aplikasi. Kalimat ini akan menginstal Python dan Redis-Server. Server Redis diperlukan karena kami akan menyimpan informasi sesi ke dalamnya, dan perlunya Python adalah bahwa ia dapat dibangun ke dalam ekstensi C yang diperlukan oleh modul Node Redis melalui NPM.
Jalankan /cd /opt && /wget http://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-x64.tar.gz && /tar -xzf node-v0.10.28-linux-x64.tar.gz & & mv node-node node-node noode.28-linux-x64.tar.gz & & mv node node NODE.28.2884.tar.gz & mV NODE /MV NODE /MV NODE /MV NODE /MV NODE /MV NODE /MV NOD /MV mv node-v0.10.28-linux-x64 node &&/cd/usr/local/bin &&/ln -s/opt/node/bin/*. && /rm -f /opt/node-v0.10.28-linux-x64.tar.gz
Ini mengunduh dan mengekstrak biner nodej 64-bit.
WorkDir /SRC
Kalimat ini akan memberi tahu Docker bahwa begitu wadah telah dimulai, ia harus melakukan CD /SRC sekali sebelum menjalankan hal -hal yang ditentukan oleh properti CMT.
Cmd ["/bin/bash"]
Sebagai langkah terakhir, jalankan /bin /bash.
Bangun dan Jalankan Kontainer
Sekarang file Docker ditulis, mari kita bangun gambar Docker.
Docker Build -t Sqldump/Docker -Dev: 0.1.
Setelah gambar dibangun, kita dapat menjalankan wadah menggunakan pernyataan berikut:
Docker run -i -t --rm / -p 3000: 3000 / -v `pwd`: / src / sqldump / docker -dev: 0.1
Mari kita lihat apa yang terjadi di perintah Docker Run.
-Saya akan memulai wadah dalam mode interaktif (dibandingkan dengan -D dalam mode terpisah). Ini berarti bahwa begitu sesi interaktif selesai, wadah akan keluar.
-T akan menetapkan pseudo-tty.
--RM akan menghapus wadah dan sistem file saat keluar.
-P 3000: 3000 akan meneruskan port 3000 pada host ke port 3000 pada wadah.
-v `pwd`:/src
Kalimat ini akan memasang direktori kerja saat ini ke /SRC di wadah host (misalnya, file proyek kami). Kami menggantung direktori saat ini sebagai volume alih -alih menggunakan perintah add di DockerFile, sehingga modifikasi apa pun yang kami buat di editor teks dapat segera terlihat di wadah.
SQLDUMP/DOCKER-DEV: 0.1 adalah nama dan versi gambar Docker yang akan dijalankan. Ini sama dengan nama dan versi yang kami gunakan untuk membangun gambar Docker.
Karena DockerFile menentukan CMD ["/bin/Bash"], segera setelah wadah dimulai, kami akan masuk ke lingkungan Bash Shell. Jika perintah Docker Run berhasil dieksekusi, itu akan terlihat seperti berikut:
Mulai pengembangan
Sekarang wadah sedang berjalan, sebelum kita mulai menulis kode, kita perlu memilah beberapa hal standar yang tidak berhubungan dengan non-docker. Pertama, kita perlu menggunakan pernyataan berikut untuk memulai server Redis di wadah:
Layanan Redis-Server Start
Kemudian, instal dependensi proyek dan nodemon. Nodemon mengamati perubahan dalam file proyek dan memulai kembali server tepat waktu.
npm installnpm instal -g nodemon
Akhirnya, mulailah server dengan perintah berikut:
nodemon server.js
Sekarang, jika Anda menavigasi ke http: // localhost: 3000 di browser Anda, Anda harus melihat sesuatu seperti ini:
Mari tambahkan titik akhir lain seperti server.js untuk mensimulasikan proses pengembangan:
app.get ('/hello/: name', function (req, res) {res.json ({hello: req.params.name});});Anda akan melihat bahwa Nodemon telah mendeteksi perubahan yang Anda buat dan memulai kembali server:
Dan sekarang, jika Anda menavigasi browser Anda ke http: // localhost: 3000/hello/world, Anda akan melihat tanggapan berikut:
Lingkungan produksi
Wadah dalam keadaan saat ini masih jauh dari dirilis sebagai produk. Data di Redis tidak akan lagi gigih saat memulai kembali di seluruh wadah. Misalnya, jika Anda memulai kembali wadah, semua data sesi akan dimusnahkan. Hal yang sama akan terjadi ketika Anda menghancurkan wadah dan membuka wadah baru, yang jelas bukan yang Anda inginkan. Saya akan membicarakan masalah ini dalam konten yang diproduksi dari bagian kedua.