Tìm hiểu Docker
Bài đăng này đã không được cập nhật trong 3 năm
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
Đ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 root@0.0.0.0 -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.
root@0.0.0.0'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.
root@be7238580063:~# 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
root@be7238580063:~# 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
root@be7238580063:~# ping 8.8.8.8
-bash: ping: command not found
root@be7238580063:~# 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