LSB Version: :core-4.1-amd64:core-4.1-noarch Distributor ID: CentOS Description: CentOS Linux release 7.3.1611 (Core) Release: 7.3.1611 Codename: Core
一. Docker 介绍 1.1 Docker 思想Docker 它的思想来源于集装箱。
啥是集装箱? 集装箱就是用来封存、隔离不同的货物。
比如:在济南我刚开了一家 海鲜舫,供客人来 吃海鲜,长期需要海鲜与啤酒。
这时,我在青岛找了两家 合作商 给我供货, 青岛码头 渔民将他们打捞回来的海鲜放到集装箱里,暂称它为 海鲜集装箱 ,啤酒合作商将他们制造的啤酒放到集装箱里,暂称它为 啤酒集装箱。
然后租一辆 大货车 ,将 海鲜集装箱 与 啤酒集装箱 运到我的 海鲜舫,这时可能这个 大货车 特别 大 ,司机为了将货车填满多挣点儿钱,又为张三拉了些 大玩具 ,暂称他为 大玩具集装箱,大货车上就有了三个集装箱。
因为我只需要 啤酒集装箱 与 海鲜集装箱,我就只从 大货车 上拿这两个就行了,我不要 大玩具集装箱。
~~
1.2 关键词 (重要)本地终端、容器、大海豚(Docker)、镜像(集装箱)、中央仓库(码头)
-
本地终端: 也就是我开的 海鲜舫
-
容器: 本地终端安装好已运行起来的镜像。(例: Nginx 容器,MySQL 容器等)(也就是 吃海鲜)
-
大海豚: 也就是 大货车
-
镜像(各种 集装箱)
所有人将内容打包放到不同的 镜像 中,当需要不同的内容时,直接拿到这个 镜像 就可以了。
例: 张三将他的 Nginx 环境进行打包成 镜像 并上传到 中央仓库 ,这时,李四需要安装 Nginx 环境,只需要安装好 Docker ,将 Nginx 镜像 从 中央仓库 拉取到本地安装就可以了。
-
中央仓库(码头)
存放所有人提交的 镜像 的地方
部分摘自如何通俗的解释Docker是什么及其优点?
-
标准化
-
运输标准化
Docker 有一个 中央仓库,所有人上传的 镜像 都放在这里,当谁需要某个环境或者软件时,就直接指派 大海豚 去搬运这个 集装箱 就可以了。
-
命令标准化
Docker 提供了一系列的命令,帮助我们去获取 集装箱 等。
-
提供了 REST 的API; 衍生出了很多的图形化界面, Rancher。
-
-
一致性
Docker 提供了一个统一且一致的运行环境,适用于运行各种软件产品。
-
隔离性
Docker 在运行 镜像 时,会在 Linux 内核中单独的开辟一片空间,这片空间会影响其他功能。
-
可移植性
Docker 容器可轻松地从一个 Docker 运行环境移植到另一个 Docker 环境,从而以这种方式减少系统管理和操作的成本。
-
可追溯性
- Docker 容器是根据脚本构建的,该脚本在必要的软件依赖和环境下是可读摘要的。脚本可以受版本控制,完全可以通过这种方式跟踪。
- Docker 容器可以存储在组织内的存储库中,从而这种方式保留整个版本历史记录。
扯了这么多,那到底啥是 Docker 先看一下我理解的 Docker 的作用吧 :
- 获取与运输功能 : 从 合作商 那儿获取到要运输的 海鲜与啤酒,运输到 海鲜舫
这一步在 Docker 中实际是 人员使用 Docker 从 中央仓库 获取到镜像,将 镜像 拉取到本地,或者将本地的 镜像 上传至 中央仓库。
- 制作与运行功能 : 我拿到 海鲜与啤酒 就可以根据不同口味做成熟食供客人消费了。
这一步在 Docker 中实际是 人员使用 Docker 将 镜像 根据不同的配置 生成容器 后再运行容器后,便供我使用这个容器的服务了。
- 打包功能 : 人类使用叉车把不同的货物装到集装箱里。
这一步在 Docker 中实际是 人员使用 Docker 把 容器 打包成镜像。
口号
- Build、Ship、Run (搭建、发送、运行 三板斧 🪓)
- Build once , Run anywhere (搭建一次, 到处能用 👍)
Docker 不是镜像,不是容器, Docker 是应用程序工具。
# 1. 安装所需的软件包
sudo yum -y install yum-utils device-mapper-persistent-data 1vm2
# 2. 设置国内 Docker 的镜像源(选择其一)
# 阿里云源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 清华大学源
sudo yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
# 3. 安装 Docker
sudo yum makecache fast
sudo yum -y install docker-ce
# 4. 启动 Docker 服务
systemctl start docker
# 5. 设置开机自动启动
systemctl enable docker
2.2 Docker 的中央仓库
-
Docker 官方的中央仓库: 镜像最全,但下载速度较慢。
Dockerhub
- 国内的镜像网站
-
网易蜂巢
-
daoCloud - 推荐使用
-
- 公司内部私服(需要添加配置)
-
需要在
/etc/docker/daemon.json
添加配置(文件不存在则手动创建) -
{ "registry-mirrors": ["https://registry.docker-cn.com"], "insecure-registries": ["ip:port"] // 公司内部Docker私服的的 IP 与端口号 }
-
重启两个服务
systemctl daemon-reload
systemctl restart docker
# 1. 拉取镜像到本地
docker pull 镜像名称[:tag]
# 举个栗子
docker pull daocloud.io/library/nginx:1.12.0-alpine
# 2. 查看本地全部镜像
docker images
# 3. 删除单个镜像
docker rmi 镜像的IMAGE_ID IMAGE_ID IMAGE_ID IMAGE_ID
# 删除多个镜像
docker rmi 镜像的IMAGE_ID
# 删除所有镜像
docker rmi -f $(docker images -aq)
# 4. 镜像的导入导出
# 将本地镜像导出
docker save -o 导出的路径及路径 镜像的IMAGE_ID
# 加载本地的镜像,通过 docker load 加载的本地镜像的 REPOSITORY与 TAG 都为 none
docker load -i 镜像文件
# 修改镜像名称
docker tag 镜像的IMAGE_ID 新镜像名称:TAG
# 5. 查看镜像元数据
docker inspect 镜像IMAGE_ID
2.4 容器的操作
# 1. 运行容器
# 当使用 docker run 命令运行不存在的镜像时,会自动下载镜像并运行
# 简单操作
docker run 镜像IMAGE_ID 或者 docker run 镜像名称[:tag]
# 常用的参数
docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像IMAGE_ID
# -d : 代表后台运行容器
# -p 宿主机端口:容器端口 : 是为了映射当前 Linux 的端口和容器的端口
# --name 容器名称 : 指定容器的名称
# 2. 查看正在运行的容器,常用的参数
docker ps [-alq]
# -a : 查看全部的容器,包括未运行的容器
# -l : 显示最近创建的容器
# -q : 静默模式,只查看容器的标识
# 查看容器元数据
docker inspect 容器CONTAINER_ID
# 查看容器进程
docker top 容器CONTAINER_ID
# 3. 查看容器的日志
docker logs -f 容器CONTAINER_ID
# -f : 表示滚动查看日志的最后几行
# 4. 进入容器内部系统
docker exec -it 容器CONTAINER_ID bash 或 docker exec -it 容器CONTAINER_ID sh
# 5. 启动容器
docker start 容器CONTAINER_ID
# 6. 删除容器(删除容器前,需要先停止容器)
# 停止指定容器
docker stop 容器CONTAINER_ID
# 停止全部容器
docker stop $(docker ps -qa)
# 删除指定容器
docker rm 容器CONTAINER_ID
# 删除全部容器
docker rm $(docker ps -qa)
2.5 Docker 数据卷 (数据持久化|共享文件夹|目录挂载)
docker 关闭后,运行时所留下的数据也会被清理,但我们希望留下来,怎么办,那就要配置数据卷了。
# 1. 创建数据卷, 默认存放路径 /var/lib/docker/volumes/数据卷名称/_data
docker volume create 数据卷名称
# 2. 查看数据卷的详细信息
docker volume inspect 数据卷名称
# 3. 查看全部数据卷
docker volume ls
# 4. 删除数据卷
docker volume rm 数据卷名称
# 5. 应用数据卷
# 映射数据卷时,如果数据卷不存在,Docker 根据数据卷名称自动创建,并会将容器内部自带的文件,存储在本地默认的数据卷路径中。
# 数据卷名称映射
docker run -v 数据卷名称:容器内部的路径 镜像id
# 路径进行映射
docker run -v 本机路径:容器内部的路径 镜像id
# 6. 使用数据卷
docker run -d -p 8080:8080 --name nginx -v 数据卷名称:容器内部的路径 镜像id
docker run -d -p 8080:8080 --name nginx -v 本机路径:容器内部的路径 镜像 id
2.6 Docker 可视化界面工具 Pirtainer
- 安装, 这里我使用 8088 端口,可自定义
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
# 重启该容器
docker ps # 找到 portainer 容器
docker restart 容器id
- 服务器放行 8088 端口 进入你的服务器,找到防火墙,放行 8088 端口
- 访问 浏览器地址栏输入
ip:8088
访问
Docker 中央仓库上的镜像,也是 Docker 用户上传的。
Docker 通过读取 Dockerfile 文件中的指令生成镜像。
Dockerfile文件详解点击查看 - Dockerfile文件详解 (必须)
# 1. 生成镜像
docker build -t 自定义镜像名称:[tag] -f Dockerfile文件路径
四. Docker Compose
4.1 Docker Compose 简介
Docker Compose 是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。
Docker Compose 是用于设置和运行多个 Docker 容器的应用程序工具。
说白了就是,应用系统中需要部署多个应用程序,如果每个应用都要执行启停命令或者单独操作,效率特别低。这时把需要的容器配置放到一个 .yml
文件中,用于统一管理,提高效率。
# 1. 下载 Docker Compose
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/v2.16.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 或
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 2. 对二进制文件增加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 3. 增加软连接(环境变量)
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 4. 测试是否成功
docker-compose --version
# 1. 卸载
sudo rm /usr/local/bin/docker-compose
4.3 Docker Compose 使用方法
- 使用 Dockerfile 文件定义应用程序的环境。
- 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
- 执行
docker-compose up -d
命令来启动并运行整个应用程序。
点击查看 - Docker Compose -> yml 配置指令参考
4.5 Docker Compose 常用命令 镜像操作# 1. 验证配置项,正确时显示文件内容,错误时显示错误信息
docker-compose config
# 2. 构建镜像
docker-compose build nginx
# 3. 不带缓存构建镜像
docker-compose build --no-cache nginx
# 4. 查看 Compose 所有镜像
docker-compose images
# 5. 运行所有镜像,后台运行
docker-compose up -d
# 6. 运行单个镜像
docker-compose up -d nginx
# 7. 修改 yml 文件后,重新加载运行
docker-compose up --force-recreate -d
容器操作
# 1. 暂停容器
docker-compose pause nginx
# 2. 恢复容器
docker-compose unpause nginx
# 3. 删除容器,先停止后删除
docker-compose stop nginx
docker-compose rm nginx
# 4. 停止容器
docker-compose stop nginx
# 5. 启动容器
docker-compose start nginx
# 6. 重启容器
docker-compose restart nginx
# 7. 查看所有容器
docker-compose ps -a
# 8. 进入容器中
docker-compose exec nginx sh 或 docker-compose exec nginx bash
# 9. 停止 up 启动的容器并删除
docker-compose down
# 10. 查看容器内运行的进程
docker-compose top 或 docker-compose top nginx
# 11. 查看容器日志
docker-compose logs -f nginx
4.6 Dockerfile 配合 docker-compose 使用
使用 Dockerfile 文件生成自定义镜像, 并由 docker-compose 读取 docker-compose.yml 配置文件来管理容器
# docker-compose.yml 文件配置(根据自身情况编写)
# 最主要的是 build 配置指令,通过 build 指令,指定为通过从 Dockerfile 来构建镜像
# 例
version: "3"
services:
php5.6:
build:
context: ../ # Dockerfile 文件位于 docker-compose.yml 文件同级目录中的 dir 文件夹内
dockerfile: Dockerfile-php56 # 然而 Dockerfile 文件名为 Dockerfile-php56
# Dockerfile-nginx 文件配置(根据自身情况编写)
FROM daocloud.io/php:5.6-apache
COPY config/php.ini /usr/local/etc/php
COPY src/ /var/www/html/
# 例 文件夹结构
|-- test_docker
| |-- Dockerfile-php56 # Dockerfile 文件
| |-- docker-compose # docker-compose 目录
| |-- docker-compose.yml #docker-compose.yml 目录
| |-- config # 自定义文件
| |-- php.ini
| |-- src
五、网络
5.1 查看容器 IP
# 查看单个容器 IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器ID
# 查看所有容器 IP
docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
# 查看通过 docker-compose 创建的容器 IP
docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
#---------------------------------------------------------------------------
# 配置快捷键
vim ~/.bash_profile # Mac 电脑
# 或
vim ~/.bashrc # centos
# 添加以下内容
# docker
function docker_ip() {
sudo docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $1
}
function docker_ip_list() {
sudo docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
}
# 刷新生效
source ~/.bash_profile # Mac 电脑
# 或
source ~/.bashrc # centos
# 使用,宿主机终端输入
docker_ip_list
docker_ip 容器ID
5.2 查看 docker 网络模式
docker network ls
点击查看 Docker 网络详解
六. 搭建运行 PHP 所需要的环境
大神已经分享开源了,我们直接使用。为大神鼓掌👏。一共有两套,都贴出来,大家有时间都可以练习试试
GitHub - dnmp - 源码地址 - Gary Meng (作者)
Gitee - dnmp - 源码地址 - Gary Meng (作者)
GitHub - dnmp - 源码地址 - Tinywan (作者)
Gitee - dnmp - 源码地址 - Tinywan (作者)
docker:用官方镜像在本地搭建PHP开发环境
学习链接Docker 官方文档
菜鸟教程 - Docker compose
B站教学视频 - Docker最新超详细版教程通俗易懂 (本文学习视频)