Docker: Semudah dibina, dijalankan, selesai!

Docker mendapat banyak kegembiraan baru-baru ini, dan untuk alasan yang baik. Perkhidmatan kemasukan membuat penyebaran perkhidmatan mikro mudah dan stabil, kerana setiap perkhidmatan dapat menjalankan OS di persekitaran maya sendiri. Itu bermaksud keserasian penuh ... tidak perlu lagi risau tentang versi OS, kebergantungan dan perbezaan antara mesin pengembangan dan pengeluaran anda! Dan untuk menambahnya, ia ringan sehingga anda dapat menjalankan beberapa bekas Docker dalam mesin yang sama (contoh EC2). Hari ini kita akan belajar bagaimana menyediakan dan menggunakan Docker di Amazon EC2 dalam 3 langkah mudah!

Sebelum kita mulakan, lihat rajah tahap tinggi ini (ihsan infoworld.com).

Di sebelah kiri adalah persediaan mesin maya tradisional anda menggunakan hypervisor. Pengawas adalah pengurus VM anda yang bertanggungjawab untuk memperuntukkan sumber perkakasan ke setiap OS maya. Sekiranya setiap OS Tetamu memerlukan memori 1GB, dan host menggunakan memori 1GB, maka penyediaan di sebelah kiri memerlukan jumlah keseluruhan 4GB.

Di sebelah kanan adalah penyediaan kontena, yang akan menjalankan mesin kontena seperti Docker. Perbezaan yang paling ketara ialah mesin kontena lebih ringan kerana dapat berkongsi sumber perkakasan tertentu dengan OS hosnya, tidak seperti VM tradisional yang memerlukan peruntukan tersendiri. Penyediaan ini memerlukan 1GB untuk OS hos dan mungkin 600MB setiap bekas (kerana 300MB dikongsi secara hipotesis dengan OS hos), dengan jumlah 2.8GB diperlukan. Lihat faedahnya? Hebat, sekarang kita boleh mulakan!

Bermula

Masukkan contoh EC2 anda dan klon Kangzeroos-ES6-React-Redux-Boilerplate dari Github. Kod yang anda lihat adalah untuk menyiapkan aplikasi web ini, tetapi langkahnya sama untuk setiap projek. Setelah memuat turun, masuk ke folder dan cari fail di bawah. Ini adalah fail yang akan kami gunakan dengan Docker.

Dockerfile build.sh run.sh

Sebelum kita dapat menggunakan Docker, kita mesti memasangnya terlebih dahulu. Di bawah adalah cara cepat dan mudah untuk memasang Docker, tetapi jika anda mahukan konfigurasi lengkap, lihat dokumen rasmi.

$ sudo apt-get update $ sudo apt-get install docker-engine $ sudo service docker start $ sudo docker run hello-world

Perintah terakhir memeriksa sama ada Docker berjaya dijalankan, dan kemudian keluar. Sekiranya semua ini berjaya, anda sudah bersedia untuk memulakan Dockerizing!

Langkah 1: Membina Dockerfile

Langkah pertama adalah mengkonfigurasi fail yang diperlukan untuk Docker untuk membina gambarnya sendiri. Docker Images hanyalah cetak biru persekitaran yang ingin anda buat sedangkan kontena adalah persekitaran sebenar yang berfungsi dan berfungsi di mana aplikasi anda akan dijalankan. Di root direktori aplikasi kami, ada folder yang disebut App. Aplikasi web itu sendiri berada di Appfolder ini , sedangkan semua barang yang berkaitan dengan Docker ada di luar. Ini perlu kerana Docker akan menyimpan semua yang ada di dalamnya App. Oleh itu, mari buat fail Docker pertama yang disebut Dockerfile(tidak ada peluasan fail Dockerfile.sh, Dockerfile) dan ikuti garis demi baris.

FROM ubuntu # ubuntu setup RUN apt-get update -y RUN apt-get upgrade -y RUN apt-get install nodejs -y && apt-get install npm -y # install curl for n RUN apt-get install curl -y RUN apt-get install vim -y # obtain latest stable version of node RUN npm cache clean -f RUN npm install -g n RUN n stable # setup working directory # ADD /App /App WORKDIR /App RUN npm install # expose port EXPOSE 8080

Baris pertama ialah FROM ubuntu. Tujuannya Dockerfileadalah untuk mengatur OS dan program di dalam OS, jadi masuk akal bahawa baris pertama menentukan versi OS yang akan digunakan. ubuntudi sini merujuk kepada gambar tertentu yang dihoskan di Docker Hub, khususnya Imej OS Ubuntu rasmi.

# ubuntu setup RUN apt-get update -y RUN apt-get upgrade -y RUN apt-get install curl -y RUN apt-get install vim -y

Kumpulan baris seterusnya adalah persediaan dalam Ubuntu. Kami ingin memeriksa kemas kini Ubuntu dengan RUN apt-get update -ydan peningkatan dengan RUN apt-get upgrade -y... barang standard yang cukup untuk mengatur persekitaran anda. Pasang juga curl RUN apt-get install curl -ydan vim RUN apt-get install vim -y, keduanya bagus untuk tujuan umum.

# obtain latest stable version of node RUN apt-get install nodejs -y && apt-get install npm -y RUN npm cache clean -f RUN npm install -g n RUN n stable

Kumpulan baris seterusnya adalah persediaan khusus untuk NodeJS. Oleh kerana kami ingin menggunakan ciri ES6, kami memerlukan versi terbaru NodeJS yang dicapai melalui modul nod n. Pasang NodeJS dan NPM dengan RUN apt-get install nodejs -y && apt-get install npm -y. Kemudian bersihkan npm untuk memberi laluan kepada npenggunaan RUN npm cache clean -f. Pasang ndengan RUN npm install -g n. Dan akhirnya, kita dapat menjalankan n(versi terbaru NodeJS) dengan RUN n stable.

NodeJS adalah untuk Javascript, tetapi jika anda menggunakan bahasa lain seperti Python, anda akan memasang program apa sahaja yang anda perlukan untuk menjalankan aplikasi Python anda.

# setup working directory ADD /App /App WORKDIR /App RUN npm install # expose port EXPOSE 8080

Bahagian terakhir Dockerfileadalah menyediakan direktori aplikasi yang berfungsi. ADD /App /Appmengambil Appfolder dari mesin kami dan menyalinnya ke dalam bekas Docker. Seterusnya, WORKDIR /Apptetapkan direktori kerja Docker /Appsehingga setiap perintah yang anda jalankan di dalam Docker dijalankan /App. Ini diperlukan untuk npm installdipasang di tempat yang betul (aka /Appbekas Docker).

Akhirnya, kami RUN npm installyang memasang kebergantungan NodeJS di mesin kami. Akhir sekali, kami akan secara eksplisit memaparkan port 8080 gambar Docker kami EXPOSE 8080sehingga dunia luar dapat mengakses aplikasi kami. Dunia luar merangkumi internet serta kontena Docker lain yang berjalan di mesin yang sama.

Langkah 2: Skrip binaan

docker build -t kangzeroo .

Buat fail baru di direktori root aplikasi anda yang dipanggil build.sh. Ini adalah fail shell untuk membina bekas Docker kami. Ini build.shfail tidak sebenarnya perlu kerana kita boleh terus menjalankan perintah ini dalam terminal. Walau bagaimanapun, sangat bagus untuk mempermudah prosesnya.

Inilah pecahan baris ini: docker buildadalah arahan yang menyuruh Docker membina gambar. -t kangzeroomenetapkan nama tag gambar Docker kangzeroo, yang boleh kita rujuk kemudian. Harap tidak, agar dapat memiliki nama tag yang sah, nama tersebut harus ditulis dengan huruf kecil dan tidak memiliki spasi (gunakan penamaan kotak ular). Akhirnya, .memberitahu Docker di mana untuk mencari Dockerfileyang diperlukan untuk membina ( .bermaksud di sini).

Sekiranya anda berada dalam contoh EC2, kami dapat menjalankan bash build.shdari direktori root projek kami. Ini akan memulakan proses membina Docker ketika melalui langkah-langkah dalam yang Dockerfilekita buat. Ini mungkin memerlukan sedikit masa ... pada akhirnya ia akan kelihatan seperti ini: (Jangan bimbang tentang kesalahan tidak kritikal seperti kebergantungan pilihan yang dilangkau pada tangkapan skrin di bawah).

Sekarang mari kita periksa sama ada gambar kita telah dibuat. Ketik docker imagesuntuk melihat gambar yang sedang berjalan di mesin kami. Anda akan melihat hasil seperti ini:

Sekiranya kita mahu memadamkan gambar ini, ketik saja docker rmi kangzeroo. Sekiranya anda menaip docker imageslagi setelah memadam, anda akan melihat bahawa gambar tidak lagi ada. Buat masa ini, mari tinggalkan gambar kerana kami akan menggunakannya untuk membina wadah Docker agar aplikasi kami dapat berjalan.

Langkah 3: Skrip larian

Now that our image has been created, let’s make run.sh. Recall that Docker Images are simply blueprints of environments that you want to create. Containers are the actual running and functional environments that your app will be executed in. So run.sh will turn our images into containers. Here is what run.sh looks like:

docker run -d -it -p 80:8080 --name=kz kangzeroo npm run ec2 -- --host=0.0.0.0

Let’s walkthrough this short script. docker run is the command to run a container from an image. -d -it is the command for daemon (running tasks in the background) and interactive terminal (giving us a way to interact with the container). If you omit -d then the docker container will not run in the background and you will see log output from the app. -p 80:8080 maps port 80 of our machine to port 8080 of the container. Recall that earlier we specified EXPOSE 8080 in our Dockerfile. So now we take incoming connections on our machine’s port 80 (port 80 is the default for http) and redirect them to our container’s port 8080. If your app is not a webpage, then you can exclude this port mapping.--name=kz gives our container the name kz. Finally, kangzeroo npm run ec2 refers to our image called kangzeroo and npm run ec2 is a command specific to this boilerplate app (for starting up the app). The last part — — host=0.0.0.0 sets the boilerplate to run on 0.0.0.0 instead of localhost (This too is specific to the boilerplate). If you were running a Python backend app, it would look like docker run -d -it --name=kz kangzeroo python app.py.

Great! Save this file and run it with bash run.sh. Then check if the container is running by typing docker ps -a. This is what it should look like:

Your app is now online and running inside a Docker container! Check if it works… for this boilerplate you can check from a web browser.

And it’s working! Great, now let’s turn off our Docker container. Type docker ps -a to see all the containers again. Type docker stop kz and it stops the container. If you type docker ps you will not see the container anymore, but you will see it if you type docker ps -a ( -a means all, inclusive of running and not running container. omit -a if you only want to see running containers). To remove the container, type docker rm kz. If you type docker ps -a you won’t see the container anymore.

Conclusion

Itu Docker! Semua perkara yang dipertimbangkan, Docker jauh lebih mudah daripada membuat VM berasaskan hypervisor, dan anda dapat melihat bagaimana seni bina perkhidmatan mikro menjadi lebih mudah diuruskan ketika anda menggunakan kontena. Dengan kami Dockerfile, build.shdan run.shfail yang dibuat dalam EC2, kami dapat meringkaskan 3 langkah menjalankan Docker dari direktori root aplikasi kami:

$ bash build.sh $ bash run.sh $ exit

Itu sahaja! Docker: semudah dibina, dijalankan, selesai!

Cheatsheet Bonus

Oleh kerana tutorial ini mengambil pendekatan langkah demi langkah untuk mengajar Docker, saya rasa wajar untuk meninggalkan anda dengan gambaran keseluruhan semua perintah Docker yang anda perlukan untuk penggunaan tujuan umum.

$ docker images // To view install images $ docker rmi  // To remove an installed image $ docker ps -a // To view all docker containers $ docker stop  // To stop a docker container $ docker rm  // To remove a docker container $ docker exec -it  bash // Execute into container and run bash * If you want to see the log output from a docker container, omit the -d from run.sh
Kaedah ini sebahagiannya digunakan dalam penyebaran renthero.ca