Skip to content

温馨提示

本章节以 CentOS Stream 服务器为例,基于 Docker 容器化部署 Nginx 服务。

镜像检索

Docker官网 镜像仓库,搜索找到自己想要下载的镜像版本。

拉取镜像

js
# 搜索nginx版本
docker search nginx
# 下载镜像
docker pull nginx
# 选择官方最新版本下载
docker pull nginx:latest
# 查看nginx镜像
docker images

拉取镜像输出过程:

js
[root@S1 usr]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
025c56f98b67: Already exists 
ec0f5d052824: Pull complete 
cc9fb8360807: Pull complete 
defc9ba04d7c: Pull complete 
885556963dad: Pull complete 
f12443e5c9f7: Pull complete 
Digest: sha256:75263be7e5846fc69cb6c42553ff9c93d653d769b94917dbda71d42d3f3c00d3
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

创建挂载文件

js
mkdir -p /usr/local/docker/nginx/conf
mkdir -p /usr/local/docker/nginx/logs
mkdir -p /usr/local/docker/nginx/html
mkdir -p /usr/local/docker/nginx/ssl

创建并启动容器

js
docker run \
--name docker_nginx \
--restart=always \
-p 80:80 \
-v /usr/local/docker/nginx/html:/usr/share/nginx/html \
-v /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/docker/nginx/conf/conf.d/default.conf:/etc/nginx/conf.d/default.conf \
-v /usr/local/docker/nginx/logs:/var/log/nginx \
-v /usr/local/docker/nginx/ssl/:/ssl/ \
--link docker_nginx:docker_nginx \
-d nginx

参数说明:

--name docker 表示容器名称设为docker_nginx;
-p 80:80 端口进行映射,将本地 80 端口映射到容器内部的 80 端口;
-v 将宿主的目录/文件映射到docker容器内部目录/文件:rw读写权限;
-d nginx设置容器在在后台一直运行;
–restart=always 开机启动,失败也会一直重启
--link docker_nginx:docker_nginx 将nginx容器和php容器连接 通过别名docker_nginx就不再需要去指定docker_nginx容器的ip了;

进入容器

js
# 执行命令进入容器内部
docker exec -it docker_nginx /bin/bash

参数说明:

exec 命令代表附着到运行着的容器内部
-it 是 -i 与 -t两个参数合并写法,-i -t 标志着为我们指定的容器创建了TTY并捕捉了STDIN
docker_nginx 是我们要进入的容器Id或容器名
/bin/bash 指定了执行命令的shell

温馨提示

也可以实行先启动后逐个挂载文件,具体操作步骤如下:

  • 创建并启动容器
js
docker run -d --name docker_nginx -p 80:80 nginx
-d 指定容器以守护进程方式在后台运行
name 指定容器名称,此处我指定的是nginx
-p 指定主机与容器内部的端口号映射关系,格式 -p [宿主机端口号][容器内部端口],此处我使用了主机80端口,映射容器80端口

此时可以通过命令查看配置文件目录:

js
docker exec docker_nginx ls /etc/nginx
  • 将容器 nginx.confconf.dhtml 等文件或文件夹复制到宿主机目录下:
js
docker cp nginx:/etc/nginx/nginx.conf /usr/local/docker/nginx/conf/nginx.conf
docker cp nginx:/etc/nginx/conf.d /usr/local/docker/nginx/conf/conf.d
docker cp nginx:/usr/share/nginx/html /usr/local/docker/nginx/html
  • 停止并删除容器:
js
# 启动容器
docker start docker_nginx
# 停止容器
docker stop docker_nginx
# 删除容器 
docker rm docker_nginx
# 删除正在运行的容器
docker rm -f docker_nginx
  • 启动容器并实行目录挂载

重新创建容器并启动:

js
docker run \
-p 80:80 \
--name docker_nginx \
-m 200m \
--restart always \
-v /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/docker/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /usr/local/docker/nginx/html:/usr/share/nginx/html \
-v /usr/local/docker/nginx/logs:/var/log/nginx \
-e TZ=Asia/Shanghai \
--privileged=true \
-d nginx

参数说明:

-name 给你启动的容器起个名字,以后可以使用这个名字启动或者停止容器
-p    映射端口,将docker宿主机的80端口和容器的80端口进行绑定
-v    挂载文件用的,
-m 200m 分配内存空间
-e TZ=Asia/Shanghai 设置时区
第一个-v 表示将你本地的nginx.conf覆盖你要起启动的容器的nginx.conf文件,
第二个-v 表示将日志文件进行挂载,就是把nginx服务器的日志写到你docker宿主机的/home/docker-nginx/log/下面
第三个-v 表示的和第一个-v意思一样的。
-d 表示启动的是哪个镜像
  • 重启容器
js
# 重启nginx
docker restart docker_nginx

迁移与备份

  • 容器保存为镜像

我们可以通过以下命令将容器保存为镜像

js
docker commit docker_nginx nginx_i
  • 镜像备份

我们可以通过以下命令将镜像保存为 tar 文件

js
docker save -o docker_nginx.tar nginx_i
  • 镜像恢复与迁移

首先我们先删除掉 docker_nginx 镜像,然后执行此命令进行恢复:

js
docker load -i docker_nginx.tar

脚本部署

使用 docker-compose.yml 文件可以快速部署 Nginx 服务。通过定义服务、网络和卷等配置,Docker Compose 可以自动创建并启动 Nginx 容器,同时确保数据持久化和网络配置。

以下是一个简单的 docker-compose.yml 文件示例:

js
version: '3.7'

# 应用服务
services:
  # 网络代理服务
  docker_nginx:
    # 容器名
    container_name: docker_nginx
    # 容器引用镜像
    image: nginx:1.18.0
    # 将容器运行在特权模式下,意味着容器内的进程将具
    # 有访问宿主机的权限,包括文件系统、设备和系统功能等
    privileged: true
    # 启动策略为始终重启
    restart: always
    # 设置网络模式为host模式
    network_mode: host
    # 环境变量
    environment:
      - TZ=Asia/Shanghai
    # 端口映射
    ports:
      - 80:80
      - 443:443
      - 8080:8080
    # 文件挂载
    volumes:
      # 挂载应用目录
      - $PWD/html:/usr/share/nginx/html
      # 挂载配置文件
      - $PWD/conf/nginx.conf:/etc/nginx/nginx.conf
      # 挂载配置文件
      - $PWD/conf/conf.d:/etc/nginx/conf.d
      # 挂载日志文件
      - $PWD/logs:/var/log/nginx
      # 挂载缓存目录
      - $PWD/cache:/var/cache/nginx

参数说明:

version: 指定 Docker Compose 文件的版本。
services: 定义服务,这里只有一个 mysql 服务。
image: 使用 MySQL 8.0 镜像。
container_name: 指定容器的名称。
environment: 设置环境变量,包括 root 用户密码、默认数据库、用户和密码。
ports: 将容器内的 3306 端口映射到主机的 3306 端口,以便从主机访问 MySQL。
volumes: 使用数据卷 mysql_data 持久化 MySQL 数据,确保数据在容器重启后不会丢失。
networks: 使用自定义网络 mysql_network,以便其他服务可以连接到 MySQL。

使用方法:

  • 将上述 docker-compose.yml 文件上传至目标服务器。

  • 在终端中导航到该文件所在的目录。

    运行以下命令启动 服务:

    js
    docker-compose up -d

    使用以下命令停止并删除容器:

    js
    docker-compose down
  • 如果需要保留数据卷,可以使用 docker-compose down --volumes 删除数据卷。

总结

通过以上步骤,你已经在 CentOS Stream 上使用 Docker 成功部署了 Nginx,并实现了配置文件和静态资源的持久化存储。这种方法便于管理和迁移,同时确保了数据的安全性。

小蚂蚁云团队 · 提供技术支持