Trang chủ / Chuyên đề / Cài đặt và sử dụng Docker trên Ubuntu 16
Thứ sáu, 19/10/2018 | 00:00 GMT+7

Cài đặt và sử dụng Docker trên Ubuntu 16

Docker là một ứng dụng làm đơn giản hóa các quy trình ứng dụng, giống như máy ảo, nhưng cơ động thân thiện với tài nguyên hơn và phụ thuộc hơn vào hệ điều hành server. Có hai phương pháp để cài đặt Docker trên Ubuntu 16.04. Một phương pháp liên quan đến việc cài đặt nó trên một bản cài đặt hiện có của hệ điều hành. Cách khác dùng công cụ có tên Docker Machine tự động cài đặt Docker trên đó. Trong hướng dẫn này, ta sẽ cài đặt và sử dụng nó trên bản cài đặt hiện có của Ubuntu 16.04.

Yêu cầu

Để làm theo hướng dẫn này, bạn sẽ cần những thứ sau:

  • Một server Ubuntu 16.04 được thiết lập với user không phải root có đặc quyền sudo và firewall cơ bản, như được giải thích trong Hướng dẫn thiết lập ban đầu cho Ubuntu 16.04
  • Một tài khoản trên Docker Hub nếu bạn muốn tạo image của mình và push chúng vào Docker Hub, như Bước 7 và 8

Bước 1 - Cài đặt Docker

Gói cài đặt Docker có sẵn trong repository (kho lưu trữ) Ubuntu 16.04 chính thức có thể không phải là phiên bản mới nhất. Để tải phiên bản mới nhất này, hãy cài đặt Docker từ repository Docker chính thức, ta sẽ cài từ kho Docker này.

Trước tiên, để đảm bảo tải xuống hợp lệ, hãy thêm khóa GPG cho repository Docker chính thức vào hệ thống của bạn:

  • curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Thêm repository Docker vào các nguồn APT:

  • sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

Tiếp theo, cập nhật database gói với các gói Docker từ repo mới được thêm vào:

  • sudo apt-get update

Đảm bảo rằng bạn sắp cài đặt từ repo Docker thay vì repo Ubuntu 16.04 mặc định:

  • apt-cache policy docker-ce

Bạn sẽ thấy đầu ra như sau:

docker-ce:
  Installed: (none)
  Candidate: 18.06.1~ce~3-0~ubuntu
  Version table:
     18.06.1~ce~3-0~ubuntu 500
        500 https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages

Lưu ý rằng docker-ce chưa được cài đặt, nhưng phần tử để cài đặt là từ repository Docker cho Ubuntu 16.04 ( xenial ).

Cuối cùng, cài đặt Docker:

  • sudo apt-get install -y docker-ce

Docker bây giờ sẽ được cài đặt, trình nền bắt đầu và tiến trình được kích hoạt để bắt đầu khi khởi động. Kiểm tra xem nó đang chạy:

  • sudo systemctl status docker

Kết quả phải tương tự như sau, cho thấy rằng dịch vụ đang chạy:

Output
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2018-10-18 20:28:23 UTC; 35s ago
     Docs: https://docs.docker.com
 Main PID: 13412 (dockerd)
   CGroup: /system.slice/docker.service
           ├─13412 /usr/bin/dockerd -H fd://
           └─13421 docker-containerd --config /var/run/docker/containerd/containerd.toml

Việc cài đặt Docker giờ đây cung cấp cho bạn không chỉ dịch vụ Docker (daemon) mà còn cả tiện ích dòng lệnh docker hoặc ứng dụng client Docker. Chúng ta sẽ khám phá cách sử dụng lệnh docker ở phần tiếp theo.

Bước 2 - Thực thi Lệnh Docker mà không cần Sudo (Tùy chọn)

Theo mặc định, việc chạy lệnh docker yêu cầu quyền root - nghĩa là bạn phải đặt trước lệnh với sudo , cũng có thể được chạy bởi user trong nhóm docker , được tạo tự động trong quá trình cài đặt Docker. Nếu bạn cố gắng chạy docker lệnh mà không đặt trước từ đó sudo hoặc không là ở nhóm Docker, kết quả sẽ như này:

Output
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.

Nếu muốn tránh nhập sudo, hãy thêm tên user vào nhóm docker :

  • sudo usermod -aG docker ${USER}

Để áp dụng tư cách thành viên nhóm mới, bạn có thể đăng xuất khỏi server và đăng nhập lại, hoặc bạn có thể nhập như sau:

  • su - ${USER}

Bạn sẽ được nhắc nhập mật khẩu của user để tiếp tục. Sau đó, bạn có thể xác nhận rằng user của bạn hiện đã được thêm vào nhóm docker bằng lệnh:

  • id -nG
Output
sammy sudo docker

Nếu bạn cần thêm user vào nhóm docker mà bạn chưa đăng nhập, hãy khai báo tên user đó một cách rõ ràng bằng cách sử dụng:

  • sudo usermod -aG docker username

Phần còn lại của bài viết này sẽ giả định bạn đang chạy lệnh docker với tư cách là user trong nhóm user docker. Nếu không, bạn sẽ cần thêm các lệnh với sudo .

Bước 3 - Sử dụng lệnh Docker

Với Docker được cài đặt, giờ là lúc để làm quen với dòng lệnh. Sử dụng docker bao gồm việc chuyển cho nó một chuỗi các tùy chọn và lệnh theo sau là các đối số. Cú pháp có dạng sau:

  • docker [option] [command] [arguments]

Để xem tất cả các lệnh con có sẵn, hãy nhập:

  • docker

Kể từ Docker 18.06.1, danh sách đầy đủ các lệnh con có sẵn bao gồm:

Output

  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  images      List images
  import      Import the contents from a tarball to create a filesystem image
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  login       Log in to a Docker registry
  logout      Log out from a Docker registry
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  search      Search the Docker Hub for images
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes

Để xem các option cho một lệnh cụ thể, hãy nhập:

  • docker docker-subcommand --help

Để xem thông tin toàn hệ thống về Docker, hãy sử dụng:

  • docker info

Bước 4 - Làm việc với Docker Images

container Docker được chạy từ image Docker. Theo mặc định, nó lấy những image này từ Docker Hub. Bất kỳ ai cũng có thể tạo và lưu trữ image Docker của họ trên Docker Hub.

Để kiểm tra xem bạn có thể truy cập và tải xuống image từ Docker Hub hay không, hãy nhập:

  • docker run hello-world

Trong đầu ra, bạn sẽ thấy thông báo sau, cho biết rằng Docker đang hoạt động chính xác:

Output
...
Hello from Docker!
This message shows that your installation appears to be working correctly.
...

Bạn có thể tìm kiếm các image có sẵn trên Docker Hub bằng cách sử dụng lệnh docker với lệnh con search . Ví dụ, để tìm kiếm image Ubuntu, hãy nhập:

  • docker search ubuntu

Tập lệnh sẽ thu thập dữ liệu Docker Hub và trả về danh sách tất cả các image có tên với chuỗi tìm kiếm. Trong trường hợp này, đầu ra sẽ tương tự như sau:

Output

NAME                                                   DESCRIPTION                                     STARS            OFFICIAL            AUTOMATED
ubuntu                                                 Ubuntu is a Debian-based Linux operating sys…   8564                [OK]                
dorowu/ubuntu-desktop-lxde-vnc                         Ubuntu with openssh-server and NoVNC            230                                     [OK]
rastasheep/ubuntu-sshd                                 Dockerized SSH service, built on top of offi…   176                                     [OK]
consol/ubuntu-xfce-vnc                                 Ubuntu container with "headless" VNC session…   129                                     [OK]
ansible/ubuntu14.04-ansible                            Ubuntu 14.04 LTS with ansible                   95                                      [OK]
ubuntu-upstart                                         Upstart is an event-based replacement for th…   91                  [OK]                
neurodebian                                            NeuroDebian provides neuroscience research s…   54                  [OK]                
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5   ubuntu-16-nginx-php-phpmyadmin-mysql-5          48                                      [OK]
ubuntu-debootstrap                                     debootstrap --variant=minbase --components=m…   39                  [OK]                
nuagebec/ubuntu                                        Simple always updated Ubuntu docker images w…   23                                      [OK]
tutum/ubuntu                                           Simple Ubuntu docker images with SSH access     18                                      
i386/ubuntu                                            Ubuntu is a Debian-based Linux operating sys…   14                                      
1and1internet/ubuntu-16-apache-php-7.0                 ubuntu-16-apache-php-7.0                        13                                      [OK]
ppc64le/ubuntu                                         Ubuntu is a Debian-based Linux operating sys…   12                                      
eclipse/ubuntu_jdk8                                    Ubuntu, JDK8, Maven 3, git, curl, nmap, mc, …   6                                       [OK]
1and1internet/ubuntu-16-nginx-php-5.6-wordpress-4      ubuntu-16-nginx-php-5.6-wordpress-4             6                                       [OK]
codenvy/ubuntu_jdk8                                    Ubuntu, JDK8, Maven 3, git, curl, nmap, mc, …   4                                       [OK]
darksheer/ubuntu                                       Base Ubuntu Image -- Updated hourly             4                                       [OK]
pivotaldata/ubuntu                                     A quick freshening-up of the base Ubuntu doc…   2                                       
1and1internet/ubuntu-16-sshd                           ubuntu-16-sshd                                  1                                       [OK]
smartentry/ubuntu                                      ubuntu with smartentry                          1                                       [OK]
ossobv/ubuntu                                          Custom ubuntu image from scratch (based on o…   0                                       
paasmule/bosh-tools-ubuntu                             Ubuntu based bosh-cli                           0                                       [OK]
1and1internet/ubuntu-16-healthcheck                    ubuntu-16-healthcheck                           0                                       [OK]
pivotaldata/ubuntu-gpdb-dev                            Ubuntu images for GPDB development              0                                       


Trong cột OFFICIAL, OK chỉ ra một image được xây dựng và công ty đứng sau dự án. Khi bạn đã xác định được image muốn sử dụng, có thể tải nó xuống máy tính bằng cách sử dụng lệnh pull . Hãy thử với image ubuntu , như sau:

  • docker pull ubuntu

Sau khi một image đã được tải xuống, bạn có thể chạy một container bằng cách sử dụng image đã tải xuống với lệnh run . Nếu một image chưa được tải xuống khi docker được thực thi với lệnh con run , thì ứng dụng khách Docker trước tiên sẽ tải xuống image, sau đó chạy một container:

  • docker run ubuntu

Để xem các image đã được tải xuống máy tính của bạn, hãy nhập:

  • docker images

Đầu ra sẽ giống:

Output
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              ea4c82dcd15a        16 hours ago        85.8MB
hello-world         latest              4ab4c602aa5e        5 weeks ago         1.84kB

Như ở phần sau của hướng dẫn này, image mà bạn sử dụng để chạy container có thể được sửa đổi và sử dụng để tạo image mới, sau đó có thể được tải lên (push) lên Docker Hub hoặc nơi chứa Docker khác.

Bước 5 - Chạy Docker Container

Container hello-world bạn đã chạy ở bước trước là một ví dụ về container chạy và thoát ngay. Tất nhiên các container có thể hữu ích hơn thế nhiều và chúng có thể tương tác. Xét cho cùng, chúng tương tự như máy ảo, chỉ thân thiện hơn với tài nguyên.

Ví dụ, hãy chạy một container bằng image mới nhất của Ubuntu. Sự kết hợp của các option -i-t cho phép bạn truy cập shell vào container:

  • docker run -it ubuntu

Lưu ý: Hành vi mặc định cho lệnh run là bắt đầu một container mới. Khi bạn chạy lệnh trước đó, bạn sẽ mở giao diện shell của container ubuntu thứ hai.

Dấu nhắc lệnh của bạn sẽ thay đổi để thấy bạn hiện đang làm việc bên trong container, dạng như sau, chính là Shell linux trong hệ điều hành ubutu:

Output
root@9b0db8a30ad1:/#

Lưu ý: Hãy nhớ id container trong dấu nhắc lệnh. Trong ví dụ trước, nó là 9b0db8a30ad1 . Sau này, bạn sẽ cần ID container đó để xác định container khi bạn muốn xóa nó.

Giờ ta có thể chạy bất kỳ lệnh nào bên trong container. Ví dụ: hãy cập nhật gói bên trong OS của container:

  • apt-get update

Hay cài đặt ứng dụng nào đó, như Node.js:

  • apt-get install -y nodejs

Khi cài đặt kết thúc, hãy xác minh rằng Node.js đã được cài đặt:

  • node -v

Số phiên bản sẽ được hiển thị trong terminal của mình:

Output
v8.10.0

Mọi thay đổi bạn thực hiện bên trong container chỉ áp dụng cho container đó.

Để thoát khỏi container, hãy nhập exit tại lệnh.

Tiếp theo hãy xem xét việc quản lý các container trên hệ thống đang chạy.

Bước 6 - Quản lý container Docker

Sau khi sử dụng Docker một thời gian, bạn sẽ có nhiều container hoạt động (đang chạy) và không hoạt động trên máy tính của mình. Để xem những cái đang hoạt động , hãy sử dụng:

  • docker ps

Bạn sẽ thấy đầu ra tương tự như sau:

Output
CONTAINER ID        IMAGE               COMMAND             CREATED             

Trong hướng dẫn này, bạn đã bắt đầu ba container; một từ image hello-world và hai từ image ubuntu . Những container này không còn chạy nữa, nhưng chúng vẫn tồn tại trên hệ thống của bạn.

Để xem tất cả các container - đang hoạt động và không hoạt động - hãy chạy docker ps bằng option -a :

  • docker ps -a

Đầu ra tương tự như sau:

Output
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
9b0db8a30ad1        ubuntu              "/bin/bash"         21 minutes ago      Exited (0) About a minute ago                       xenodochial_neumann
d7851eb12e23        ubuntu              "/bin/bash"         24 minutes ago      Exited (0) 24 minutes ago                           boring_chebyshev
d54945b6510b        hello-world         "/hello"            32 minutes ago      Exited (0) 32 minutes ago                           youthful_roentgen

Để xem container mới nhất bạn đã tạo, hãy nhập -l :

  • docker ps -l
Output
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                            PORTS               NAMES
9b0db8a30ad1        ubuntu              "/bin/bash"         22 minutes ago      Exited (127) About a minute ago                       xenodochial_neumann

Để bắt đầu một container đã dừng, hãy sử dụng docker start , theo sau là ID container hoặc tên của container. Hãy bắt đầu container dựa trên Ubuntu với ID là 9b0db8a30ad1 :

  • docker start 9b0db8a30ad1

Container sẽ start và bạn có thể sử dụng docker ps để xem trạng thái:

Output
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
9b0db8a30ad1        ubuntu              "/bin/bash"         23 minutes ago      Up 11 seconds                           xenodochial_neumann

Để dừng một container đang chạy, sử dụng docker stop , theo sau là ID hoặc tên container. Lần này, chúng ta sẽ sử dụng tên mà Docker đã gán cho container, đó là xenodochial_neumann :

  • docker stop xenodochial_neumann

Khi bạn không cần container nữa, hãy xóa nó bằng lệnh docker rm , sử dụng ID container hoặc tên. Sử dụng lệnh docker ps -a để tìm ID container hoặc tên cho container được liên kết với image hello-world và xóa.

  • docker rm youthful_roentgen

Bạn có thể bắt đầu một container mới và đặt tên cho nó bằng cách sử dụng option --name . Bạn cũng có thể sử dụng option --rm để tạo một container và tự xóa khi nó dừng. Xem lệnh docker run help để biết thêm thông tin về các tùy chọn này và các tùy chọn khác.

Các container có thể được chuyển thành image và bạn có thể sử dụng để xây dựng các container mới. Hãy xem nó hoạt động như thế nào.

Bước 7 - Commit các thay đổi trong container thành image Docker

Khi bạn khởi động image Docker, bạn có thể tạo, sửa đổi và xóa các file giống như bạn có thể làm với máy ảo. Những thay đổi bạn thực hiện sẽ chỉ áp dụng cho container đó. Bạn có thể bắt đầu và dừng nó, nhưng một khi bạn xóa nó bằng lệnh docker rm , các thay đổi sẽ mất.

Phần này hướng dẫn bạn cách lưu trạng thái của container dưới dạng image Docker mới.

Sau khi cài đặt Node.js bên trong container Ubuntu, bây giờ bạn có một container đang chạy trên một image, nhưng container khác với image bạn đã sử dụng để tạo nó. Bạn có thể muốn sử dụng lại container Node.js này làm cơ sở cho các image mới sau này.

Để thực hiện việc này, hãy commit các thay đổi đối với phiên bản image Docker mới bằng cách sử dụng cấu trúc lệnh sau:

  • docker commit -m "What did you do to the image" -a "Author Name" container-id repository/new_image_name

option -m dành cho thông báo commit , cho biết bạn đã thực hiện những thay đổi nào, trong khi -a được sử dụng để chỉ định tác giả. Trừ khi bạn tạo thêm repository trên Docker Hub, repository thường là tên user Docker Hub của bạn.

Ví dụ: đối với sammy user, với ID container là d9b100f2f636 , lệnh sẽ là:

  • docker commit -m "added node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs

Lưu ý: Khi bạn commit một image, image mới sẽ được lưu cục bộ trên máy tính của bạn. Phần sau của hướng dẫn này, bạn sẽ thấy cách push một image vào register Docker như Docker Hub để bạn và những người khác có thể đánh giá và sử dụng image đó.

Sau khi thao tác đó hoàn tất, liệt kê các image Docker hiện trên máy tính của bạn sẽ hiển thị image mới, cũng như image cũ mà nó được dẫn xuất:

  • docker images

Đầu ra tương tự như sau:

Output
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
sammy/ubuntu-nodejs       latest              6a1784a63edf        2 minutes ago       170MB
ubuntu                    latest              ea4c82dcd15a        17 hours ago        85.8MB
hello-world               latest              4ab4c602aa5e        5 weeks ago         1.84kB

Trong ví dụ trên, ubuntu-nodejs là image mới, được lấy từ image ubuntu hiện có từ Docker Hub. Sự khác biệt về kích thước cho thấy những thay đổi đã được thực hiện. Trong ví dụ này, thay đổi là Node.js đã được cài đặt. Lần tới khi bạn cần chạy container bằng Ubuntu có cài đặt sẵn Node.js, bạn chỉ có thể sử dụng image mới.

Bạn cũng có thể tạo image từ Dockerfile , cho phép bạn tự động cài đặt phần mềm trong một image mới. Tuy nhiên, điều đó nằm ngoài phạm vi của hướng dẫn này.

Bây giờ bạn đã có thể chia sẻ image mới với người khác để họ có thể tạo container từ nó.

Bước 8 - push image Docker vào repository Docker

Bước tiếp theo sau khi tạo một image mới từ một image hiện có, là chia sẻ nó với người khác, hay là cả thế giới trên Docker Hub hoặc một register Docker khác. Để push một image lên Docker Hub hoặc nơi chứa Docker khác, bạn phải có tài khoản ở đó.

Phần này hướng dẫn cách push image Docker vào Docker Hub.

Để push image của bạn, trước tiên hãy đăng nhập vào Docker Hub:

  • docker login -u docker-registry-username

Bạn sẽ nhập mật khẩu Docker Hub của mình. Nếu bạn chỉ định mật khẩu chính xác, xác thực sẽ thành công.

Lưu ý: Nếu tên user đăng ký Docker của bạn khác với tên user cục bộ mà bạn đã sử dụng để tạo image, bạn sẽ phải gắn thẻ image bằng tên user đăng ký của mình. Đối với ví dụ được đưa ra trong bước cuối cùng, bạn sẽ nhập:

  • docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs

Sau đó, có thể push image của mình bằng cách:

  • docker push docker-registry-username/ubuntu-nodejs

Để push image ubuntu-nodejs vào repository sammy , lệnh sẽ là:

  • docker push sammy/ubuntu-nodejs

Quá trình này có thể mất một chút thời gian để hoàn thành vì nó tải image lên, khi hoàn tất, đầu ra sẽ giống như sau:

Output
The push refers to repository [docker.io/sammy/ubuntu-nodejs]
1aa927602b6a: Pushed
76c033092e10: Pushed
2146d867acf3: Pushed
ae1f631f14b7: Pushed
102645f1cf72: Pushed
latest: digest: sha256:2be90a210910f60f74f433350185feadbbdaca0d050d97181bf593dd85195f06 size: 1362

Sau khi push image vào register, image đó sẽ được liệt kê trên trang tổng quan của tài khoản của bạn, giống như được hiển thị trong image bên dưới.

Danh sách hình ảnh Docker mới trên Docker Hub

Nếu push lên có lỗi sau, thì có thể là bạn chưa đăng nhập:

Output
The push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Preparing
5f70bf18a086: Preparing
a3b5c80a4eba: Preparing
7f18b442972b: Preparing
3ce512daaf78: Preparing
7aae4540b42d: Waiting
unauthorized: authentication required

Đăng nhập, và push lại.

Kết luận

Trong hướng dẫn này, bạn đã có những kiến thức cơ bản để bắt đầu làm việc với Docker trên Ubuntu 16.04. Giống như hầu hết các dự án mã nguồn mở, vì vậy hãy tạo thói quen truy cập trang blog của dự án để biết thông tin mới nhất.



Các tin trước

Cài đặt và sử dụng Composer trên Ubuntu 18.04 2018-10-16

Cài đặt WordPress với LAMP trên Ubuntu 18.04 2018-07-06

Chuyển folder dữ liệu Mysql tới vị trí mới trên Ubuntu 18.04 2018-07-06

Cài đặt và Sử dụng Docker với Ubuntu 18.04 2018-07-05

Cài đặt Firewall với UFW trên Ubuntu 18.04 2018-07-05

Tạo chứng chỉ Tự ký cho Apache trên Ubuntu 18-04 2018-07-05

Cài đặt MongoDB trên Ubuntu 18.04 2018-06-07

Cài đặt OpenVPN Server trên Ubuntu 18.04 2018-05-24

Cài đặt LEMP - Linux Nginx MySQL PHP trên Ubuntu 18 04 2018-05-23

Cài đặt và sử dụng PostgreSQL trên Ubuntu 18.04 2018-05-04