Viblo Learning
+4

Tìm hiểu Docker

1. Docker là gì

1.1. Định nghĩa

Docker là một nền tảng mở dành cho các lập trình viên, quản trị hệ thống dùng để xây dựng, vận chuyển và chạy các ứng dụng phân tán. Ban đầu viết bằng Python, hiện tại đã chuyển sang Go-lang.

Docker đưa ra một giải pháp mới cho vấn đề ảo hóa, thay vì tạo ra các máy ảo con chạy độc lập kiểu hypervisors (tạo phần cứng ảo và cài đặt hệ điều hành lên đó), các ứng dụng sẽ được đóng gói lại thành các Container (Công-ten-nơ) riêng lẻ. Các Container này chạy chung trên nhân hệ điều hành qua LXC (Linux Containers), chia sẻ chung tài nguyên của máy mẹ, do đó, hoạt động nhẹ và nhanh hơn các máy ảo dạng hypervisors.

1.2. Các thành phần chính

  • Docker Engine: là thành phần chính của Docker, như một công cụ để đóng gói ứng dụng
  • Docker Hub: là dịch vụ cloud để chia sẻ ứng dụng và tự động hóa chuỗi các công việc liên tục, có thể thao tác pull/push với các images

1.3. Một số khái niệm

  • Docker images: là một “read-only template”. Chẳng hạn, một image chứa hệ điều hành Ubuntu đã cài đặt sẵn Apache và ứng dụng web
  • Docker registries: Là kho chứa images. Người dùng có thể tạo ra các images của mình và tải lên đây hoặc tải về các images được chia sẻ
  • Docker container: hoạt động giống như một thư mục (directory), chứa tất cả những thứ cần thiết để một ứng dụng có thể chạy được. Mỗi một docker container được tạo ra từ một docker image. Các thao tác với một container: chạy, bật, dừng, di chuyển, và xóa
  • Dockerfile: là một file chứa tập hợp các lệnh để Docker có thể đọc và thực hiện để đóng gói một image theo yêu cầu người dùng
  • Orchestration : là các công cụ, dịch vụ dùng để điều phối và quản lý nhiều containers sao cho chúng làm việc hiệu quả nhất

2. So sánh Docker với Virtual machine

compare.png

Điểm khác biệt chính là các containers sử dụng chung kernel với Host OS nên các thao tác bật, tắt rất nhẹ nhàng, nhanh chóng.

  • Ưu điểm: nhanh, nhẹ, có thể chia sẻ dễ dàng qua DockerHub
  • Nhược điểm : mới, cập nhật thay đổi thường xuyên

3. Cài đặt và sử dụng Docker

3.1. Cài đặt Docker

Sau đây là quá trình cài đặt Docker trên Ubuntu 12.04:

$ uname -a

Linux backup-demo 3.2.0-53-virtual

  • Docker làm việc tốt nhất trên kernel 3.8 nên cần upgrade.

$ sudo apt-get update

$ sudo apt-get install

$ linux-image-generic-lts-raring

$ linux-headers-generic-lts-raring

$ reboot

  • update package

$ sudo apt-get update

  • install docker

$ sudo apt-get install linux-image-generic-lts-trusty

  • reboot

$ sudo reboot

3.2. Sử dụng Docker

Quản lý images/containers

  • List các images đang có:

    $ docker images -a

  • List các containers:

    $ docker ps -a

  • List các container đang chạy:

    $ docker ps

  • Remove image:

$ docker rmi < image id>

  • Remove container:

$ docker rm < container id>

Dùng Dockerfile build image

Nội dung của 1 Dockerfile để cài openssh-server trên ubuntu 12.04 image

$ cat Dockerfile

-- FROM: base on this image

FROM ubuntu:12.04

-- MAINTAINER: Dockerfile author

MAINTAINER Tran Van Cuong

-- ENV: to set an environment variable

ENV USER root

ENV HOME /root

-- RUN: run a command

RUN apt-get update

RUN apt-get install -y openssh-server

RUN mkdir /var/run/sshd

RUN echo "root:123456" | chpasswd

-- EXPOSE: exposes port for container

EXPOSE 22

-- ENTRYPOINT: make container executable with command

ENTRYPOINT /usr/sbin/sshd -D

cd đến folder chứa Dockerfile và dùng docker build -t < image tag> . để build image

docker build -t cuongtv/ssh .

Uploading context 10.24 kB

Step 1 : FROM ubuntu:12.04

Pulling repository ubuntu

8dbd9e392a96: Download complete

---> 8dbd9e392a96

Step 2 : MAINTAINER Tran Van Cuong

---> Running in 99ea761f56a8

---> 62e7555f00bd

Step 3 : ENV USER root

---> Running in 1f190f72706a

---> 6c558132b77f

Step 4 : ENV HOME /root

---> Running in 44c613dd2012

---> b58d9d956fb7

Step 5 : RUN apt-get update

---> Running in 25ed0a4b26ac

......

---> 3c82fd19a88a

Step 6 : RUN apt-get install -y openssh-server

---> Running in 6370346bc2bd

......

---> be807df511bd

Step 7 : RUN mkdir /var/run/sshd

---> Running in 161ff5c313d0

---> 13cc03230011

Step 8 : RUN echo "root:123456" | chpasswd

---> Running in bf827247b5f4

---> 8eedcdc3afe9

Step 9 : EXPOSE 22

---> Running in f70d33303fff

---> 47728b435ca6

Step 10 : ENTRYPOINT /usr/sbin/sshd -D

---> Running in 61b8e19d9574

---> 8a1bc4691754

Successfully built 8a1bc4691754

Kiểm tra kết quả:

# docker images -a

REPOSITORY | TAG | IMAGE ID | CREATED | VIRTUAL SIZE| | < none> | < none> | 8eedcdc3afe9 | 23 seconds ago | 181.7 MB cuongtv/ssh | latest | 8a1bc4691754 | 23 seconds ago | 181.7 MB < none> | < none> | 13cc03230011 | 23 seconds ago | 181.7 MB < none> | < none> | 47728b435ca6 | 23 seconds ago | 181.7 MB < none> | < none> | be807df511bd | 24 seconds ago | 181.7 MB < none> | < none> | 3c82fd19a88a | 30 seconds ago | 157 MB < none> | < none> | 62e7555f00bd | 31 seconds ago | 128 MB < none> | < none> | 6c558132b77f | 31 seconds ago | 128 MB < none> | < none> | b58d9d956fb7 | 31 seconds ago | 128 MB ubuntu | 12.04 | 8dbd9e392a96 | 8 months ago | 128 MB

# docker ps -a

CONTAINER ID | IMAGE | COMMAND | CREATED | STATUS | PORTS | NAMES| | |61b8e19d9574 | 47728b435ca6 | /bin/sh -c /usr/sbin | 56 seconds ago | Exit 0 | | stupefied_fermi| f70d33303fff | 8eedcdc3afe9 | /bin/sh -c # ( nop) EX | 56 seconds ago| Exit 0 | | stoic_bohr | bf827247b5f4 | 13cc03230011 | /bin/sh -c echo "roo | 56 seconds ago | Exit 0 | | clever_brattain | 161ff5c313d0 | be807df511bd | /bin/sh -c mkdir /va | 57 seconds ago | Exit 0 | | dreamy_lumiere | 6370346bc2bd | 3c82fd19a88a | /bin/sh -c apt-get i | About a minute ago| Exit 0 | | jolly_thompson 25ed0a4b26ac | b58d9d956fb7 | /bin/sh -c apt-get u | About a minute ago | Exit 0 | | thirsty_pike 44c613dd2012 | 6c558132b77f | /bin/sh -c #(nop) EN | About a minute ago | Exit 0 | | prickly_fermat 1f190f72706a | 62e7555f00bd | /bin/sh -c #(nop) EN | About a minute ago | Exit 0 | | dreamy_newton 99ea761f56a8 | ubuntu:12.04 | /bin/sh -c #(nop) MA | About a minute ago| Exit 0 | | hopeful_heisenberg

# docker ps

CONTAINER ID | IMAGE | COMMAND | CREATED | STATUS | PORTS | NAMES |

docker ps cho thấy chưa có container nào chạy. Các bước tiếp theo sẽ run image và assign port cho nó

# docker run -d -p 22 cuongtv/ssh be7238580063e1c5da400fe35b4d45497aac4d83850eb00d7a601098da500e13

# docker port be7238580063e1c5da400fe35b4d45497aac4d83850eb00d7a601098da500e13 22 0.0.0.0:49153

# docker ps

CONTAINER ID | IMAGE | COMMAND | CREATED | STATUS | PORTS | NAMES | be7238580063 | cuongtv/ssh:latest | /bin/sh -c /usr/sbin | 15 seconds ago | Up 15 seconds | 0.0.0.0:49153->22/tcp | berserk_tesla

Giờ đã thấy container be7238580063 đang chạy và port 49153 của host được map với port 22 của container

Bạn có thể ssh vào container qua port 49153:

với user root và pass 123456 đã khai báo trong Dockerfile:

# ssh [email protected] -p 49153

The authenticity of host '[0.0.0.0]:49153 ([0.0.0.0]:49153)' can't be established.

ECDSA key fingerprint is 5d:c0:af:8b:64:b2:c4:71:0c:35:5d:0e:29:9d:87:00.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '[0.0.0.0]:49153' (ECDSA) to the list of known hosts.

[email protected]'s password:

Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.8.0-29-generic x86_64)

** Documentation: https://help.ubuntu.com/

The programs included with the Ubuntu system are free software;

the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law.

[email protected]:~# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
   valid_lft forever preferred_lft forever

25: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 2a:5c:64:3c:f7:5a brd ff:ff:ff:ff:ff:ff
inet 172.17.0.6/16 scope global eth0
inet6 fe80::285c:64ff:fe3c:f75a/64 scope link
   valid_lft forever preferred_lft forever

[email protected]:~# uname -a

Linux be7238580063 3.8.0-29-generic #42~precise1-Ubuntu SMP Wed Aug 14 16:19:23 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

[email protected]:~# ping 8.8.8.8

-bash: ping: command not found

[email protected]:~# ls /

bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  selinux  srv  sys  tmp  usr  var

Debug

Log của docker lưu lại /var/log/upstart/docker.log Cần quyền root để xem log này.

Log level mặc định là INFO, muốn chuyển sang DEBUG cần tắt service và khởi động bằng tay với option -D

$sudo initctl stop docker

$sudo /usr/bin/docker -d -D


All Rights Reserved