分类 docker 下的文章

docker compose构建本地开发环境

docker compose相关

命令语法 : https://yeasy.gitbooks.io/docker_practice/compose/commands.html
模板文件语法 : https://yeasy.gitbooks.io/docker_practice/compose/compose_file.html

docker compose文件

docker compose会自动创建一个network(默认名称为 : compose配置文件所在目录名_default;比如目录名称为xxx,则network名称为 xxx_default),并将compose中的服务加入到该network中。
可以使用 --project-name (可简写成 -p ) 参数或使用 COMPOSE_PROJECT_NAME 环境变量来自定义networ名称。
在docker compose配置文件中的服务可以直接使用服务名称进行访问,比如在web中可以使用php-fpm:9000访问php-fpm的php-fpm服务,参见下一个部分的nginx配置文件

version: '3'


services:
  web:
    image: nginx:latest
    volumes:
      - f:/git_project:/usr/share/nginx/html
      - f:/docker/php-docker/nginx-conf/conf.d/:/etc/nginx/conf.d/
    ports:
      - '80:80'
    depends_on:
      - php-fpm

  php-fpm:
    image: "scchary/php:1.2"
    volumes:
      - f:/git_project:/usr/share/nginx/html

nginx配置文件

server {
        listen        80;
        server_name  xxx.net;
        root   "/usr/share/nginx/html/xxx.net/frontend/web";
        location / {
        index index.php;
        if ( !-e $request_filename )
        {
            rewrite ^/(.*)$ /index.php?r=$1 last;
        }
        }
        location ~ \.php(.*)$ {
            fastcgi_pass   php-fpm:9000;
            fastcgi_index  index.php;
            fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO  $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
            include        fastcgi_params;
        }
}

启动

前台启动,可以看到一些信息,便于调试 : docker-compose -f web-compose.yml up
后台启动 : docker-compose -f web-compose.yml up -d

构建nginx,php的docker镜像-DockerFile 构建

其实就是把安装需要的命令使用Dokerfile的语法搞一遍,
我是需要额外安装几个扩展

Docker文件

DockerFile内容如下

FROM php:5.6.13-fpm
MAINTAINER jin<jinblog@qq.com>

# 安装所需扩展
# mbstring
RUN docker-php-ext-install mbstring
# pdo_mysql
RUN docker-php-ext-install pdo_mysql

# 先更新下apt-get
RUN apt-get update
# gd
RUN apt-get install libpng-dev -y && docker-php-ext-install gd

# imagick
RUN apt-get install -y \
    libmagickwand-dev --no-install-recommends \
    && pecl install imagick \
    && docker-php-ext-enable imagick

# bcmath
RUN docker-php-ext-install bcmath

#  Xdebug
RUN pecl install xdebug-2.5.5
RUN docker-php-ext-enable xdebug
RUN echo 'xdebug.var_display_max_depth = 15\n\
    xdebug.var_display_max_data = 1024\n\
    xdebug.var_display_max_children=128\n\
    xdebug.idekey=PHPSTORM\n\
    xdebug.remote_host=host.docker.internal\n\
    xdebug.remote_enable=on\n\
    xdebug.remote_port = 9001\n\
    xdebug.remote_handler = dbgp\n\
    xdebug.auto_trace = 1\n\
    xdebug.remote_log = /tmp/xdebug.log' >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

EXPOSE 9000

CMD ["php-fpm"]

构建命令

docker build -f DockerFile1-php -t scchary/php:1.2 .

Docker desktop与PHPSTORM整合

设置Docker Desktop

Settings -> General -> Expose daemon on tcp://localhost:2375 without TLS(勾选并重启)

设置xdebug

xdebug.idekey=PHPSTORM
xdebug.remote_host=host.docker.internal
xdebug.remote_enable=on
xdebug.remote_port = 9001
xdebug.remote_handler = dbgp
xdebug.auto_trace = 1
xdebug.remote_log = /tmp/xdebug.log

设置PHP STORM

重启PHP STORM

设置

File -> Settings -> Build, Execution, Development -> Docker -> TCP Socket(没有的可以手动添加一个) -> Engine API URL(填写上tcp://localhost:2375)

CLI interpreter

File -> Settings -> Language & Framework -> PHP -> CLI interpreter(设置成对应的容器)

PHP Storm设置Debug端口

File -> Settings -> Languages & Frameworks -> PHP -> Debug -> Xdebug -> Xdebug Port(Debug的端口,设置为和xdebug.remote_port一样的值)

PHP Storm设置DBGp Proxy

File -> Settings -> Languages & Frameworks -> PHP -> Debug -> DBGp Proxy
IDE key : 服务器开启调试的Key,设置成和xdebug.idekey一样
Host : 服务器的IP,设置成127.0.0.1
Port : Debug的端口,设置为和xdebug.remote_port一样的值

PHP Storm设置Servers

File -> Settings -> Languages & Frameworks -> PHP -> Servers
Name : 随便填
Host : 填网站的域名
Port : 填网站的端口
Debugger : 选择Xdebug

配置项目Debug信息

Run/Debug Configurations
Server : 选择上一步添加的Server

构建nginx,php的docker镜像-手动配置

php-fpm

开启一个测试的容器

docker run -di -p 9005:9000 --name php-fpm-test php:5.6.13-fpm

对容器进行自定义

登录进容器

docker exec -it php-fpm-test /bin/bash

查看配置文件位置(用于获取到配置文件位置,以便修改相关配置)

查找ini配置

php-fpm -i | grep ini
...
Configuration File (php.ini) Path => /usr/local/etc/php
Scan this dir for additional .ini files => /usr/local/etc/php/conf.d

安装xdebug(php版本对应的xdebug版本可以在 https://xdebug.org/download/historical 中找)

pecl install xdebug-2.5.5

安装vim

apt-get update
apt-get install vim

在php.ini中引入xdebug(后面的路径不是固定的,可能会变,也可以使用 docker-php-ext-install,docker-php-ext-enable等命令引入 引入)

vim /usr/local/etc/php/conf.d/xdebug.ini
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so

安装其他扩展

# 已有的扩展可以直接启用
docker-php-ext-enable xdebug
# 没有的扩展安装
docker-php-ext-install mbstring
docker-php-ext-install pdo_mysql
# gd
apt-get update
apt-get install libpng-dev -y
apt-get install libjpeg62-turbo-dev -y
apt-get install libfreetype6-dev -y
# imagick
apt-get install -y imagemagick php5-imagick libpng-dev libmagickwand-dev libmagickcore-dev
echo extension=imagick.so > /usr/local/etc/php/conf.d/imagick.ini
# bcmath
docker-php-ext-install bcmath

退出容器

Ctrl + p + q

使用容器建立新的images

docker commit -m "php 5.6.13 dev" -a "jin" 8428368dabbc php-jin:php-fpm5.6.13

连接nginx和php-fpm

创建网络

docker network create --driver bridge web-network

连接(以下两种方式任选一种即可)

连接方式1(已启动的容器加入)

docker network connect web-network docker-nginx

连接方式2(未启动的容器指定--network)

docker run --name="docker-php-fpm5.6.13" -v "f:/git_project":/usr/share/nginx/html --network web-network -d php-jin:php-fpm5.6.13
docker run --name="docker-nginx" -p 80:80 -v "f:/git_project":/usr/share/nginx/html -v f:/docker/php-docker/nginx-conf/conf.d/:/etc/nginx/conf.d/ --network web-network -d nginx

设置nginx的php-fpm配置

server {
        listen        80;
        server_name  xxx.com;
        root   "/usr/share/nginx/html/xxx.com/frontend/web";
        location / {
        index index.php;
        if ( !-e $request_filename )
        {
            rewrite ^/(.*)$ /index.php?r=$1 last;
        }
        }
        location ~ \.php(.*)$ {
            fastcgi_pass   docker-php-fpm5.6.13:9000;
            fastcgi_index  index.php;
            fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO  $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
            include        fastcgi_params;
        }
}

docker学习

概述

docker用于开发者打包代码及运行环境,避免环境不一致导致代码不能运行。也可用作虚拟化。

与传统虚拟化技术的区别

  • 传统虚拟化技术是在虚拟出一套硬件之后,在其上运行一个完整的操作系统,再在该系统上运行应用程序
  • 容器的应用程序直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器更为轻便
  • 每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会互相影响,能区分计算资源

组成

三大组成 : 容器(镜像跑起来之后就是实例(docker run xxx)),镜像,仓库(存放多个镜像)

基本使用

docker info : 查看docker相关信息

docker --help : 帮助

docker ps : 查看正在运行的容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG...] : 启动

docker run -d --name="nginx" -p 80:80 nginx
OPTIONS说明
--name : 为容器执行一个名称,--name="centos"
-d : 后台运行容器,并返回容器ID,也即启动守护式容器
-i : 以交互模式运行容器,通常与“-t”一起使用
-t : 为容器重新分配一个伪输入终端,通常与“-i”一起使用
-P : 随机端口映射
-p : 指定端口映射,有以下四种合适

  • ip:hostPort:containerPort
  • ip::containerPort
  • hostPort:containerPort
  • containerPort
    例子 : docker run -it --name="mycentos" centos:centos6.9

Ctrl + P + Q 退出当前容器且不关闭容器

exit 退出且关闭容器

docker attach : 进入正在运行的容器

例子 : docker attach 73da45cc0ea5

docker commit : 提交当前容器并使之成为一个新的镜像

格式 : docker commit -m "描述" -a "作者" 容器ID 要创建的目标镜像名:标签名
例子 : docker commit -m "centos with vim" -a "jin" 6bf0ddc92102 jin/centos:1.0

容器数据卷

docker命令直接添加

docker -v 宿主目录:容器目录

例子 : docker run -it --name="mycentos" -v e:/testVolume:/testVolume centos:centos6.9

注意 : windows系统需要设置docker deskep(Settings -> File sharing)

DockerFile添加

VOLUME指令 : 给容器添加一个或多个数据卷

容器间传递共享(--volumes-from)

docker run --volumes-from xxx
例子 : docker run -it --name="mycentos2" --volumes-from mycentos centos:centos6.9

DockerFile

执行流程

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器做出修改
  3. 执行类似docker commit的操作提交一个新的镜像曾
  4. docker再基于刚提交的镜像运行一个新容器
  5. 执行dockerfile中的下一条指令直到所有的指令执行完成

Dokerfile体系结构

FROM : 基础镜像。当前镜像基于该镜像创建
MAINTAINER : 镜像维护者的姓名和邮箱
RUN : 容器构建时需要运行的命令
EXPOSE : 当前容器对外暴露出的端口
WORKDIR : 再创建容器后,终端的默认工作目录
ENV : 用来在构建镜像的过程中设置环境变量
ADD : 拷贝+解压缩
COPY : 拷贝
VOLUME : 数据卷
CMD : 指定容器启动时要执行的命令(有多个时,最后一个生效,该指令会被run之后的参数替换)
ENTRYPOINT : 指定容器启动时要执行的命令(有多个时,最后一个生效,run之后的参数会追加到该命令后(传参))
ONBUILD : 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的ONBUILD会被触发

例子1 : 制作一个镜像,获取当前外网IP

FROM centos:centos6.9
MAINTAINER jin<jinblog@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

# 当命令是以 ["XXX"] 的形式定义时,命令将会以可执行二进制文件来执行,而不是shell
RUN yum install curl -y

CMD curl ip.sb
# docker build -f Dockerfile1.txt -t mycentos:1.0 .

例子2 : 制作一个镜像,获取当前外网IP,并能接受curl的参数

FROM centos:centos6.9
MAINTAINER jin<jinblog@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

# 当命令是以 ["XXX"] 的形式定义时,命令将会以可执行二进制文件来执行,而不是shell
RUN yum install curl -y

ENTRYPOINT ["curl", "ip.sb"]