---
title: "Cách cài đặt và sử dụng Docker trên Ubuntu 16.04"
description: "Cách cài đặt và sử dụng Docker trên Ubuntu 16.04"
url: https://cloudfly.vn/techblog/cach-cai-dat-va-su-dung-docker-tren-ubuntu-1604
image: https://media.cloudfly.vn/posts/techblog_o9obMZZ.jpg
---

# Cách cài đặt và sử dụng Docker trên Ubuntu 16.04

## Giới thiệu

Docker là một ứng dụng giúp chạy các quy trình ứng dụng trong một container, giống như máy ảo, nhưng dễ dàng và di động hơn, thân thiện với tài nguyên hơn và phụ thuộc nhiều hơn vào hệ điều hành máy chủ. 

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 hệ điều hành hiện có. Phương pháp còn lại liên quan đến việc khởi động một máy chủ bằng một công cụ có tên là Docker Machine để tự động cài đặt Docker trên đó.

Trong hướng dẫn này, bạn sẽ tìm hiểu cách cài đặt và sử dụng nó trên một bản cài đặt Ubuntu 16.04 hiện có.

## Điều kiện tiên quyết

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

* Một máy chủ Ubuntu 16.04 được thiết lập với non-root user có quyền sudo và tường lửa cơ bản, như đã 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 hình ảnh của riêng mình và đẩy chúng lên Docker Hub, như được hiển thị trong Bước 7 và 8

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

Gói cài đặt Docker có trong 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. Để có phiên bản mới nhất này, hãy cài đặt Docker từ kho lưu trữ Docker chính thức. Phần này sẽ hướng dẫn bạn cách thực hiện điều đó.

Đầu tiên, để đảm bảo các bản tải xuống hợp lệ, hãy thêm khóa GPG cho kho lưu trữ Docker chính thức vào hệ thống của bạn:
```command
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```

Thêm kho lưu trữ Docker vào nguồn APT:
```command
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
```

Tiếp theo, cập nhật cơ sở dữ liệu gói bằng các gói Docker từ kho lưu trữ mới được thêm vào:
```command
sudo apt-get update
```

Hãy đảm bảo rằng bạn sắp cài đặt từ kho lưu trữ Docker thay vì kho lưu trữ Ubuntu 16.04 mặc định:
```command
apt-cache policy docker-ce
```

Bạn sẽ thấy kết quả tương tự như sau:
```nginx
[label Output of apt-cache policy docker-ce]
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 ứng viên để cài đặt là từ kho lưu trữ Docker cho Ubuntu 16.04 (xenial).

Cuối cùng, hãy cài đặt Docker:
```command
sudo apt-get install -y docker-ce
```

Docker bây giờ sẽ được cài đặt, daemon đã được khởi động và quy trình đã được bật để khởi động khi khởi động. Kiểm tra xem nó có đang chạy không:
```command
sudo systemctl status docker
```

Đầu ra sẽ tương tự như sau, cho thấy dịch vụ đang hoạt động và chạy:
```
[secondary_label 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
```

Cài đặt Docker ngay bây giờ không chỉ cung cấp cho bạn dịch vụ Docker (daemon) mà còn cả tiện ích dòng lệnh `docker` hoặc máy khách Docker. Chúng ta sẽ khám phá cách sử dụng lệnh `docker` sau trong hướng dẫn này.

## 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 thêm tiền tố `sudo` vào lệnh. Người dùng trong nhóm **docker** cũng có thể chạy lệnh này, nhóm này được tạo tự động trong quá trình cài đặt Docker. Nếu bạn cố gắng chạy lệnh `docker` mà không thêm tiền tố `sudo` hoặc không nằm trong nhóm docker, bạn sẽ nhận được kết quả như sau:
```
[secondary_label Output]
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.
```

Nếu bạn muốn tránh phải nhập `sudo` mỗi khi chạy lệnh `docker`, hãy thêm tên người dùng của bạn vào nhóm `docker`:
```command
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 máy chủ rồi đăng nhập lại hoặc bạn có thể nhập lệnh sau:
```command
su - ${USER}
```

Bạn sẽ được nhắc nhập mật khẩu người dùng để tiếp tục. Sau đó, bạn có thể xác nhận rằng người dùng của bạn hiện đã được thêm vào nhóm `docker` bằng cách nhập:
```command
id -nG
```

```
[secondary_label Output]
<^>sammy<^> sudo docker
```

Nếu bạn cần thêm người dùng vào nhóm `docker` mà bạn chưa đăng nhập, hãy khai báo tên người dùng đó một cách rõ ràng bằng cách sử dụng:
```command
sudo usermod -aG docker <^>username<^>
```

Phần còn lại của bài viết này giả định rằng bạn đang chạy lệnh `docker` với tư cách là người dùng trong nhóm người dùng docker. Nếu bạn chọn không chạy, vui lòng thêm `sudo` vào trước các lệnh.

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

Khi Docker đã được cài đặt và hoạt động, giờ là lúc làm quen với tiện ích dòng lệnh. Sử dụng `docker` bao gồm việc truyề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:
```command
docker [option] [command] [arguments]
```

Để xem tất cả các lệnh phụ có sẵn, hãy nhập:
```command
docker
```

Tính đến Docker 18.06.1, danh sách đầy đủ các lệnh phụ khả dụng bao gồm:
```
[secondary_label 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 công tắc có sẵn cho một lệnh cụ thể, hãy nhập:
```command
docker <^>docker-subcommand<^> --help
```

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

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

Các container Docker được chạy từ các image Docker. Theo mặc định, nó sẽ kéo các image này từ Docker Hub, một sổ đăng ký Docker do Docker quản lý, công ty đứng sau dự án Docker. Bất kỳ ai cũng có thể xây dựng và lưu trữ các image Docker của họ trên Docker Hub, vì vậy hầu hết các ứng dụng và bản phân phối Linux mà bạn cần chạy các container Docker đều có các image được lưu trữ trên Docker Hub.

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

Trong kết quả đầu ra, bạn sẽ thấy thông báo sau, cho biết Docker đang hoạt động chính xác:
```
[secondary_label Output]
...
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
```

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

Tập lệnh sẽ thu thập Docker Hub và trả về danh sách tất cả các hình ảnh có tên khớp với chuỗi tìm kiếm. Trong trường hợp này, đầu ra sẽ tương tự như sau:
```
[secondary_label 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 hình ảnh được xây dựng và hỗ trợ bởi công ty đằng sau dự án. Sau khi bạn đã xác định được hình ảnh mà bạn muốn sử dụng, bạn có thể tải xuống máy tính của mình bằng lệnh phụ `pull`. Hãy thử điều này với image `ubuntu`, như sau:
```command
docker pull ubuntu
```

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

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

Kết quả đầu ra sẽ trông tương tự như sau:
```
[secondary_label 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ư bạn sẽ thấy sau trong hướng dẫn này, các hình ảnh mà bạn sử dụng để chạy container có thể được sửa đổi và sử dụng để tạo ra các hình ảnh mới, sau đó có thể được tải lên (*đẩy* (pushed ) là thuật ngữ kỹ thuật) lên Docker Hub hoặc các sổ đăng ký Docker khác.

## Bước 5 — Chạy một Container Docker

Container `hello-world` mà bạn đã chạy ở bước trước là một ví dụ về một container chạy và thoát sau khi phát ra thông báo kiểm tra. 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 hình ảnh mới nhất của Ubuntu. Sự kết hợp của các công tắc `-i` và `-t` cung cấp cho bạn quyền truy cập shell tương tác vào container:
```command
docker run -it ubuntu
```

<$>[note]
**Lưu ý:** Hành vi mặc định cho lệnh `run` là khởi động một container mới. Sau khi bạn chạy lệnh trước đó, bạn sẽ mở giao diện shell của một container `ubuntu` thứ hai.
<$>

Dấu nhắc lệnh của bạn sẽ thay đổi để phản ánh thực tế là bạn hiện đang làm việc bên trong container và sẽ có dạng sau:
```
[secondary_label Output]
root@<^>9b0db8a30ad1<^>:/#
```

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

Bây giờ bạn có thể chạy bất kỳ lệnh nào bên trong container. Ví dụ, hãy cập nhật cơ sở dữ liệu gói bên trong container. Bạn không cần phải thêm tiền tố `sudo` vào bất kỳ lệnh nào, vì bạn đang hoạt động bên trong container với tư cách là **root** user:
```custom_prefix(root@9b0db8a30ad1:/#)
apt-get update
```

Sau đó cài đặt bất kỳ ứng dụng nào vào đó. Hãy cài đặt Node.js:
```custom_prefix(root@9b0db8a30ad1:/#)
apt-get install -y nodejs
```

Lệnh này cài đặt Node.js trong container từ kho lưu trữ Ubuntu chính thức. Khi quá trình cài đặt hoàn tất, hãy xác minh rằng Node.js đã được cài đặt:
```custom_prefix(root@9b0db8a30ad1:/#)
node -v
```

Bạn sẽ thấy số phiên bản được hiển thị trong thiết bị đầu cuối của mình:
```
[secondary_label Output]
v8.10.0
```

Bất kỳ thay đổi nào 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 dấu nhắc.

Tiếp theo, chúng ta hãy xem cách quản lý các container trên hệ thống của chúng ta.

## Bước 6 — Quản lý các container Docker

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

Bạn sẽ thấy kết quả tương tự như sau:
```
[secondary_label Output]
CONTAINER ID        IMAGE               COMMAND             CREATED
```

Trong hướng dẫn này, bạn đã khởi động ba container; một từ image `hello-world` và hai từ image `ubuntu`. Các 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` với lệnh chuyển đổi `-a`:
```command
docker ps -a
```

Bạn sẽ thấy kết quả tương tự như thế này:
```
[secondary_label 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 truyền lệnh `-l` vào đó:
```command
docker ps -l
```

```
[secondary_label Output]
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                            PORTS               NAMES
9b0db8a30ad1        ubuntu              "/bin/bash"         22 minutes ago      Exited (127) About a minute ago                       xenodochial_neumann
```

Để khởi động một container đã dừng, hãy sử dụng `docker start`, theo sau là ID container hoặc tên container. Hãy khởi động container dựa trên Ubuntu với ID là `9b0db8a30ad1`:
```command
docker start <^>9b0db8a30ad1<^>
```

Container sẽ khởi động và bạn có thể sử dụng `docker ps` để xem trạng thái của nó:
```
[secondary_label 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, hã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`:
```command
docker stop <^>xenodochial_neumann<^>
```

Khi bạn đã quyết định không cần container nữa, hãy xóa nó bằng lệnh `docker rm`, một lần nữa 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 container được liên kết với hình ảnh `hello-world` và xóa nó.
```command
docker rm <^>youthful_roentgen<^>
```

Bạn có thể khởi động một container mới và đặt tên cho nó bằng lệnh `--name`. Bạn cũng có thể sử dụng lệnh `--rm` để tạo một container tự xóa khi nó dừng lại. 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.

Container có thể được chuyển thành hình ảnh mà bạn có thể sử dụng để xây dựng container mới. Hãy cùng xem cách thức hoạt động của lệnh này.

## Bước 7 — Cam kết 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 tệp 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ể khởi động và dừng container, nhưng sau khi bạn hủy nó bằng lệnh `docker rm`, những thay đổi sẽ bị mất vĩnh viễn.

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, giờ bạn có một container chạy từ một image, nhưng container này khác với image bạn đã sử dụng để tạo container. Nhưng 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 cam kết các thay đổi vào một phiên bản image Docker mới bằng cách sử dụng cấu trúc lệnh sau:
```command
docker commit -m "<^>What did you do to the image<^>" -a "<^>Author Name<^>" <^>container-id<^> <^>repository<^>/<^>new_image_name<^>
```

Công tắc **-m** dành cho thông báo cam kết giúp bạn và những người khác biết những thay đổi bạn đã thực hiện, trong khi **-a** được sử dụng để chỉ định tác giả. `container ID` là ID bạn đã ghi chú trước đó trong hướng dẫn khi bạn bắt đầu phiên Docker tương tác. Trừ khi bạn đã tạo thêm kho lưu trữ trên Docker Hub, kho lưu trữ thường là tên người dùng Docker Hub của bạn.

Ví dụ, đối với người dùng **sammy**, với container ID là `d9b100f2f636`, lệnh sẽ là:
```command
docker commit -m "added node.js" -a "<^>sammy<^>" <^>d9b100f2f636<^> <^>sammy<^>/ubuntu-nodejs
```

<$>[note]
**Lưu ý:** Khi bạn *commit* một image, image mới sẽ được lưu cục bộ, tức là trên máy tính của bạn. Sau này trong hướng dẫn này, bạn sẽ học cách đẩy image lên sổ đăng ký Docker như Docker Hub để bạn và những người khác có thể đánh giá và sử dụng image đó.
<$>

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

Đầu ra sẽ tương tự như thế này:
```
[secondary_label 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 phản ánh 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 một container bằng Ubuntu với Node.js được cài đặt sẵn, bạn chỉ cần sử dụng hình ảnh mới.

Bạn cũng có thể xây dựng 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ờ, hãy chia sẻ image mới với những người khác để họ có thể tạo container từ image đó.

## Bước 8 — Đẩy image Docker vào kho lưu trữ Docker

Bước hợp lý tiếp theo sau khi tạo image mới từ image hiện có là chia sẻ image đó với một số ít bạn bè của bạn, toàn thế giới trên Docker Hub hoặc sổ đăng ký Docker khác mà bạn có quyền truy cập. Để đẩy image lên Docker Hub hoặc bất kỳ sổ đăng ký Docker nào khác, bạn phải có tài khoản ở đó.

Phần này hướng dẫn bạn cách đẩy hình ảnh Docker lên Docker Hub. Để tìm hiểu cách tạo sổ đăng ký Docker riêng của bạn, hãy xem Cách thiết lập sổ đăng ký Docker riêng trên Ubuntu 14.04.

Để đẩy image của bạn, trước tiên hãy đăng nhập vào Docker Hub:
```command
docker login -u <^>docker-registry-username<^>
```

Bạn sẽ được nhắc xác thực bằng mật khẩu Docker Hub của mình. Nếu bạn chỉ định đúng mật khẩu, quá trình xác thực sẽ thành công.

<$>[note]
**Lưu ý:** Nếu tên người dùng đăng ký Docker của bạn khác với tên người dùng cục bộ mà bạn đã sử dụng để tạo image, bạn sẽ phải gắn thẻ hình ảnh của mình bằng tên người dùng đăng ký. Đối với ví dụ được đưa ra ở bước cuối cùng, bạn sẽ nhập:
```command
docker tag <^>sammy<^>/ubuntu-nodejs <^>docker-registry-username<^>/ubuntu-nodejs
```
<$>

Sau đó, bạn có thể đẩy image của mình bằng cách sử dụng:
```command
docker push <^>docker-registry-username<^>/ubuntu-nodejs
```

Để đẩy image `ubuntu-nodejs` vào kho lưu trữ **sammy**, lệnh sẽ là:
```command
docker push <^>sammy<^>/<^>ubuntu-nodejs<^>
```

Quá trình này có thể mất một thời gian để hoàn tất khi tải image lên, nhưng khi hoàn tất, đầu ra sẽ trông như thế này:
```
[secondary_label 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 đẩy image vào sổ đăng ký, image đó sẽ được liệt kê trên bảng điều khiển tài khoản của bạn, giống như hình ảnh hiển thị bên dưới.

![description image](https://media.cloudfly.vn/posts/ec2vX3Z.png)

Nếu nỗ lực đẩy dẫn đến lỗi sau, có khả năng là bạn chưa đăng nhập:
```
[secondary_label 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, sau đó lặp lại nỗ lực đẩy.

## Kết luận

Trong hướng dẫn này, bạn đã học được những điều 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 nguồn mở, Docker được xây dựng từ một cơ sở mã phát triển nhanh, 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.
