Docker基本介绍及使用

Docker/容器
368
0
0
2022-04-16
标签   Docker

相关网站

  1. Docker官网
  2. Docker Hub官网:
  3. 技术文档
  4. 本文所有案列仓库

安装 Docker

  1. 根据具体环境进行安装
  2. 镜像加速器

Docker介绍

为什么要使用 Docker

  1. 更高效的利用系统资源
  2. 更快速的启动时间
  3. 一致的运行环境
  4. 持续交付和部署
  5. 更轻松的迁移
  6. 更轻松的维护和扩展

对比传统虚拟机总结

Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器,是一个运行时环境,就是我们前面说到的集装箱。

Docker 架构图

基础概念

Docker 分为三个基本概念 镜像容器仓库

镜像

Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。

Docker 镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

常用命令

  1. docker images 查看当前镜像
  • -a :列出本地所有的镜像(含中间映像层)
  • -q :只显示镜像ID。
  • --digests :显示镜像的摘要信息
  • --no-trunc :显示完整的镜像信息
  1. docker search nginx 查找 https://hub.docker.com 的镜像
  • --no-trunc : 显示完整的镜像描述
  1. docker pull nginx:latest 拉去远程镜像到本地
  2. docker rmi -f nginx:latest 删除本地镜像
  • docker rmi -f 镜像名1:TAG 镜像名2:TAG 删除多个镜像
  • docker rmi -f $(docker images -qa) 删除所有镜像
  1. docker system df 查看镜像、容器、数据卷所占用的空间。

容器

Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。

它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。

可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序,容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。

按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者 绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。

常用命令

  1. 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
  1. docker ps [OPTIONS] 列出当前正在运行的容器
  • -a :列出当前所有正在运行的容器+历史上运行过的
  • -l :显示最近创建的容器。
  • -n:显示最近n个创建的容器。
  • -q :静默模式,只显示容器编号。
  • --no-trunc :不截断输出。
  1. docker start 容器Id 启动容器
  2. docker restart 容器Id 重启容器
  3. docker stop 容器Id 停止容器
  4. docker kill 容器ID 强制停止容器
  5. docker rm 容器ID 删除已经停止的容器
  • docker rm -f $(docker ps -a -q) 删除所有容器
  • docker ps -a -q | xargs docker rm 删除所有容器
  1. docker top 容器ID 查看容器内运行的进程
  2. docker inspect 容器ID 查看容器细节
  3. docker exec -it 容器ID bashShell 进入容器
  4. docker cp 容器ID:容器内路径 目的主机路径 拷贝容器内文件到本地

仓库

仓库(Repository)是集中存放镜像文件的场所。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

最大的公开仓库是 Docker Hub(https://hub.docker.com/),

存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云 等

Dockerfile

Dockerfile是用来构建 Docker镜像 的构建文件,是由一系列命令和参数构成的脚本。

构建三步骤

  1. 编写 Dockerfile 文件
  2. docker build
  3. docker run

约定

1:每条保留字指令都必须为大写字母且后面要跟随至少一个参数

2:指令按照从上到下,顺序执行

3:#表示注释

4:每条指令都会创建一个新的镜像层,并对镜像进行提交

常用命令

  1. ARG 设置环境变量
  2. FROM 基础镜像,当前新镜像是基于哪个镜像的
  3. MAINTAINER 镜像维护者的姓名和邮箱地址
  4. RUN 容器构建时需要运行的命令
  5. EXPOSE 当前容器对外暴露出的端口
  6. WORKDIR 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
  7. ENV 用来在构建镜像过程中设置环境变量
  8. ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
  9. COPY 类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
  10. VOLUME 容器数据卷,用于数据保存和持久化工作
  11. CMD 指定一个容器启动时要运行的命令,Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
  12. ENTRYPOINT 指定一个容器启动时要运行的命令,ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数
  13. 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

Docker

Linux & mac

自行百度

Compose 模板文件

  1. build 指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。Compose 将会利用它自动构建这个镜像,然后使用这个镜像。
version: '3'
services: 
     php72: 
         build: ./dir
  1. 可以使用 context 指令指定 Dockerfile 所在文件夹的路径。
  2. 使用 arg 指令指定构建镜像时的变量。
version: "3"
services: 
     php72: 
         build: 
             context: . 
             args:PHP_VERSION: 7.2
  1. container_name 指定容器名称。默认将会使用 项目名称_服务名称_序号 这样的格式。
version: "3"
services: 
     php72: 
         build: 
             context: . 
             args:PHP_VERSION: 7.2 
         container_name: php72
  1. environment 设置环境变量。你可以使用数组或字典两种格式。
  2. 只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据。
version: "3"
services: 
     php72: 
         build: 
             context: . 
             args:PHP_VERSION: 7.2 
         container_name: php72 
         environment:TZ: "$TZ" # 时区设置  
               WEB_ENV: "local" # 环境变量设置
  1. 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
  1. networks 配置容器连接的网络。
version: "3"
services: 
     php72: 
         build: 
             context: . 
             args:PHP_VERSION: 7.2
networks:static-network: 
         ipam: 
             config:- subnet: 172.20.0.0/16
  1. 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: #使用配置的网络
  1. ports 暴露端口信息。使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以
version: "3"
services: 
     nginx: 
         image: nginx:alpine 
     container_name: nginx 
     ports:- 8080:80- 443:443
  1. 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 日志
  1. restart 指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always 或者 unless-stopped。
version: "3"
services: 
     nginx: 
         image: nginx:alpine 
     container_name: nginx 
     ports:- 8080:80- 443:443 
     restart: always
  1. 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 构建,创建,启动服务,并放在后台运行

  1. build 可以随时在项目目录下运行 docker-compose build 来重新构建服务。
  2. restart 重启项目中的服务。
  3. start 启动已经存在的服务容器。
  4. stop 停止已经处于运行状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。
  5. up 它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。链接的服务都将会被自动启动,除非已经处于运行状态。默认情况,docker-compose up 启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。
  6. 当通过 Ctrl-C 停止命令时,所有容器将会停止。
  7. 如果使用 docker-compose up -d,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。

操作容器

使用工具连接 MySql

  • 环境:Windows
  • Docker:Docker Desktop for Windows
  • 连接工具:Navicat
  • Docker
  • 主机地址是本地回路地址
  • 本地的端口映射 3307:3306,
  • 账号密码使用 root,可自行配置自己的账户,密码
  • 通过连接本地的 3307 端口访问docker-mysql
  • Docker

使用工具连接 Redis

  • 环境: Windows
  • 工具:RedisClient
  • Docker
  • host 本机回路地址
  • 端口映射 6380:6379
  • Docker

连接 RabbitMQ

  • 浏览器通过访问地址直接连接
  • 域名:127.0.0.1
  • 端口映射情况
  ports:- 15672:15672 #  15672 mq 默认管理界面ui端口  
      - 5672:5672 # 5672 client端通信口
  • Docker
  • RabbitMQ 默认账号密码 guest
  • Docker

运行项目

  1. dnmp/config/nginx/conf.d 添加配置文件
  2. Docker
  3. 本地 Host 文件添加
 127.0.0.1 home.kukewang.li
  1. 配置项目的 MysqlRedis,在各自的配置文件或项目根目录的 .env 文件里
 [DATABASE]TYPE = mysql
 HOSTNAME = mysql # mysql 容器的名字
 DATABASE = database_name #数据库
 USERNAME = root # 用户,可自行添加用户
 PASSWORD = root_password # 密码
 HOSTPORT = 3306 # 端口

 [REDIS]HOST = redis # redis 容器的名字
 PORT = 6379 # 端口
 PASSWORD = # 密码,无密码不填
  1. 重启 Nginx 服务
 docker-compose restart nginx
  1. 通过域名进行访问
  2. Docker
  3. nginx 我这边端口映射 8080:80

PHP 安装扩展

PHP 安装扩展

  1. 第一种:在构建前,在 .env 文件的 PHP_EXTENSIONS 参数添加
 PHP_EXTENSIONS=pdo_mysql,mysqli,mbstring,gd,curl,opcache,redis
  1. 更多可安装扩展可查看注释
  2. 第二种:进入 PHP 的 Docker 容器
 docker exec -it php71 sh
 install-php-extensions xdebug-2.9.7

问题

  1. Windows 系统第一次构建 PHP 出现如下问题
  2. Docker基本介绍及使用
  3. 大概的问题是由于 dnmp/services/php/extensions/install.sh 文件的 行分隔符CRLF,需要更改为 LF,或者 设置/编辑器/代码样式
  4. Docker基本介绍及使用

参考

github-dnmp

PHP扩展