Docker

  • Sử dụng docker-compose để cài đặt laravel – nginx – mysql -php

    Giới thiệu

    Trong những năm qua, Docker trở thành 1 giải pháp thường xuyên được sử dụng để triển khai nhanh các ứng dụng nhờ vào đơn giản hóa việc chạy và triển khai các ứng dụng trong container (thùng chứa). Khi chúng ta sử dụng LEMP, ví dụ, với PHP, Nginx, MysqlLaravel framework, Docker có thể đơn giản hóa quá trình thiết lập

    Docker Compose đã đơn giản hóa hơn nữa quá trình phát triển bằng cách cho phép các nhà phát triển xác định cơ sở hạ tầng của họ, bao gồm các dịch vụ ứng dụng (application services), mạng (networks) và khối lượng (volums), trong một file duy nhất. Docker Compose cung cấp một giải pháp thay thế hiệu quả để chạy nhiều lệnh tạo vùng chứa docker và các lệnh chạy container của docker.

    Trong hướng dẫn này, bạn sẽ xây dựng một ứng dụng web Laravel, với Nginx là máy chủ web và MySQL là cơ sở dữ liệu, tất cả bên trong các container Docker. Bạn sẽ xác định toàn bộ cấu hình  trong tệp soạn thảo docker, cùng với các tệp cấu hình cho PHP, MySQLNginx.

    Nếu bạn chưa cài docker và docker-compose thì hãy xem qua bài này nhé

    Cài đặt docker trên Ubuntu 18.04

    Bước 1 — Tải Laravel và cài đặt các Dependencies

    Ở bước này, chúng ta cài đặt Laravel, các bạn có thể vào doc của Laravel để xem lại cách cài tại đây 

    Đầu tiên, các bạn vào thư mục làm việc của các bạn (ở đây tôi chọn /var/www) sau đó tiến hành clone code Laravel về với lệnh

    
    cd ~
    git clone https://github.com/laravel/laravel.git laravel-app
    

    Đi vào thư mục laravel-app vừa được tạo ra

    
    docker run --rm -v $(pwd):/app composer install
    

    Tiếp theo, sử dụng Docker composer image để mount (gắn kết) các thư mục mà bạn cần trong project và tránh việc phải cài Composer globally

    Sử dụng -v và -rm với docker run tạo ra các container, các container này sẽ được kết nối với thư mục của bạn hiện tại trước khi bị xóa. Việc này sẽ copy thư mục laravel-app của bạn vào container và đảm bảo rằng thư mục vendor được tạo bên trong là bản copy của thư mục gốc của bạn

    Cuối cùng, ta cấp quyền trên thư mục project với quyền non-root user

    
    sudo chown -R $USER:$USER ~/laravel-app
    

     

    Bước 2 — Tạo Docker Compose File

    Xây dựng các ứng dụng của bạn với Docker Compose sẽ giúp bạn đơn giản hóa việc phải thiết lập hạ tầng. Để thiết lập ứng dụng Laravel, chúng ta sẽ một file docker-compose để xác định web server, database và các service của ứng dụng.

    Trong thư mục laravel-app, chúng ta tạo file docker-composer.yml với nội dung sau:

     

    
    version: '3'
    services:
    
    #PHP Service
    app:
    build:
    context: .
    dockerfile: Dockerfile
    image: digitalocean.com/php
    container_name: app
    restart: unless-stopped
    tty: true
    environment:
    SERVICE_NAME: app
    SERVICE_TAGS: dev
    working_dir: /var/www
    volumes:
    - ./:/var/www
    - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
    networks:
    - app-network
    
    #Nginx Service
    webserver:
    image: nginx:alpine
    container_name: webserver
    restart: unless-stopped
    tty: true
    ports:
    - "80:80"
    - "443:443"
    volumes:
    - ./:/var/www
    - ./nginx/conf.d/:/etc/nginx/conf.d/
    networks:
    - app-network
    
    #MySQL Service
    db:
    image: mysql:5.7.22
    container_name: db
    restart: unless-stopped
    tty: true
    ports:
    - "3306:3306"
    environment:
    MYSQL_DATABASE: laravel
    MYSQL_ROOT_PASSWORD: your_mysql_root_password
    SERVICE_TAGS: dev
    SERVICE_NAME: mysql
    volumes:
    - dbdata:/var/lib/mysql/
    - ./mysql/my.cnf:/etc/mysql/my.cnf
    networks:
    - app-network
    
    #Docker Networks
    networks:
    app-network:
    driver: bridge
    #Volumes
    volumes:
    dbdata:
    driver: local
    

    Giải thích file docker-compose.yml 1 chút, ở đây chúng ta xác định có 3 services là : app, webserver,database

    • app: định nghĩa này chứa ứng dụng Laravel và chạy 1 custom Docker image, digitalocean.com/php, cái này được chỉ ra tại Bước 4, nó thiết lập working_dir trong container tới thư mục /var/www
    • webserver: định nghĩa của dịch vụ này sẽ pull image nginx:alpine từ docker và  chạy trên cổng 80 và 443
    • db: định nghĩa của dịch vụ được pull về từ image mysql:5.7.22 từ Docker và đã xác định được 1 vài biến môi trường bao gồm cả database được thiết lập cho ứng dụng của bạn được đặt tên là laravel ( đây là name database), đồng thời kèm theo password root cho database, bạn có thể đặt tên khác cho database và đặt password mà bạn muốn. Service này sẽ map port 3306 trên host tới port 3306 trên container
    • container_name: để xác định ten của container, tương ứng với tên của dịch vụ, nếu bạn không chỉ định tên, Docker sẽ gán tên cho mỗi container đó
    • app-network: để tạo kết nối giữa các container, các dịch vụ sẽ được kết nối qua app-network
    • dbdata: là 1 volume tồn tại nội dung của folder /var/lib/mysql bên trong container. Điều này cho phép bạn dừng và khởi động service db mà không bị mất dữ liệu, ở cuối file docker-compose.yml ta cũng thấy có dbdata, với định nghĩa này, ta có thể sử dụng volumn này qua nhiều services
    Dùng để mount ~/laravel-app/mysql/my.cnf trên thư mục project tới /etc/mysql/my.cnf trên container
    Đầu tiên là để mount code từ thư mục project  ~/laravel-app vào thư mục /var/www nằm trên container, tiếp theo là các file config sẽ được add từ ~/laravel-app/nginx/conf.d/ vào thư mục cấu hình nginx /etc/nginx/conf.d/ trên container, việc này cho phép bạn sửa đổi config trên thư mục khi cần
    app service sẽ mount thư mục ~/laravel-app, nơi chứa code ứng dụng, tới thư mục /var/www trên container, và bạn có thể map file cấu hình của PHP từ ~/laravel-app/php/local.ini tới /usr/local/etc/php/conf.d/local.ini trên container

    Bước 3 — Tạo Dockerfile

    các bạn tạo 1 file là Dockerfile và được lưu tại ~/laravel-app, nội dung của file như sau

    
    FROM php:7.2-fpm
    
    # Copy composer.lock and composer.json
    COPY composer.lock composer.json /var/www/
    
    # Set working directory
    WORKDIR /var/www
    
    # Install dependencies
    RUN apt-get update && apt-get install -y \
        build-essential \
        default-mysql-client \
        libpng-dev \
        libjpeg62-turbo-dev \
        libfreetype6-dev \
        locales \
        zip \
        jpegoptim optipng pngquant gifsicle \
        vim \
        unzip \
        git \
        curl
    
    # Clear cache
    RUN apt-get clean && rm -rf /var/lib/apt/lists/*
    
    # Install extensions
    RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl
    RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/
    RUN docker-php-ext-install gd
    
    # Install composer
    RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
    
    # Add user for laravel application
    RUN groupadd -g 1000 www
    RUN useradd -u 1000 -ms /bin/bash -g www www
    
    # Copy existing application directory contents
    COPY . /var/www
    
    # Copy existing application directory permissions
    COPY --chown=www:www . /var/www
    
    # Change current user to www
    USER www
    
    # Expose port 9000 and start php-fpm server
    EXPOSE 9000
    CMD ["php-fpm"]
    

     

    Giải thích file Dockerfile 1 chút

    Đầu tiên Dockerfile tạo 1 image trên cùng của 1 Docker image là php:7.2-fpm, image này đã được cài sẵn php-fpm

    RUN để thực hiện việc update, install và cấu hình bên trong 1 container, bao gồm cả việc chỉ ra user và group www

    WORKDIR chỉ ra thư mục làm việc dành cho ứng dụng trên container.

    Tạo một người dùng và nhóm chuyên dụng với các quyền hạn chế sẽ giảm thiểu lỗ hổng vốn có khi chạy các container Docker, vì mặc định là root. Thay vì chạy container này với quyền root, chúng tôi đã tạo user www, người có quyền truy cập đọc / ghi vào thư mục /var/www thông qua lệnh COPY và kèm theo –chown để sao chép quyền của thư mục ứng dụng .

    Cuối cùng, lệnh EXPOSE hiển thị một cổng trong container, 9000, cho máy chủ php-fpm. CMD chỉ định lệnh sẽ chạy khi container được tạo. Ở đây, CMD chỉ định “php-fpm”, sẽ khởi động máy chủ.

    Bước 4 — Cấu hình PHP

    Bây giờ bạn xác định cơ sở hạ tầng thông qua docker-compose.yml, bạn có thể cấu hình dịch vụ PHP để hoạt động xử lý các yêu cầu đến từ Nginx

    Để cấu hình PHP, bạn sẽ tạo tệp local.ini bên trong thư mục ~/laravel-app/php. Đây là tệp mà bạn đã gắn kết với /usr/local/etc/php/conf.d/local.ini bên trong vùng chứa trong Bước 2. Tạo tệp này sẽ cho phép bạn ghi đè tệp php.ini mặc định mà PHP đọc khi nó bắt đầu khởi động

    Các chỉ thị upload_max_filesizepost_max_size đặt kích thước tối đa được phép cho các tệp đã tải lên và trình bày cách bạn có thể đặt cấu hình php.ini từ tệp local.ini của mình. Bạn có thể đặt bất kỳ cấu hình dành riêng cho PHP nào mà bạn muốn ghi đè vào tệp local.ini.

    Step 5 — Cấu hình Nginx

    Để cấu hình cho nginx, bạn tạo 1 file app.conf bên trong thư mục ~/laravel-app/nginx/conf.d/, với nội dung

    
    server {
        listen 80;
        index index.php index.html;
        error_log  /var/log/nginx/error.log;
        access_log /var/log/nginx/access.log;
        root /var/www/public;
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass app:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
        location / {
            try_files $uri $uri/ /index.php?$query_string;
            gzip_static on;
        }
    }
    

    Bước 6 — Cấu hình MySQL

    Tạo file my.cnf bên trong thư mục ~/laravel-app/mysql với nội dung

    
    [mysqld]
    general_log = 1
    general_log_file = /var/lib/mysql/general.log
    

    Bước 7 — Chạy các container và sửa cấu hình môi trường

    Bây giờ bạn đã xác định tất cả các dịch vụ của mình trong docker-compose và tạo các tệp cấu hình cho các dịch vụ này, bạn có thể khởi động các container. Tuy nhiên, là bước cuối cùng, chúng ta sẽ tạo file .env từ .env.example để xác định môi trường trong ứng dụng Laravel

    cp .env.example .env

    chúng ta sẽ cấu hình cụ thể khi chúng ta bắt đầu chạy container

    Với tất cả các dịch vụ được xác định trong tệp docker-compose, bạn chỉ cần đưa ra một lệnh duy nhất để bắt đầu tất cả các vùng chứa, tạo khối lượng và thiết lập và kết nối các mạng:

    
    docker-compose up -d
    

    Khi bạn chạy docker-compose lần đầu tiên, nó sẽ tải xuống tất cả các hình ảnh Docker cần thiết. Khi hình ảnh được tải xuống và lưu trữ trong máy cục bộ của bạn, Compose sẽ tạo các thùng chứa của bạn. Cờ -d để nói rằng, việc chạy các container là chạy ngầm.

    Bạn có thể sửa đổi cấu hình .env trong container bằng lệnh docker-compose exec ví dụ để mở file .env ta dùng

    docker-compose exec app nano .env

    ngoài ra các bạn chạy thêm

    docker-compose exec app php artisan key:generate

    docker-compose exec app php artisan config:cache

    Kết quả các bạn sẽ thấy như sau:

     

     

    Chúc các bạn thành công

    Nguồn:

    https://www.digitalocean.com/community/tutorials/how-to-set-up-laravel-nginx-and-mysql-with-docker-compose

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

    Giới thiệu về Docker

    Docker là một dự án mã nguồn mở giúp tự động triển khai các ứng dụng LinuxWindows vào trong các container ảo hóa.

    Docker cung cấp một lớp trừu tượng và tự động ảo hóa dựa trên Linux. Docker sử dụng những tài nguyên cô lập của Linux như cgroups, kernel, quản lý tệp để cho phép các container chạy độc lập bên trong một thực thể Linux

    Trong hướng dẫn này, bạn sẽ cài đặt và sử dụng Docker Community Edition (CE) trên Ubuntu 18.04. Bạn sẽ tự cài đặt Docker, làm việc với các container và hình ảnh và đẩy image lên Docker Repository.

    Chuẩn bị :

    Để làm theo hướng dẫn này bạn cần chuẩn bị :

    • Một server Ubuntu 18.04, bao gồm 1 user none-root có quyền sudo, firewall.
    • 1 tài khoản trên Docker Hub nếu bạn muốn tạo image riêng của mình và đẩy lên Docker Hub ( bước 7, 8 trong bài này).

    Step 1 — Cài đặt Docker

    Gói cài đặt Docker có sẵn trên Ubuntu repository nhưng có thể không phải bản mới nhất. Để cài đặt bản mới nhất của Docker, chúng ta cần cài đặt từ Docker repository.

    Các bước cài đặt Dọcker:

     
     # Update your existing list of packages:
     $ sudo apt update
    
     # Next, install a few prerequisite packages which let apt use packages over HTTPS:
     $ sudo apt install apt-transport-https ca-certificates curl software-properties-common
    
     # Then add the GPG key for the official Docker repository to your system:
     $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    
     # Add the Docker repository to APT sources:
     $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
    
     # Next, update the package database with the Docker packages from the newly added repo:
     $ sudo apt update
    
     # Make sure you are about to install from the Docker repo instead of the default Ubuntu repo:
     $ apt-cache policy docker-ce
    
    

    Bạn sẽ thấy kết quả của lệnh apt-cache policy docker-ce

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

    Chú ý rằngdocker-ce chưa được cài đặt, nhưng một bản khác cho việc cài đặt từ Docker Repository trên Ubuntu 18.04 (bionic).

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

    sudo apt install docker-ce

    Docker đã được cài đặt, để check xem Docker đã hoạt động chưa, ta dùng

    sudo systemctl status docker

    Kết quả là:

    Output
    ● docker.service - Docker Application Container Engine
       Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
       Active: active (running) since Thu 2018-07-05 15:08:39 UTC; 2min 55s ago
         Docs: https://docs.docker.com
     Main PID: 10096 (dockerd)
        Tasks: 16
       CGroup: /system.slice/docker.service
               ├─10096 /usr/bin/dockerd -H fd://
               └─10113 docker-containerd --config /var/run/docker/containerd/containerd.toml
    

     

    Như vậy việc cài đặt docker đã xong, bây giờ chúng ta tiến hành khám phá các câu lệnh trong docker

    Step 2 — Thực thi các câu lệnh Docker mà không cần sudo (Tuỳ chọn)

    Theo mặc định, lệnh docker chỉ có thể được chạy bởi người dùng root hoặc bởi người dùng trong group docker, được tạo tự động trong quá trình cài đặt Docker. Nếu bạn cố chạy lệnh docker mà không có tiền tố với sudo hoặc không có trong nhóm docker, bạn sẽ nhận được một đầu ra như thế này:

    
    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 gõ sudo bất cứ khi nào bạn chạy lệnh docker, hãy thêm tên người dùng của bạn vào nhóm docker:

    sudo usermod -aG docker ${USER}

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

    su - ${USER}

    Bạn sẽ được nhắc nhập mật khẩu người dùng để tiếp tục.

    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:

    id -nG
    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:

    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 group docker. Nếu bạn chọn không, vui lòng thêm các lệnh bằng sudo.

    Hãy khám phá lệnh docker tiếp theo.

    Step 3 — Sử dụng Docker Command

    Using docker consists of passing it a chain of options and commands followed by arguments. The syntax takes this form:

    docker [option] [command] [arguments]

    Để xem các lệnh trong docker ta dùng lệnh:

    $ docker

    Kể từ Docker 18, danh sách đầy đủ các tiểu ban 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 tùy chọn có sẵn cho một lệnh cụ thể:

    docker docker-subcommand --help

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

    docker info

    Hãy khám phá một số các lệnh này. Chúng ta sẽ bắt đầu bằng cách làm việc với image trong docker.

    Step 4 — Làm việc với Docker Images

    Docker container được xây dựng từ Docker image. Theo mặc định, Docker lấy các image này từ Docker Hub. Bất cứ ai cũng có thể lưu trữ Docker image 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 sẽ có image được lưu trữ ở đó.

    Để kiểm tra xem bạn có thể truy cập và tải hình ảnh từ Docker Hub:

    docker run hello-world
    Output
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    9bb5a5d4561a: Pull complete
    Digest: sha256:3e1764d0f546ceac4565547df2ac4907fe46f007ea229fd7ef2718514bcec35d
    Status: Downloaded newer image for hello-world:latest
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    ...
    

    Docker ban đầu không thể tìm thấy image hello-world, vì vậy nó đã tải xuống hình ảnh từ Docker Hub, là kho lưu trữ mặc định. Khi hình ảnh được tải xuống, Docker đã tạo một vùng chứa từ hình ảnh và ứng dụng trong vùng chứa được thực thi, hiển thị thông báo.

    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 search . Ví dụ: để tìm kiếm hình ảnh Ubuntu, hãy gõ:

    docker search ubuntu

    Tập lệnh sẽ thu thập dữ liệu Docker Hub và trả về một 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:

    Output
    NAME                                                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
    ubuntu                                                    Ubuntu is a Debian-based Linux operating sys…   7917                [OK]
    dorowu/ubuntu-desktop-lxde-vnc                            Ubuntu with openssh-server and NoVNC            193                                     [OK]
    rastasheep/ubuntu-sshd                                    Dockerized SSH service, built on top of offi…   156                                     [OK]
    ansible/ubuntu14.04-ansible                               Ubuntu 14.04 LTS with ansible                   93                                      [OK]
    ubuntu-upstart                                            Upstart is an event-based replacement for th…   87                  [OK]
    neurodebian                                               NeuroDebian provides neuroscience research s…   50                  [OK]
    ubuntu-debootstrap                                        debootstrap --variant=minbase --components=m…   38                  [OK]
    1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5      ubuntu-16-nginx-php-phpmyadmin-mysql-5          36                                      [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…   13
    ppc64le/ubuntu                                            Ubuntu is a Debian-based Linux operating sys…   12
    1and1internet/ubuntu-16-apache-php-7.0                    ubuntu-16-apache-php-7.0                        10                                      [OK]
    1and1internet/ubuntu-16-nginx-php-phpmyadmin-mariadb-10   ubuntu-16-nginx-php-phpmyadmin-mariadb-10       6                                       [OK]
    eclipse/ubuntu_jdk8                                       Ubuntu, JDK8, Maven 3, git, curl, nmap, mc, …   6                                       [OK]
    codenvy/ubuntu_jdk8                                       Ubuntu, JDK8, Maven 3, git, curl, nmap, mc, …   4                                       [OK]
    darksheer/ubuntu                                          Base Ubuntu Image -- Updated hourly             4                                       [OK]
    1and1internet/ubuntu-16-apache                            ubuntu-16-apache                                3                                       [OK]
    1and1internet/ubuntu-16-nginx-php-5.6-wordpress-4         ubuntu-16-nginx-php-5.6-wordpress-4             3                                       [OK]
    1and1internet/ubuntu-16-sshd                              ubuntu-16-sshd                                  1                                       [OK]
    pivotaldata/ubuntu                                        A quick freshening-up of the base Ubuntu doc…   1
    1and1internet/ubuntu-16-healthcheck                       ubuntu-16-healthcheck                           0                                       [OK]
    pivotaldata/ubuntu-gpdb-dev                               Ubuntu images for GPDB development              0
    smartentry/ubuntu                                         ubuntu with smartentry                          0                                       [OK]
    ossobv/ubuntu
    ...
    
    

    Ở cột OFFICIAL , OK chỉ ra image được xây dựng và hỗ trợ bởi 1 công ty bên cạnh project đó. Khi bạn xác định được image nào bạn muốn sử dụng thì bạn có thể down nó về sử dụng câu lệnh pull

    Thực thi câu lệnh để tải image ubuntu về máy:

    docker pull ubuntu

    Kết quả:

    Using default tag: latest
    latest: Pulling from library/ubuntu
    6b98dfc16071: Pull complete
    4001a1209541: Pull complete
    6319fc68c576: Pull complete
    b24603670dc3: Pull complete
    97f170c87c6f: Pull complete
    Digest: sha256:5f4bdc3467537cbbe563e80db2c3ec95d548a9145d64453b06939c4592d67b6d
    Status: Downloaded newer image for ubuntu:latest
    

    Sau khi tải image, bạn có thể chạy container đang sử dụng image vừa được tải xuống bằng lệnh run. Như bạn thấy với ví dụ hello-world, nếu một image chưa được tải xuống khi docker thực thi với lệnh run, Docker sẽ down image đó và sau đó chạy container để xử dụng nó.

    Để thấy image vừa được tải về máy, sử dụng:

    docker images

    Kết quả:

    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    ubuntu              latest              113a43faa138        4 weeks ago         81.2MB
    hello-world         latest              e38bc07ac18e        2 months ago        1.85kB
    

    Như bạn sẽ thấy sau trong 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 (đẩy là thuật ngữ kỹ thuật) vào Docker Hub hoặc các đăng ký Docker khác.

    Hãy xem cách chạy container chi tiết hơn.

     

    Step 5 — Chạy Docker Container

    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  -i-t cung cấp cho bạn quyền bằng lệnh shell truy cập container:

    docker run -it ubuntu

    Lệnh trên của bạn sẽ thay đổi để phản ánh thực tế rằng bạn hiện đang làm việc bên trong container và sẽ ở dạng này:

    Kết quả:
    [email protected]:/#
    

    Lưu ý id container trong dấu nhắc lệnh. Trong ví dụ này, nó là d9b100f2f636. Bạn sẽ cần ID container đó sau để 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 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ố vào bất kỳ lệnh nào với sudo, vì bạn đang hoạt động bên trong vùng chứa với tư cách là người dùng root:

    apt update

    Then install any application in it. Let’s install Node.js:

    apt install nodejs

    Điều này cài đặt Node.js trong kho lưu trữ chính thức của Ubuntu. Khi quá trình cài đặt kết thúc, kiểm tra lại node.js được cài đặt:

    node -v

    Bạn sẽ nhìn thấy version vừa được cài đặt

    v8.10.0
    

    Bất cứ thay đổi nào của bạn trong container chỉ áp dụng cho container đó.

    Để thoát khỏi container, dùng lệnh exit:

    Hãy xem xét việc quản lý các container trên hệ thống:

    Step 6 — Quản lý Docker Containers

    Sau khi sử dụng Docker một thời gian, bạn sẽ có nhiều thùng chứa 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 người đang hoạt động, 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, chúng ta dùng 2 containerhello-world imageubuntu image. Cả 2 container đều đang không chạy, nhưng vẫn tồn tại trên hệ thống, để xem toàn bộ container, đang hoạt động và không hoạt động ta dùng lệnh docker ps -a

    docker ps -a

    Kết quảquả:

    d9b100f2f636        ubuntu              "/bin/bash"         About an hour ago   Exited (0) 8 minutes ago                           sharp_volhard
    01c950718166        hello-world         "/hello"            About an hour ago   Exited (0) About an hour ago                       festive_williams
    
    

    Để nhìn container mới nhất mà bạn tạo, xử dụng docker ps -l

    docker ps -l
    
    CREATED             STATUS                      PORTS               NAMES
    d9b100f2f636        ubuntu              "/bin/bash"         About an hour ago   Exited (0) 10 minutes ago                       sharp_volhard
    

    Để khởi động 1 container đang không hoạt động, sử dụng docker start, theo sau là ID của container. ví dụ chúng ta muốn start container có ID là d9b100f2f636

    docker start d9b100f2f636

    Container sẽ start, và bạn có thể dùng docker ps để check trạng thái của nó:

    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    d9b100f2f636        ubuntu              "/bin/bash"         About an hour ago   Up 8 seconds                            sharp_volhard
    
    

    Để dừng container đang chạy, sử dụng docker stop, theo sau là ID hay tên của docker. Bạn có thể xử dụng name để thay cho ID của container, ở đây chúng ta dùng tên là sharp_volhard:

    docker stop sharp_volhard

    Khi bạn đã quyết định rằng bạn không còn cần một 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 name. Sử dụng lệnh docker ps -a để tìm ID container hoặc tên cho vùng chứa được liên kết với image hello-world và xóa nó.

    docker rm festive_williams

    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 khóa chuyển đổi –name. Bạn cũng có thể sử dụng –rm để tạo 1 container có thể tự xoá khi dừng hoạt động. Xem lệnh trợ giúp chạy docker để 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 biến thành các hình ảnh mà bạn có thể sử dụng để xây dựng các container mới. Hãy xem cách nó hoạt động.

    Step 7 — Committing Changes in a Container to a Docker Image

    Khi bắt đầu xử dụng Docker image, bạn có thể tạo, sửa và xoá file

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

    Trong phần hướng dẫn này cho bạn biết cách lưu trạng thái của một container dưới dạng Docker image mới.

    Sau khi cài đặt Node.js bên trong Ubuntu container, bây giờ bạn có một container chạy image, nhưng container khác với image bạn đã sử dụng để tạo nó. 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.

    Sau đó, commit các thay đổi tới Docker image instance sử dụng lệnh:

    docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name
    

    Sử dung -m để đưa lên message giúp bạn hay bất kì ai đó biết bạn đang thay đổi gì, -a được sử dụng để biết về tác giả. container_id là cái bạn đã được lưu ý trong hướng dẫn khi bắt đầu dùng Docker. Trừ khi bạn tạo các kho lưu trữ bổ xung trên Docker Hub, các repository thường là username Docker Hub của bạn.

    Ví dụ, có 1 account là sammy, với container IDd9b100f2f636 :

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

    Khi bạn commit 1 image, image mới được lưu local tại máy tính của bạn. Sau đây trong hướng dẫn này, bạn sẽ học được cách đưa 1 image lên Docker registry giống như Docker Hub để người khác có thể truy cập nó.

    Liệt kê lại các hình ảnh Docker sẽ hiển thị hình ảnh mới, cũng như hình ảnh cũ mà nó được lấy từ:

    docker images
    REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
    sammy/ubuntu-nodejs   latest              7c1f35226ca6        7 seconds ago       179MB
    ubuntu                   latest              113a43faa138        4 weeks ago         81.2MB
    hello-world              latest              e38bc07ac18e        2 months ago        1.85kB
    
    

     

    Trong ví dụ trên, ubuntu-nodejs là 1 image mới, được lấy từ image ubuntu đã có sẵn trên Docker Hub. Sự khác biệt kích cỡ phản ánh những thay đổi đã được thực hiện. Và trong ví dụ, sự thay đổi là việc Nodejs đã được cài đặt. Vì vậy, lần tới khi bạn cần chạy một container bằng Ubuntu với NodeJS được cài đặt sẵn, bạn chỉ việc sử dụng hình ảnh mới.

    Bạn cũng có thể xây dựng Hình ảnh từ Dockerfile, cho phép bạn tự động hóa việc cài đặt phần mềm trong một hình ảnh mới. Tuy nhiên, đó là 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 các container từ nó.

    Step 8 — Pushing Docker Images to a Docker Repository

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

    Phần này cho bạn biết cách đẩy hình ảnh Docker lên Docker Hub.

    Để push được image, bạn cần login docker:

    docker login -u docker-registry-username

    Bạn sẽ được nhắc xác thực bằng mật khẩu Docker Hub. Nếu bạn điền đúng đúng mật khẩu, xác thực sẽ thành công.

    Chú ý: nếu tên đăng nhập Docker registry của bạn khác so với tên đăng nhập trên local bạn sử dụng để tạo image, bạn sẽ phải gắn thẻ image với tên đăng nhập đăng ký của bạn. Ví dụ như sau:

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

    Sau đó bạn có thể đẩy image bằng cách:

    docker push docker-registry-username/docker-image-name

    Để đẩy ubuntu-nodejs image tới sammy repository, bạn sử dụng:

    docker push sammy/ubuntu-nodejs

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

    The push refers to a repository [docker.io/sammy/ubuntu-nodejs]
    e3fbbfb44187: Pushed
    5f70bf18a086: Pushed
    a3b5c80a4eba: Pushed
    7f18b442972b: Pushed
    3ce512daaf78: Pushed
    7aae4540b42d: Pushed
    
    ...
    
    
    

    Sau khi đẩy image vào sổ đăng ký, nó sẽ được liệt kê trên bảng điều khiển của tài khoản của bạn, giống như hiển thị trong hình ảnh bên dưới.

    Nếu một nỗ lực đẩy dẫn đến một lỗi loại này, thì có khả năng bạn đã không đă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 lại với docker login và thực hiện lại việc đăng nhập. Sau đó xác minh rằng nó tồn tại trên trang kho Docker Hub của bạn.

    Bạn có thể dùng docker pull sammy/ubuntu-nodejs để tải image tới một máy mới và sử dụng và chạy một container mới.

    Kết luận

    Trong hướng dẫn này, bạn đã cài đặt Docker, làm việc với image và container, và đẩy một image được sửa đổi vào Docker Hub.

     

    Source:

    https://www.digitalocean.com/community/tutorials/how-to-các công tắcinstall-and-ucác công tắcse-docker-on-ubuntu-18-04

Close