2015年Docker非常火爆越来越多的开发者和企业开始使用Docker进行应用的容器化部署。Docker通过容器技术能让应用在任何环境中都能一致地运行解决了,"在我机器上能跑",的问题大大简化了部署流程提高了开发和运维效率。

作为一个程序员掌握Docker已经成为一项必备技能。今天就来分享一下Docker容器化部署的实战教程包括Docker的基本概念安装使用Dockerfile镜像构建容器管理数据持久化网络配置等希望能帮到大家。

1. Docker简介

1.1 什么是Docker

Docker是一个开源的应用容器引擎基于Go语言开发由Docker公司开发和维护。它能让开发者把应用和依赖打包到一个可移植的容器中然后发布到任何支持Docker的机器上运行。

容器是一种轻量级的虚拟化技术和传统的虚拟机不同容器不需要模拟整个操作系统而是共享宿主机的内核启动速度快资源占用,少。

1.2 Docker的优势

  • 环境一致性:Docker容器包含了应用运行所需的所有依赖确保应用在开发测试生产环境中都能一致地运行。
  • 快速部署:Docker容器启动速度快通常几秒就能启动大大缩短了部署时间。
  • 资源高效:Docker容器共享宿主机内核资源占用少能在一台机器上运行多个容器提高资源利用率。
  • 易于扩展:Docker容器易于创建和销毁能快速进行水平扩展应对流量高峰。
  • 生态丰富:Docker有丰富的镜像仓库Docker Hub上面有大量的官方和社区镜像可以直接使用。

1.3 Docker的基本概念

  • 镜像(Image):Docker镜像是一个只读的模板包含了运行应用所需的代码运行时库环境变量配置文件,等。镜像是创建容器的基础。
  • 容器(Container):Docker容器是镜像运行的实例是一个可读写的运行时环境。容器可以被启动停止删除,等。
  • 仓库(Repository):Docker仓库是存储镜像的地方分为公共仓库和私有仓库。Docker Hub是最大的公共仓库。
  • Dockerfile:Dockerfile是一个文本文件包含了一系列指令用于构建Docker镜像。

2. Docker安装

2.1 Linux安装

以CentOS 7为例:

# 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2

# 添加Docker源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装Docker
yum install -y docker-ce

# 启动Docker
systemctl start docker
systemctl enable docker

# 验证安装
docker --version

Ubuntu安装:

# 更新包索引
apt-get update

# 安装依赖
apt-get install -y apt-transport-https ca-certificates curl software-properties-common

# 添加Docker GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

# 添加Docker源
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# 安装Docker
apt-get update
apt-get install -y docker-ce

# 启动Docker
systemctl start docker
systemctl enable docker

2.2 配置镜像加速

由于国内访问Docker Hub比较慢建议配置国内镜像加速比如阿里云DaoCloud等。

编辑,/etc/docker/daemon.json

{
  "registry-mirrors": [
    "https://your-mirror-url"
  ]
}

然后重启Docker:

systemctl daemon-reload
systemctl restart docker

3. Docker基本命令

3.1 镜像管理

# 搜索镜像
docker search nginx

# 拉取镜像
docker pull nginx:latest

# 查看本地镜像
docker images

# 删除镜像
docker rmi nginx:latest

# 构建镜像(在Dockerfile所在目录)
docker build -t myapp:latest .

# 给镜像打标签
docker tag myapp:latest myapp:v1.0

# 推送镜像到仓库
docker push myapp:v1.0

3.2 容器管理

# 运行容器
docker run -d --name mynginx -p 80:80 nginx:latest

# 查看运行中的容器
docker ps

# 查看所有容器(包括已停止的)
docker ps -a

# 启动容器
docker start mynginx

# 停止容器
docker stop mynginx

# 重启容器
docker restart mynginx

# 删除容器
docker rm mynginx

# 强制删除运行中的容器
docker rm -f mynginx

# 查看容器日志
docker logs mynginx

# 实时查看容器日志
docker logs -f mynginx

# 进入容器
docker exec -it mynginx /bin/bash

# 查看容器详情
docker inspect mynginx

# 查看容器资源使用情况
docker stats mynginx

3.3 数据持久化

# 使用数据卷
docker run -d --name mymysql -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

# 使用匿名卷
docker run -d --name mynginx -v /usr/share/nginx/html nginx:latest

# 挂载主机目录
docker run -d --name mynginx -v /home/user/html:/usr/share/nginx/html nginx:latest

3.4 网络配置

# 查看网络
docker network ls

# 创建网络
docker network create mynetwork

# 运行容器并加入网络
docker run -d --name mynginx --network mynetwork nginx:latest

# 连接容器到网络
docker network connect mynetwork mynginx

# 断开容器与网络的连接
docker network disconnect mynetwork mynginx

# 删除网络
docker network rm mynetwork

4. Dockerfile实战

4.1 Dockerfile基本指令

# 指定基础镜像
FROM ubuntu:16.04

# 指定维护者信息
MAINTAINER Your Name <your@email.com>

# 设置环境变量
ENV NODE_ENV=production
ENV PORT=3000

# 执行命令
RUN apt-get update && apt-get install -y nginx

# 复制文件
COPY index.html /usr/share/nginx/html/

# 添加文件(支持自动解压和URL)
ADD app.tar.gz /app/

# 设置工作目录
WORKDIR /app

# 暴露端口
EXPOSE 80 443

# 定义数据卷
VOLUME ["/data"]

# 容器启动时执行的命令(只能有一个CMD)
CMD ["nginx", "-g", "daemon off;"]

# 容器启动时执行的入口命令
ENTRYPOINT ["docker-entrypoint.sh"]

4.2 PHP应用Dockerfile示例

# 基础镜像
FROM php:7.4-fpm

# 设置维护者
MAINTAINER Your Name <your@email.com>

# 设置环境变量
ENV TZ=Asia/Shanghai

# 安装依赖和扩展
RUN apt-get update && apt-get install -y \
    libpng-dev \
    libjpeg-dev \
    libfreetype6-dev \
    libzip-dev \
    zip \
    unzip \
    git \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd pdo_mysql mysqli zip opcache \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# 安装Redis扩展
RUN pecl install redis-5.3.4 \
    && docker-php-ext-enable redis

# 设置工作目录
WORKDIR /var/www/html

# 复制应用代码
COPY . /var/www/html/

# 设置权限
RUN chown -R www-data:www-data /var/www/html \
    && chmod -R 755 /var/www/html

# 暴露端口
EXPOSE 9000

# 启动命令
CMD ["php-fpm"]

4.3 Nginx Dockerfile示例

# 基础镜像
FROM nginx:1.19

# 设置维护者
MAINTAINER Your Name <your@email.com>

# 复制配置文件
COPY nginx.conf /etc/nginx/nginx.conf
COPY conf.d/ /etc/nginx/conf.d/

# 复制静态文件
COPY html/ /usr/share/nginx/html/

# 暴露端口
EXPOSE 80 443

# 启动命令
CMD ["nginx", "-g", "daemon off;"]

5. Docker Compose实战

Docker Compose是用于定义和运行多容器Docker应用的工具。通过一个YAML文件来配置应用的所有服务然后一条命令就能创建并启动所有服务。

5.1 安装Docker Compose

# 下载Docker Compose
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 添加执行权限
chmod +x /usr/local/bin/docker-compose

# 验证安装
docker-compose --version

5.2 docker-compose.yml示例

以LNMP(Linux + Nginx + MySQL + PHP)环境为例:

version: '3'

services:
  # Nginx服务
  nginx:
    image: nginx:1.19
    container_name: lnmp-nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./www:/var/www/html
      - ./logs/nginx:/var/log/nginx
    depends_on:
      - php
    networks:
      - lnmp-network
    restart: always

  # PHP服务
  php:
    build: ./php
    container_name: lnmp-php
    volumes:
      - ./www:/var/www/html
      - ./php/php.ini:/usr/local/etc/php/php.ini
      - ./logs/php:/var/log/php
    depends_on:
      - mysql
      - redis
    networks:
      - lnmp-network
    restart: always

  # MySQL服务
  mysql:
    image: mysql:5.7
    container_name: lnmp-mysql
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/my.cnf:/etc/mysql/my.cnf
      - ./logs/mysql:/var/log/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: app
      MYSQL_USER: app
      MYSQL_PASSWORD: 123456
    networks:
      - lnmp-network
    restart: always

  # Redis服务
  redis:
    image: redis:6.0
    container_name: lnmp-redis
    ports:
      - "6379:6379"
    volumes:
      - ./redis/data:/data
      - ./redis/redis.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf
    networks:
      - lnmp-network
    restart: always

# 网络
networks:
  lnmp-network:
    driver: bridge

5.3 Docker Compose常用命令

# 启动所有服务
docker-compose up -d

# 停止所有服务
docker-compose stop

# 启动已停止的服务
docker-compose start

# 重启所有服务
docker-compose restart

# 停止并删除所有容器、网络、卷
docker-compose down

# 查看服务状态
docker-compose ps

# 查看服务日志
docker-compose logs

# 实时查看服务日志
docker-compose logs -f

# 构建或重新构建服务
docker-compose build

# 拉取服务镜像
docker-compose pull

# 进入服务容器
docker-compose exec php /bin/bash

6. 部署实战

6.1 项目结构

myproject/
├── docker-compose.yml
├── nginx/
│   ├── nginx.conf
│   └── conf.d/
│       └── default.conf
├── php/
│   ├── Dockerfile
│   └── php.ini
├── mysql/
│   ├── my.cnf
│   └── data/
├── redis/
│   ├── redis.conf
│   └── data/
├── www/
│   └── index.php
└── logs/
    ├── nginx/
    ├── php/
    └── mysql/

6.2 Nginx配置

nginx/conf.d/default.conf

server {
    listen 80;
    server_name localhost;
    root /var/www/html;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(ht|git|svn) {
        deny all;
    }
}

6.3 启动服务

# 进入项目目录
cd myproject

# 启动所有服务
docker-compose up -d

# 查看服务状态
docker-compose ps

# 访问网站
curl http://localhost

6.4 更新部署

# 拉取最新代码
cd www
git pull

# 重新构建PHP镜像(如果代码依赖有变化)
cd ..
docker-compose build php

# 重启服务
docker-compose restart php nginx

写在最后

以上就是Docker容器化部署的实战教程。Docker是一项非常强大的技术能大大简化应用的部署流程提高开发和运维效率。掌握Docker已经成为现代程序员的必备技能。

当然Docker的功能还有很多比如Docker Swarm,Kubernetes等容器编排工具能管理大规模的容器集群。这些内容比较深入需要更多的学习和实践。

对于个人开发者或者小型项目来说掌握Docker的基本使用和Docker Compose就已经足够,了。能让你的部署流程更加简单高效也能避免环境不一致带来的各种问题。

希望这篇教程能帮到大家快速入门Docker享受容器化部署带来的便利。如果有什么问题或者建议欢迎在评论区留言和我一起讨论。

最后提醒大家几句:

  1. 多实践:Docker是一项实践性很强的技术要多动手实践才能真正掌握。
  2. 注意安全:使用Docker时要注意安全不要在容器中运行不必要的服务不要暴露不必要的端口。
  3. 数据持久化:重要数据一定要做数据持久化挂载到宿主机或者数据卷避免容器删除后数据丢失。
  4. 镜像优化:构建镜像时要注意优化镜像大小使用多阶段构建清理不必要的依赖和缓存。

祝大家都能用好Docker享受容器化部署的便利!