Sử dụng Docker trong Vagant

Trong các bài viết trước chúng tôi đã giới thiệu các bạn Vagrant và Docker là gì rồi, vì vậy trong bài viết này tôi sẽ hướng dẫn làm thế nào chạy Docker trong Vagrant.

Chuẩn Bị

Trước hết máy bạn cần phải cài đặt Vagrant nếu chưa có các bạn có thể download tại đây ngoài ra bạn cần phải cài đặt Docker. Kế đến bạn tạo một thư mục có tên là vagrant-docker

Chúng tôi sẽ tạo lần lượt hai tập tin là Vagrantfile và Dockerfile với nội dung bên dưới như sau:

[bash] #Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don’t touch unless you know what you’re doing!
VAGRANTFILE_API_VERSION = "2"
#Check if you have the good Vagrant version to use docker provider…
Vagrant.require_version ">= 1.6.0"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# All Vagrant configuration is done here. The most common configuration
# options are documented and commented below. For a complete reference,
# please see the online documentation at vagrantup.com.

ENV[‘VAGRANT_DEFAULT_PROVIDER = ‘docker’

config.vm.provider "docker" do |d|
d.build_dir = "."
d.has_ssh = true
end
config.ssh.port = 22
end

[/bash]

để cho Vagrant hiểu là provison là Docker bạn cần gán biến provison VAGRANT_DEFAULT_PROVIDER là docker, kế đến chúng tôi chỉ Vagrant rằng tập tin Dockerfile nằm cùng cấp thư mục với
tập tin Vagrantfile thông qua hàm build_dir, các tham số còn lại khá đơn giản nên tôi không cần giải thích thêm, để tìm hiểu đầy đủ các tham số của Vagrant cho Docker bạn xem tại đây

Và nội dung tập tin Dockerfile như sau:

[bash] FROM ubuntu
MAINTAINER "Thien Tran" <[email protected]>
ENV container docker

RUN apt-get update && apt-get install -y \
git \
libxml2-dev \
python \
build-essential \
make \
gcc \
python-dev \
locales \
python-pip
#

ENV DEBIAN_FRONTEND noninteractive
ENV MYSQL_PASSWORD root

#Adding shell scripts
ADD scripts/mysql.sh /tmp/mysql.sh
ADD scripts/nginx.sh /tmp/nginx.sh
ADD scripts/php.sh /tmp/php.sh
ADD scripts/phalcon.sh /tmp/phalcon.sh

RUN chmod 755 /tmp/*.sh

#Install Nginx
RUN ./tmp/nginx.sh

#install php-fpmvag
RUN ./tmp/php.sh

#install mysql
RUN ./tmp/mysql.sh

#install phalcon
RUN ./tmp/phalcon.sh

##Setup ssh
RUN apt-get install -yqq openssh-server
RUN mkdir -p /var/run/sshd
RUN chmod 0755 /var/run/sshd

# Create and configure vagrant user
RUN useradd –create-home -s /bin/bash vagrant
WORKDIR /home/vagrant

# Configure SSH access
RUN mkdir -p /home/vagrant/.ssh
RUN echo "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key" > /home/vagrant/.ssh/authorized_keys
RUN chown -R vagrant: /home/vagrant/.ssh
RUN echo -n ‘vagrant:vagrant’ | chpasswd

# Enable passwordless sudo for the "vagrant" user
RUN echo ‘vagrant ALL=(ALL) NOPASSWD: ALL’ > /etc/sudoers.d/vagrant
CMD /usr/sbin/sshd -D -o UseDNS=no -o UsePAM=no

EXPOSE 80, 22

# Copy site into place.
ADD www /usr/share/nginx/html

#CMD
– nginx
– -g
– daemon off;
CMD
– ./tmp/run.sh

[/bash]

Ý nghĩa của các dòng lệnh ở trên kia chỉ đơn giản là copy các đoạn script bash shell vào Docker sau đó nói Docker thực thi nó ngoài ra nó còn làm các chức nằng khác.Vì đây là bài viết nói vềlàm thế nào để chạy Docker trên Vagrant nên chúng tôi không giải thích các tham số trên, nếu các bạn chưa có kiến thức về Docker có thể xem trên Blog của chúng tôi với tags là docker

!!!!Ngoài ra bạn chú ý rằng ở trên tôi có thêm 1 đoạn code để cho vagrant tự động kết nối với một images của Docker mà ta định nghĩa ở trên, theo như trên trang chủ Vagrant thì không cần thiết như thế, nhưng nếu không có nó ta không thể kết nối một images ta định nghĩa trong tập tin Dockerfile.

Để hiểu rõ hơn bạn có thể xem mã nguồn của chúng tôi, toàn bộ đoạn script của bài viết này bạn có thể lấy tại github.

Sau đó trong thư mục ta tạo ở trên chỉ cần chạy lệnh bên dưói như sau:

[code lang=text] $vagrant up

[/code]

Sau đó bạn chờ khoản vài phút nếu Nếu mọi thứ chạy ok, thì bạn sẽ nhìn thấy hiển thị trên màn hình terminal như thế này

[code lang=text] ==> default: Deleting the container…
==> default: Removing built image…
default: Build image couldn't be destroyed because the image is in use. The
default: image must be destroyed manually in the future if you want to remove
default: it.
==> default: Building the container from a Dockerfile…
default: Sending build context to Docker daemon 167.4 kB
default: Sending build context to Docker daemon
default: Step 0 : FROM ubuntu
default: latest: Pulling from docker.io/ubuntu
default: e118faab2e16: Pulling fs layer
default: 7e2c5c55ef2c: Pulling fs layer
default: e04c66a223c4: Pulling fs layer
default: fa81ed084842: Pulling fs layer
default: fa81ed084842: Pulling fs layer
default: fa81ed084842: Layer already being pulled by another client. Waiting.
default: fa81ed084842: Pull complete
default: fa81ed084842: Already exists
default: docker.io/ubuntu:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
default: Digest: sha256:738edd684282277c07f23277718e43562daf2ee210f7aca9a13fae65f0159ddd
default: Status: Downloaded newer image for docker.io/ubuntu:latest
default: —> fa81ed084842
default: Step 1 : MAINTAINER "Thien Tran" <[email protected]>

[…]

default: Removing intermediate container d698470f9b75
default: Step 22 : CMD /usr/sbin/sshd -D -o UseDNS=no -o UsePAM=no
default: —> Running in 58d750909c3a
default: —> a698bb0a74af
default: Removing intermediate container 58d750909c3a
default: Step 23 : EXPOSE 80 22
default: —> Running in d4605bc8226f
default: —> 2d2a435dabbc
default: Removing intermediate container d4605bc8226f
default: Successfully built 2d2a435dabbc
default:
default: Image: 2d2a435dabbc
==> default: Creating the container…
default: Name: docker-phalcon_default_1433230683
default: Image: 2d2a435dabbc
default: Volume: /home/duythien/gitub/docker-phalcon:/vagrant
default: Port: 127.0.0.1:2222:22
default:
default: Container created: 60caf3a2d26beabb
==> default: Starting container…
==> default: Waiting for machine to boot. This may take a few minutes…
default: SSH address: 172.17.0.92:22
default: SSH username: vagrant
default: SSH auth method: private key
default:
default: Vagrant insecure key detected. Vagrant will automatically replace
default: this with a newly generated keypair for better security.
default:
default: Inserting generated public key within guest…
default: Removing insecure key from the guest if its present…
default: Key inserted! Disconnecting and reconnecting using new SSH key…
==> default: Machine booted and ready!

[/code]

Để xem nó có cài đặt thành công hay không bạn chỉ cần kết nối nó thông qua ssh trong vagrant

[code lang=text] vagrant ssh

[/code]

Nếu bạn thấy xuất hiện như thế này [email protected]:~$ trong terminal của bạn có nghĩa là đã chạy Docker thành cồng trong Vagrant.

Kết Luận

Nói chung để chạy Docker trên Vagrant là khá đơn giản, nhưng để ứng dụng Docker vào Production nhưng triển khai hàng trăm con Server, cập nhật bản vá Linux cho các server đó … thì việc cấu hình nó không thể đơn giản như vậy. Mà ta phải dùng tiếp một component của Docker cung cấp đó Docker Composer nó khá là hay. Bài viết kế tiếp về Docker chúng tôi hường dẫn các bạn làm chuyện đó.

Nói tóm lại để học Docker bạn chỉ cần biết dùng bash shell Linux :). Như mọi khi nếu thấy bài viết hay hãy chia sẽ nó cho bạn bè của bạn, ngoài ra nếu bạn có thắc mắc thì có thể để bình luận dưới đây.

Nguồn bài viết: http://vn.aucfan.com/posts/2016/03/28/su-dung-docker-trong-vagrant/

Leave a Reply

Your email address will not be published. Required fields are marked *