相关网站
安装 Docker
Docker介绍
为什么要使用 Docker
- 更高效的利用系统资源
- 更快速的启动时间
- 一致的运行环境
- 持续交付和部署
- 更轻松的迁移
- 更轻松的维护和扩展
对比传统虚拟机总结
Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器,是一个运行时环境,就是我们前面说到的集装箱。
Docker 架构图
基础概念
Docker 分为三个基本概念 镜像
,容器
,仓库
镜像
Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
Docker 镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
常用命令
docker images
查看当前镜像
- -a :列出本地所有的镜像(含中间映像层)
- -q :只显示镜像ID。
- --digests :显示镜像的摘要信息
- --no-trunc :显示完整的镜像信息
docker search nginx
查找https://hub.docker.com
的镜像
- --no-trunc : 显示完整的镜像描述
docker pull nginx:latest
拉去远程镜像到本地docker rmi -f nginx:latest
删除本地镜像
docker rmi -f 镜像名1:TAG 镜像名2:TAG
删除多个镜像docker rmi -f $(docker images -qa)
删除所有镜像
docker system df
查看镜像、容器、数据卷所占用的空间。
容器
Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。
它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序,容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者 绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
常用命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
依据镜像创建容器
- OPTIONS说明(常用):有些是一个减号,有些是两个减号
- --name=”容器新名字”: 为容器指定一个名称;
- -d: 后台运行容器,并返回容器ID,也即启动守护式容器;
- -i:以交互模式运行容器,通常与 -t 同时使用;
- -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
- -v: 挂在目录,进行映射
- -P: 随机端口映射;
- -p: 指定端口映射,有以下四种格式
ip:hostPort:containerPort ip::containerPort hostPort:containerPort containerPort
docker ps [OPTIONS]
列出当前正在运行的容器
- -a :列出当前所有正在运行的容器+历史上运行过的
- -l :显示最近创建的容器。
- -n:显示最近n个创建的容器。
- -q :静默模式,只显示容器编号。
- --no-trunc :不截断输出。
docker start 容器Id
启动容器docker restart 容器Id
重启容器docker stop 容器Id
停止容器docker kill 容器ID
强制停止容器docker rm 容器ID
删除已经停止的容器
docker rm -f $(docker ps -a -q)
删除所有容器docker ps -a -q | xargs docker rm
删除所有容器
docker top 容器ID
查看容器内运行的进程docker inspect 容器ID
查看容器细节docker exec -it 容器ID bashShell
进入容器docker cp 容器ID:容器内路径 目的主机路径
拷贝容器内文件到本地
仓库
仓库(Repository)是集中存放镜像文件的场所。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub(https://hub.docker.com/),
存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云 等
Dockerfile
Dockerfile是用来构建 Docker镜像
的构建文件,是由一系列命令和参数构成的脚本。
构建三步骤
- 编写 Dockerfile 文件
- docker build
- docker run
约定
1:每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2:指令按照从上到下,顺序执行
3:#表示注释
4:每条指令都会创建一个新的镜像层,并对镜像进行提交
常用命令
ARG
设置环境变量FROM
基础镜像,当前新镜像是基于哪个镜像的MAINTAINER
镜像维护者的姓名和邮箱地址RUN
容器构建时需要运行的命令EXPOSE
当前容器对外暴露出的端口WORKDIR
指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点ENV
用来在构建镜像过程中设置环境变量ADD
将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包COPY
类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置VOLUME
容器数据卷,用于数据保存和持久化工作CMD
指定一个容器启动时要运行的命令,Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换ENTRYPOINT
指定一个容器启动时要运行的命令,ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数ONBUILD
当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
构建 PHP 环境实例
# 构建环境变量,可自由配置不同 PHP 版本
ARG PHP_VERSION
FROM php:${PHP_VERSION}-fpm
# 替换成 清华大学源加速。真快
COPY ./resources/sources.list /etc/apt/
# 安装 composer 以及一些 php 扩展
RUN curl -sS https://getcomposer.org/installer | php
&& mv composer.phar /usr/local/bin/composer
&& composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/&& apt-get update -y
&& apt-get install -y --no-install-recommends apt-utils
&& apt-get install -qq git curl libmcrypt-dev libjpeg-dev libpng-dev libfreetype6-dev libbz2-dev libzip-dev unzip
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/&& docker-php-ext-install pdo_mysql zip gd opcache bcmath pcntl sockets
WORKDIR /tmp
# 安装 redis 扩展
ADD ./resources/redis-5.1.1.tgz .
RUN mkdir -p /usr/src/php/ext
&& mv /tmp/redis-5.1.1 /usr/src/php/ext/redis
&& docker-php-ext-install redis
# 以下注释按需打开(某些项目需要 npm 啥的)
# 安装 python3#ADD ./resources/Python-3.8.0.tgz .
#RUN cd /tmp/Python-3.8.0 && ./configure && make && make install && rm -rf /tmp/Python-3.8.0 Python-3.8.0.tgz
# 安装 nodejs#ADD ./resources/node-v12.13.0-linux-x64.tar.xz .
#RUN ln -s /tmp/node-v12.13.0-linux-x64/bin/node /usr/bin/node
# && ln -s /tmp/node-v12.13.0-linux-x64/bin/npm /usr/bin/npm
# 安装 swoole#COPY ./resources/swoole-src-4.4.12.zip .
#RUN cd /tmp && unzip swoole-src-4.4.12.zip
# && cd swoole-src-4.4.12 && phpize && ./configure
# && make && make install && rm -rf /tmp/swoole*
ADD ./resources/mcrypt-1.0.3.tgz .
RUN cd /tmp/mcrypt-1.0.3 && phpize && ./configure && make && make install && rm -rf /tmp/mcrypt-1.0.3
ADD ./resources/mongodb-1.6.0.tgz .
RUN cd /tmp/mongodb-1.6.0 && phpize && ./configure && make && make install && rm -rf /tmp/mongodb-1.6.0
ADD ./resources/xdebug-3.0.1.tgz .
RUN cd /tmp/xdebug-3.0.1 && phpize && ./configure && make && make install && rm -rf /tmp/xdebug-3.0.1
CMD php-fpm
Docker-Compose
基本概念
Compose
项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。
其代码目前在 github上开源。
Compose
定位是 「定义和运行多个 Docker 容器的应用」,其前身是开源项目 Fig。
我们知道使用一个 Dockerfile
模板文件,可以很方便的定义一个单独的应用容器。然而,在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 lnmp 项目,除了 Nginx 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose
恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml
模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose
中有两个重要的概念:
- 服务 (
service
):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。 - 项目 (
project
):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml
文件中定义。
Compose
的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
安装
Windows
Docker Desktop for Windows 包括 Compose 以及其他 Docker 应用程序,因此大多数 Windows 用户不需要单独安装 Compose
Linux & mac
自行百度
Compose 模板文件
build
指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。Compose 将会利用它自动构建这个镜像,然后使用这个镜像。
version: '3'
services:
php72:
build: ./dir
- 可以使用
context
指令指定Dockerfile
所在文件夹的路径。 - 使用
arg
指令指定构建镜像时的变量。
version: "3"
services:
php72:
build:
context: .
args:PHP_VERSION: 7.2
container_name
指定容器名称。默认将会使用 项目名称_服务名称_序号 这样的格式。
version: "3"
services:
php72:
build:
context: .
args:PHP_VERSION: 7.2
container_name: php72
environment
设置环境变量。你可以使用数组或字典两种格式。- 只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据。
version: "3"
services:
php72:
build:
context: .
args:PHP_VERSION: 7.2
container_name: php72
environment:TZ: "$TZ" # 时区设置
WEB_ENV: "local" # 环境变量设置
extra_hosts
类似 Docker 中的 –add-host 参数,指定额外的 host 名称映射信息。会在启动后的服务容器中 /etc/hosts 文件中添加如下两条条目。
version: "3"
services:
php72:
build:
context: .
args:PHP_VERSION: 7.2
container_name: php72
environment:TZ: "$TZ" # 时区设置
WEB_ENV: "local" # 环境变量设置
extra_hosts:- home.kukewang.li:172.20.128.2- admin.kukewang.li:172.20.128.2- api.kukewang.li:172.20.128.2- api.kukecrm.li:172.20.128.2
networks
配置容器连接的网络。
version: "3"
services:
php72:
build:
context: .
args:PHP_VERSION: 7.2
networks:static-network:
ipam:
config:- subnet: 172.20.0.0/16
networks
配置容器连接的网络。
version: "3"
services:
php72:
build:
context: .
args:PHP_VERSION: 7.2
container_name: php72
environment:TZ: "$TZ" # 时区设置
WEB_ENV: "local" # 环境变量设置
extra_hosts:- home.kukewang.li:172.20.128.2- admin.kukewang.li:172.20.128.2- api.kukewang.li:172.20.128.2- api.kukecrm.li:172.20.128.2
networks:static-network: #使用配置的网络
ports
暴露端口信息。使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以
version: "3"
services:
nginx:
image: nginx:alpine
container_name: nginx
ports:- 8080:80- 443:443
volumes
数据卷所挂载路径设置。可以设置为宿主机路径(HOST:CONTAINER)或者数据卷名称(VOLUME:CONTAINER)。该指令中路径支持相对路径。
version: "3"
services:
nginx:
image: nginx:alpine
container_name: nginx
ports:- 8080:80- 443:443
volumes:- ./config/nginx/conf.d:/etc/nginx/conf.d # nginx 配置
- ./logs/nginx:/var/log/nginx/ # nginx 日志
restart
指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always 或者 unless-stopped。
version: "3"
services:
nginx:
image: nginx:alpine
container_name: nginx
ports:- 8080:80- 443:443
restart: always
working_dir
指定容器中工作目录。
version: "3"
services:
php72:
build:
context: .
args:PHP_VERSION: 7.2
working_dir:/var/www
读取变量
Compose 模板文件支持动态读取主机的系统环境变量和当前目录下的 .env
文件中的变量。
version: "3"
services:
php72:
build:
context: .
args:PHP_VERSION: 7.2
volumes:- ~/.ssh:/root/.ssh/- ${WEB_ROOT}:/var/www:cached
- ${COMPOSER}/php72:/root/.composer/- ${PHP72_INI}:/usr/local/etc/php/php.ini
Compose 启动
一般使用 docker-compose up -d
构建,创建,启动服务,并放在后台运行
build
可以随时在项目目录下运行 docker-compose build 来重新构建服务。restart
重启项目中的服务。start
启动已经存在的服务容器。stop
停止已经处于运行状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。up
它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。链接的服务都将会被自动启动,除非已经处于运行状态。默认情况,docker-compose up
启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。- 当通过 Ctrl-C 停止命令时,所有容器将会停止。
- 如果使用
docker-compose up -d
,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。
操作容器
使用工具连接 MySql
- 环境:Windows
- Docker:Docker Desktop for Windows
- 连接工具:Navicat
- 主机地址是本地回路地址
- 本地的端口映射 3307:3306,
- 账号密码使用 root,可自行配置自己的账户,密码
- 通过连接本地的 3307 端口访问docker-mysql
使用工具连接 Redis
- 环境: Windows
- 工具:RedisClient
- host 本机回路地址
- 端口映射 6380:6379
连接 RabbitMQ
- 浏览器通过访问地址直接连接
- 域名:127.0.0.1
- 端口映射情况
ports:- 15672:15672 # 15672 mq 默认管理界面ui端口
- 5672:5672 # 5672 client端通信口
- RabbitMQ 默认账号密码
guest
运行项目
- dnmp/config/nginx/conf.d 添加配置文件
- 本地 Host 文件添加
127.0.0.1 home.kukewang.li
- 配置项目的
Mysql
,Redis
,在各自的配置文件或项目根目录的.env
文件里
[DATABASE]TYPE = mysql
HOSTNAME = mysql # mysql 容器的名字
DATABASE = database_name #数据库
USERNAME = root # 用户,可自行添加用户
PASSWORD = root_password # 密码
HOSTPORT = 3306 # 端口
[REDIS]HOST = redis # redis 容器的名字
PORT = 6379 # 端口
PASSWORD = # 密码,无密码不填
- 重启
Nginx
服务
docker-compose restart nginx
- 通过域名进行访问
- nginx 我这边端口映射 8080:80
PHP 安装扩展
- 第一种:在构建前,在
.env
文件的PHP_EXTENSIONS
参数添加
PHP_EXTENSIONS=pdo_mysql,mysqli,mbstring,gd,curl,opcache,redis
- 更多可安装扩展可查看注释
- 第二种:进入 PHP 的 Docker 容器
docker exec -it php71 sh
install-php-extensions xdebug-2.9.7
问题
- Windows 系统第一次构建 PHP 出现如下问题
- 大概的问题是由于
dnmp/services/php/extensions/install.sh
文件的行分隔符
是CRLF
,需要更改为LF
,或者设置/编辑器/代码样式