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:
● 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:
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
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:
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:
... 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:
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:
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 và -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:
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:
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:
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:
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
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:
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:
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:
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.
Nếu push lên có lỗi sau, thì có thể là bạn chưa đăng nhập:
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
Tạo chứng chỉ Tự ký cho Apache trên Ubuntu 18-04 2018-07-05
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
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