跳转至

Docker#

Docker 应用部署

部署 Nginx

  1. 搜索并拉取 Nginx 镜像

    docker search nginx
    
    docker pull nginx:1.26.3
    
  2. 创建容器,设置端口映射、目录映射

    默认 nginx.config
    user  nginx;
    worker_processes  1;
    
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    
    events {
        worker_connections  1024;
    }
    
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        keepalive_timeout  65;
    
        #gzip  on;
    
        server {
            listen       80 default_server;
            listen       [::]:80 default_server;
            server_name  _;
            root         /usr/share/nginx/html;
    
            location / {
                index  index.html index.htm;
            }
    
            error_page  404              /404.html;
            location = /404.html {
            }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
            }
        }
    
        # server {
        #     listen       80;
        #     server_name  example.com;
        #     root         /var/www/example.com;
        #     location / {
        #         try_files $uri $uri/ =404;
        #     }
        # }
    }
    
    docker run -id --name=docker_nginx \ 
    -p 80:80 "(1)!"
    -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \ "(2)!"
    -v $PWD/logs/var/log/nginx \ "(3)!"
    -v $PWD/html:/usr/share/nginx/html \
    nginx "(4)!"
    
    1. 端口映射,让本机的 80 端口映射到 nginx 容器的 80 端口
    2. 数据卷,让本地当前目录($PWD)下的 /conf/nginx.conf Nginx 配置文件映挂载到容器中,其余的数据卷是同样的道理,「配置文件要提前准备好

Docker 服务与架构

由于一般都是用 sudo 安装的 docker,所以使用 docker 的时候也需要用管理员权限运行命令,一般开发 / 测试 / 个人服务器环境下推荐将非 root 用户添加进 docker 组里面,这样就不用重复输入 sudo 提升权限了。将非 root 用户添加进 docker 组按照这个流程:

  1. 把用户加入 docker 组

    sudo usermod -aG docker $USER
    
  2. 重新登录

    exit
    
  3. 重启 Docker

    sudo systemctl restart docker
    
  4. 再试一下命令

    docker images
    

自制 Dokcer 镜像

前言

先说本质,Docker 镜像本质上是一个「只读的、分层」的文件系统模板,包含应用程序及其依赖的运行环境(如 rootfs),通过联合文件系统(如 UnionFS)堆叠多层实现高效共享和复用。

  1. docker 的 ubuntu 镜像只要几百 MB,为什么 ubuntu 操作系统的 IOS 却要几个GB?

    因为 Docker 镜像中仅包含用户空间文件系统(rootfs),剔除了内核(bootfs)、引导程序、GUI 和大量不必要工具,这些容器直接使用宿主机内核。相比之下,Ubuntu ISO 达几个GB,是完整可引导的安装介质,包括内核、安装程序、多种架构支持和完整软件包。

  2. 那为什么 tomcat 镜像要几百兆,实际的 tomcat 只需要几十兆呢?

    官方 Tomcat 镜像几百MB,主要基于基础镜像 + JDK 和 Tomcat 文件,以及安装过程中的缓存、文档等冗余层。大概就是这个逻辑:

Docker 安装

开发阶段使用 Windows 或 macOS 运行 Docker 是完全可行的,但在部署或生产环境中,一般还是更推荐直接在 Linux 服务器上运行 Docker。

因为在 Windows 或 macOS 上运行 Docker 时的本质是通过虚拟化 Linux 内核来运行容器,相当于「容器跑在虚拟机里的 Linux 上」。这种方式虽然对开发者非常友好,但在性能、文件系统 IO、网络等方面通常会有一定损耗。