Docker基础知识 (6) - 使用 Docker 部署常用的应用程序

 

在 DockerHub (https://hub.docker.com/) 选择镜像时,我们需要了解 Docker 镜像类型之间的差异,以便为应用程序或脚本选择正确的 Docker 镜像。

Docker 镜像类型之间的区别在于底层的操作系统,以下是每种类型的介绍。

    (1)Full Official Image(完整官方镜像)

        根据 DockerHub 的描述,这些镜像是事实上的标准镜像。以 https://hub.docker.com/_/python?tab=tags 为例,比如:

            python:3.9
            python:3.8

        这些镜像基于最新的稳定 Debian 操作系统的发行版。试图让一个项目快速启动和运行时,通常会从其中选一个。

    (2) buster/stretch/jessie

        带有 buster、stretch 或 jessie 标签的镜像是不同 Debian 发行版的代号。比如:

            buster:Debian 10
            stretch:Debian 9
            jessie:Debian 8

        当前稳定的 Debian 发行版是 10.4,它的代号是 “buster”。 “stretch” 是所有版本 9 变种的代号,“jessie” 是所有版本 8 变种的代号。

        正在开发的未来版本是 “bullseye” 和 “bookworm”,但还不稳定。可能会在 DockerHub 上的镜像版本列表中看到这些标签。

        如果您的代码与 Debian 操作系统的特定版本兼容,请选择其中一个镜像。在开始一个新项目时,很少需要使用旧版本的Debian。

    (3) slim

        slim 镜像是完整镜像的减配版本。这个镜像通常只安装运行特定工具所需的最小包。以 python 为例,就是运行python 的最小包,其它应用同理。

        通过省去较少使用的工具,镜像会更小。如果有空间限制且不需要完整版本,请使用此镜像。

        注:在使用这种类型镜像时,一定要进行完整的测试!如果遇到无法解决的异常,请尝试切换到完整的镜像,看看是否能够解决问题。

    (4) alpine

        alipine 镜像基于 alpine linux 项目,这是一个专门为容器内部使用而构建的操作系统。在很长一段时间里,这些是最受欢迎的镜像变体,因为它们的尺寸很小。

        然而,一些团队正在弃用 alpine 镜像,因为这些镜像可能会导致难以调试的兼容性问题。具体来说,如果使用 python 镜像,一些 wheels 将被构建成与 Debian 兼容,并且需要重新编译,才能与基于apline的镜像一起工作。

        使用 alpine 镜像的主要原因是使你得到的镜像尽可能小。基础镜像将小于 5MB。python 基础镜像(将 python 添加到基础 alpine 镜像)目前是 78.9MB。这仍然很小。

        如果考虑到空间问题,推荐使用此类型镜像。

    (5) windowsservercore

        运行在 Windows 或 Windows Server 的镜像,一般很少使用。

选择镜像的基本准则:

    (1) 如果需要快速启动并运行项目,没有空间限制,并且没有时间进行太多测试,那么使用 Full Official Image(完整官方镜像);
    (2) 如果空间是一个问题,并且需要最小的包来运行特定的语言,如 python,可以选择 slim;
    (3) 对于一些有时间彻底测试的项目,并且有极端的空间限制,可以使用alpine镜像。但是要注意,这可能会导致更长的构建时间和不确定的 bug;
    (4) 滚动到特定镜像的 DockerHub 页面底部,阅读有关选择镜像的建议;
    (5) 不要在生产系统 Dockerfile 中使用 <image>:latest。这样做将总是获取最新的镜像,并且应用程序的依赖项可能与未来的版本不兼容。

本文演示使用 Docker  部署 Ubuntu、CentOS、Nginx、Apache、Tomcat、Redis、MariaDB(MySQL)、Python、PHP、NodeJS、Java 和 Golang。


1. 部署 Ubuntu

    Ubuntu 是基于 Debian 的 Linux 操作系统。

    Ubuntu: https://ubuntu.com/
    GitHub: https://github.com/ubuntu


    1) 查看可用的 Ubuntu 版本
    
        访问 Ubuntu 镜像库地址: https://hub.docker.com/_/ubuntu?tab=tags&page=1。

        可以通过 Sort by 查看其他版本的 Ubuntu,默认是最新版本 ubuntu:latest。

        可以在下拉列表中找到其他想要的版本,也可以用 docker search 命令来查看可用版本:

            $ docker search ubuntu

    2) 拉取 ubuntu 镜像
    
        $ docker pull ubuntu   # 相当于 docker pull ubuntu:latest
        $ docker images        # 查看镜像列表

    3) 运行容器,并且可以通过 exec 命令进入 ubuntu 容器

        $ docker run -d --name ubuntu-test ubuntu
        $ docker ps  # 查看运行的容器列表
        $ docker exec -it ubuntu-test /bin/bash


2. 部署 CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux(RHEL) 依照开放源代码规定发布的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定性的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。

    CentOS: https://www.centos.org/
    GitHub: https://github.com/CentOS


    1) 查看可用的 CentOS 版本

        访问 CentOS 镜像库地址:https://hub.docker.com/_/centos?tab=tags&page=1。

        可以通过 Sort by 查看其他版本的 CentOS,默认是最新版本 centos:latest 。

        可以在下拉列表中找到其他想要的版本,也可以用 docker search 命令来查看可用版本:

            $ docker search centos

    2) 拉取指定版本的 CentOS 镜像
    
        $ docker pull centos:centos7   # 这里我们安装指定版本为例(centos7)
        $ docker images     # 查看镜像列表

    3) 运行容器,并且可以通过 exec 命令进入 CentOS 容器

        $ docker run -d --name centos-test centos:centos7
        $ docker ps  # 查看运行的容器列表
        $ docker exec -it centos-test /bin/bash


3. 部署 Nginx

    Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务 。

    Nginx: https://nginx.org/en/
    GitHub: https://github.com/nginx


    1) 查看可用的 Nginx 版本
    
        访问 Nginx 镜像库地址:https://hub.docker.com/_/nginx?tab=tags。

        可以通过 Sort by 查看其他版本的 Nginx,默认是最新版本 nginx:latest。

        可以在下拉列表中找到其他想要的版本,也可以用 docker search 命令来查看可用版本:

            $ docker search nginx

    2) 拉取 nginx 镜像

        $ docker pull nginx     # 相当于 docker pull nginx:latest
        $ docker images         # 查看镜像列表

    3) 运行容器

  $ docker run --name nginx-test -p 8888:80\

        -v /home/docker/nginx/html:/usr/share/nginx/html\
        -d nginx

        参数说明:

            --name nginx-test:将容器命名为 nginx-test。
            -p 8888:80:端口进行映射,将本地 8888 端口映射到容器内部的 80 端口。

    -v:将本地文件夹 /home/docker/nginx/html 与容器文件夹 /usr/share/nginx/html 挂载。在本地文件夹 /home/docker/nginx/html 放置 *.html 文件,列如:添加 test.html,内容如下:

     <h3>Nginx - Hello World!</h3>

            -d:设置容器在后台一直运行。
            nginx: 这里表示 nginx:latest,镜像:tag。

 

  $ docker ps  # 查看运行的容器列表

        浏览器访问 http://[docker 所在主机 IP]:8888/test.html,页面显示如下:

    Nginx - Hello World!


4. 部署 Apache (httpd)

    Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用,是最流行的 Web 服务器端软件之一。

    Apache httpd: https://httpd.apache.org/
    GitHub:https://github.com/apache/httpd


    1) 查看可用的 httpd 版本
    
        访问 httpd 镜像库地址:https://hub.docker.com/_/httpd?tab=tags。

        可以通过 Sort by 查看其他版本的 httpd,默认是最新版本 httpd:latest。

        可以在下拉列表中找到其他想要的版本,也可以用 docker search 命令来查看可用版本:

            $ docker search httpd

    2) 拉取 httpd 镜像

        $ docker pull httpd   # 相当于 docker pull httpd:latest
        $ docker images       # 查看镜像列表

    3) 运行容器

        $ docker run --name httpd-test -p 80:80\
                     -v /home/docker/httpd/htdocs:/usr/local/apache2/htdocs\
                     -d httpd

        参数说明:

            --name httpd-test:将容器命名为 httpd-test。
            -p 80:80: 端口进行映射,将本地 80 端口映射到容器内部的 80 端口。

    -v:将本地文件夹 /home/docker/httpd/htdocs 与容器文件夹 /usr/local/apache2/htdocs 挂载。在本地文件夹 /home/docker/httpd/htdocs 放置 *.html 文件,列如:添加 test.html,内容如下:

        <h3>Httpd - Hello World!</h3>

            -d: 设置容器在后台一直运行。

 

  $ docker ps  # 查看运行的容器列表

 

        浏览器访问 http://[docker 所在主机 IP]/test.html,页面显示如下:

     Httpd - Hello World!


5. 部署 Tomcat

    Tomcat 是应用(java)服务器,它只是一个 servlet 容器,是 Apache 的扩展。 Apache 和 Tomcat 都可以做为独立的 web 服务器来运行,但是 Apache 不能解释 java 程序(jsp,servlet)。

    Tomcat: https://tomcat.apache.org/
    GitHub: https://github.com/apache/tomcat


    1) 查看可用的 Tomcat 版本
    
        访问 tomcat 镜像库地址:https://hub.docker.com/_/tomcat?tab=tags。

        可以通过 Sort by 查看其他版本的 tomcat,默认是最新版本 tomcat:latest。

        可以在下拉列表中找到其他想要的版本,也可以用 docker search 命令来查看可用版本:

            $ docker search tomcat

    2) 拉取 tomcat 镜像

        $ docker pull tomcat   # 相当于 docker pull tomcat:latest
        $ docker images        # 查看镜像列表

    3) 运行容器

        $ docker run --name tomcat-test -p 8080:8080\
                     -v /home/docker/tomcat/webapps:/usr/local/tomcat/webapps\
                     -d tomcat  

        参数说明:

            --name tomcat-test:将容器命名为 tomcat-test。
            -p 8080:8080:端口进行映射,将本地 8080 端口映射到容器内部的 8080 端口。
            -v:将主机中/home/docker/tomcat/webapps 挂载到容器的 /usr/local/tomcat/webapps。在本地文件夹 /home/docker/tomcat/webapps 放置 *.war 文件,列如:添加 Test.war,Test.war 包含一个 JSP 文件,JSP 文件内容如下:

           <h3>Tomcat - Hello World!</h3>

            -d: 设置容器在后台一直运行。
    注:Java web 项目开发和 War 打包,可以参考 “Spring基础知识(11)- Spring MVC (一) | JavaWeb 设计模式、Spring MVC 简介和配置”。

 

  $ docker ps  # 查看运行的容器列表

 

        浏览器访问 http://[docker 所在主机 IP]:8080/Test/,页面显示如下:

      Tomcat - Hello World!

 

6. 部署 Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 的 NoSQL 数据库,并提供多种语言的 API。

    Redis: https://redis.io/
    GitHub: https://github.com/redis


    1) 查看可用的 Redis 版本
    
        访问 Redis 镜像库地址:https://hub.docker.com/_/redis?tab=tags。

        可以通过 Sort by 查看其他版本的 redis,默认是最新版本 redis:latest。

        可以在下拉列表中找到其他想要的版本,也可以用 docker search 命令来查看可用版本:

            $ docker search redis

    2) 拉取 redis 镜像

        $ docker pull redis   # 相当于 docker pull redis:latest
        $ docker images       # 查看镜像列表

    3) 运行容器,并且可以通过 exec 命令进入 redis 容器

        $ docker run -d --name redis-test -p 6379:6379 redis

        参数说明:

            --name redis-test:将容器命名为 redis-test。
            -p 6379:6379:映射容器服务的 6379 端口到宿主机的 6379 端口。
            -d: 设置容器在后台一直运行。

        $ docker ps  # 查看运行的容器列表
        
        $ docker exec -it redis-test /bin/bash

            root@a1c24a6cd008:/# redis-cli     # 通过 redis-cli 连接测试使用 redis 服务。
            127.0.0.1:6379> set test "123"
            OK


7. 部署 MariaDB(MySQL)

    MySQL 凭借其可靠性、易用性和性能,成为 Web 应用程序的数据库优先选择。 MariaDB 是 MySQL 的一个分支版本。

    MariaDB: https://mariadb.org/
    GitHub: https://github.com/MariaDB


    1) 查看可用的 MariaDB 版本
    
        访问 MariaDB 镜像库地址:https://hub.docker.com/_/mariadb?tab=tags。

        可以通过 Sort by 查看其他版本的 mariadb,默认是最新版本 mariadb:latest。

        可以在下拉列表中找到其他想要的版本,也可以用 docker search 命令来查看可用版本:

            $ docker search mariadb

    2) 拉取 mariadb 镜像

        $ docker pull mariadb   # 相当于 docker pull mariadb:latest
        $ docker images         # 查看镜像列表

    3) 运行容器,并且可以通过 exec 命令进入 mariadb 容器

        $ docker run -d --name mariadb-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mariadb

        参数说明:

            --name mariadb-test:将容器命名为 mariadb-test。
            -p 3306:3306:映射容器服务的 3306 端口到宿主机的 3306 端口。外部可以直接通过宿主机 ip:3306 访问到 mariadb 的服务。
            -e MYSQL_ROOT_PASSWORD=123456:设置 mariadb 服务 root 用户的密码。
            -d: 设置容器在后台一直运行。

        $ docker ps  # 查看运行的容器列表
        
        $ docker exec -it mariadb-test /bin/bash

            root@a1c24a6cd008:/# mysql -u root -p


8. 部署 Python

    Python 是一种主要用于服务端编程开发的脚本语言,无需编译就可以运行,重点适用于 Linux/Unix 环境的配置、部署、测试等领域,可以代替 Shell 的大部分功能。

    Python: https://www.python.org/
    Python Package Index: https://pypi.org/

 

    1) 查看可用的 Python 版本
    
        访问 Python 镜像库地址:https://hub.docker.com/_/python?tab=tags&page=1。

        可以通过 Sort by 查看其他版本的 Python,默认是最新版本 python:latest。

        可以在下拉列表中找到其他想要的版本,也可以用 docker search 命令来查看可用版本:

            $ docker search python

    2) 拉取 python 镜像

        $ docker pull python:3.8
        $ docker images         # 查看镜像列表

    3) 运行容器,并且可以通过 exec 命令进入 python 容器

        $ docker run -itd --name python-3.8 -v /home/docker/python:/home/docker/python python:3.8

        参数说明:

            --name python-3.8: 将容器命名为 python-3.8。
            -v:将本地文件夹 /home/docker/python 与容器文件夹 /home/docker/python 挂载。在本地文件夹 /home/docker/python 放置 *.py 文件,列如:添加 test.py,内容如下:

                print("Python - Hello World!")

            python:3.8:镜像:tag
            -itd:可以写成 -i -t -d,-d 表示容器启动后在后台运行,-i 表示交互,-t 表示终端。

        $ docker ps  # 查看运行的容器列表
        
        $ docker exec -it python-3.8 /bin/bash

            root@a1c24a6cd008:/# cd /home/docker/python
            root@a1c24a6cd008:/home/docker/python# python test.py
            Python - Hello World!


9. 部署 PHP

    PHP 是一种主要用于服务器端编程开发的脚本语言,无需编译就可以运行,重点适用于 Web 开发领域。

    PHP:https://www.php.net/
    GitHub:https://github.com/php

 

   1) 查看可用的 PHP 版本
    
        访问 PHP 镜像库地址:https://hub.docker.com/_/php?tab=tags。

        可以通过 Sort by 查看其他版本的 php,默认是最新版本 php:latest。

        可以在下拉列表中找到其他想要的版本,也可以用 docker search 命令来查看可用版本:

            $ docker search php

    2) 拉取 php 镜像

        $ docker pull php:7.4
        $ docker images         # 查看镜像列表

    3) 运行容器,并且可以通过 exec 命令进入 php 容器

        $ docker run -itd --name php-7.4 -v /home/docker/php:/home/docker/php php:7.4

        参数说明:

            --name php-7.4: 将容器命名为 php-7.4。
            -v:将本地文件夹 /home/docker/php 与容器文件夹 /home/docker/php 挂载。在本地文件夹 /home/docker/php 放置 *.php 文件,列如:添加 test.php,内容如下:
                <?php

                    echo "Php - Hello World!\n";
                ?>

            php:7.4:镜像:tag
            -itd:可以写成 -i -t -d,-d 表示容器启动后在后台运行,-i 表示交互,-t 表示终端。

        $ docker ps  # 查看运行的容器列表
        
        $ docker exec -it php-7.4 /bin/bash

            root@e9420c4140a6:/# cd /home/docker/php
            root@e9420c4140a6:/home/docker/php# php test.php
            Php - Hello World!


10. 部署 NodeJS

    NodeJS 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,使用了一个事件驱动、非阻塞式I/O模型, 让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与 PHP、Python、Perl、Ruby 等服务端语言平起平坐的脚本语言。

    NodeJS:https://nodejs.org/en/
    GitHub:https://github.com/nodejs

 

    1) 查看可用的 NodeJS 版本
    
        访问 NodeJS 镜像库地址:https://hub.docker.com/_/node?tab=tags。

        可以通过 Sort by 查看其他版本的 NodeJS,默认是最新版本 node:latest。

        可以在下拉列表中找到其他想要的版本,也可以用 docker search 命令来查看可用版本:

            $ docker search node

    2) 拉取 node 镜像

        $ docker pull node:18
        $ docker images         # 查看镜像列表

    3) 运行容器,并且可以通过 exec 命令进入 node 容器

        $ docker run -itd --name nodejs-18 -v /home/docker/nodejs:/home/docker/nodejs node:18

        参数说明:

            --name nodejs-18 : 将容器命名为 nodejs-18。
            -v:将本地文件夹 /home/docker/nodejs 与容器文件夹 /home/docker/nodejs 挂载。在本地文件夹 /home/docker/nodejs 放置 *.js 文件,列如:添加 test.js,内容如下:

                console.log("Nodejs - Hello World!");

            node:18:镜像:tag
            -itd:可以写成 -i -t -d,-d 表示容器启动后在后台运行,-i 表示交互,-t 表示终端。

        $ docker ps  # 查看运行的容器列表

        $ docker exec -it nodejs-18 /bin/bash
        
            root@2724565c88c7:/# cd /home/docker/nodejs
            root@2724565c88c7:/home/docker/nodejs# node test.js
            Nodejs - Hello World!


11. 部署 Java

    Java 是一门面向对象编程语言,由詹姆斯-高斯林在太阳微系统公司时发明的,后来被甲骨文公司收购了。它在1995年发布问世,目前是最受欢迎的编程语言之一。Java 可以用来开发许多场景下的应用软件,例如桌面软件、Web 应用以及移动设备软件。Java 的主要特点之一,在于它是独立于平台的,用 Java 编写的程序可以在任何操作系统上运行,如 Windows、Mac 和 Linux。

    Java: https://docs.oracle.com/en/java/
    OpenJDK GitHub:https://github.com/openjdk/jdk

    1) 查看可用的 OpenJDK 版本
    
        访问 OpenJDK 镜像库地址:https://hub.docker.com/_/openjdk?tab=tags。

        可以通过 Sort by 查看其他版本的 OpenJDK,默认是最新版本 openjdk:latest。

        可以在下拉列表中找到其他想要的版本,也可以用 docker search 命令来查看可用版本:

            $ docker search openjdk

    2) 拉取 openjdk 镜像

        $ docker pull openjdk:11
        $ docker images         # 查看镜像列表   

    3) 运行容器,并且可以通过 exec 命令进入 openjdk 容器

        $ docker run -itd --name openjdk-11 -v /home/docker/openjdk:/home/docker/openjdk openjdk:11

        参数说明:

            --name openjdk-11 : 将容器命名为 openjdk-11。
            -v:将本地文件夹 /home/docker/openjdk 与容器文件夹 /home/docker/openjdk 挂载。在本地文件夹 /home/docker/openjdk 放置 *.java 文件,列如:添加 Test.java,内容如下:

                public class Test {
                    public static void main(String[] args) {
                        System.out.println("Java - Hello world");
                    }
                }

            openjdk:11:镜像:tag
            -itd:可以写成 -i -t -d,-d 表示容器启动后在后台运行,-i 表示交互,-t 表示终端。

        $ docker ps  # 查看运行的容器列表

        $ docker exec -it openjdk-11 /bin/bash
        
            root@2724565c88c7:/# cd /home/docker/openjdk
            root@2724565c88c7:/home/docker/openjdk# javac Test.java
            root@2724565c88c7:/home/docker/openjdk# java Test
            Java - Hello world

 

12. 部署 Go

    Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。

    Golang: https://golang.google.cn/dl/

    1) 查看可用的 Golang 版本
    
        访问 Golang 镜像库地址:https://hub.docker.com/_/golang?tab=tags。

        可以通过 Sort by 查看其他版本的 Golang,默认是最新版本 golang:latest。

        可以在下拉列表中找到其他想要的版本,也可以用 docker search 命令来查看可用版本:

            $ docker search golang

    2) 拉取 golang 镜像

        $ docker pull golang:1.18
        $ docker images         # 查看镜像列表   

    3) 运行容器,并且可以通过 exec 命令进入 golang 容器

        $ docker run -itd --name golang-1.18 -v /home/docker/golang:/home/docker/golang golang:1.18

        参数说明:

            --name golang-1.18 : 将容器命名为 golang-1.18。
            -v:将本地文件夹 /home/docker/golang 与容器文件夹 /home/docker/golang 挂载。在本地文件夹 /home/docker/golang 放置 *.go 文件,列如:添加 test.go,内容如下:

                package main

                import "fmt"

                func main() {
                    fmt.Println("Go - Hello world")
                }

            golang:1.18:镜像:tag
            -itd:可以写成 -i -t -d,-d 表示容器启动后在后台运行,-i 表示交互,-t 表示终端。

        $ docker ps  # 查看运行的容器列表

        $ docker exec -it golang-1.18 /bin/bash
        
            root@2724565c88c7:/# cd /home/docker/golang
            root@2724565c88c7:/home/docker/golang# go run test.go
            Go - Hello world


posted @ 2022-08-29 19:45  垄山小站  阅读(530)  评论(0编辑  收藏  举报