Docker 安装LNMP

  1. /home/用户名/下创建如下文件夹和文件:
    1
    2
    3
    4
    5
    6
    7
    8
    /home/blueyi/www
    ├── data
    ├── nginx
    │   └── conf.d
    │   └── default.conf
    └── web
    ├── index.html
    └── index.php

这些文件夹和文件用于挂载,default.conf内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server {
listen 80;
server_name localhost;

location / {
root /usr/share/nginx/html;
#添加伪静态支持
try_files $uri $uri/ /index.php?$query_string;
index index.php index.html index.htm;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}

location ~ \.php$ {
#php 地址直接填容器名
fastcgi_pass php-fpm73:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
include fastcgi_params;
}
}

  1. 安装 mysql5.7,并进入容器设置远程访问:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #拉取mysql5.7镜像
    docker pull mysql:5.7
    #创建mysql5.7容器
    docker run --name mysql57 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d -v ~/www/data:/var/lib/mysql mysql:5.7

    #进入mysql容器
    docker exec -it mysql57 bash
    #连接mysql设置远程访问
    mysql -uroot -p
    GRANT ALL ON *.* TO 'root'@'%';
    FLUSH PRIVILEGES;
  2. 安装PHP7.3:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #拉取PHP7.3镜像
    docker pull php:7.3-fpm
    #创建PHP7.3容器并关联mysql5.7
    docker run --name php-fpm73 -d -v ~/www/web:/var/www/html --link mysql57:mysql php:7.3-fpm

    #进入PHP7.3容器并安装mysql扩展
    docker exec -it php-fpm73 bash
    apt-get update
    apt-get install -y libfreetype6 libfreetype6-dev libmcrypt-dev libmcrypt4 libcurl3-dev
    apt install build-essential libprotobuf-dev libboost-dev openssl protobuf-compiler
    docker-php-ext-install pdo pdo_mysql

    #退出PHP7.3容器,重启PHP7.3容器
    docker restart php-fpm73
  3. 安装nginx:

    1
    2
    3
    4
    #拉取nginx镜像
    docker pull nginx
    #创建nginx容器
    docker run -d --name nginx -p 80:80 -v ~/www/web/:/usr/share/nginx/html -v ~/www/nginx/conf.d:/etc/nginx/conf.d --link php-fpm73:php-fpm nginx
  4. 安装composer:

    1
    2
    3
    4
    #拉取docker镜像
    docker pull composer
    #创建composer容器,并生成Laravel项目
    docker run --rm -it --volume ~/www/web/laravel:/app composer create-project laravel/laravel laravel5.7
  5. 安装phpmyadmin:

    1
    docker run --name phpmyadmin -d --link mysql57:db -p 8080:80 phpmyadmin/phpmyadmin

Docker删除镜像相关命令:

  1. 查询镜像:
    docker images
  2. 查询容器:
    docker ps -a
  3. 删除容器:
    docker rm 容器id
  4. 删除镜像:
    docker rmi 镜像id

    注意:

    1. 删除前需要确保容器已经停止;
    2. docker rmi 删除镜像,docker rm 删除容器;
    3. 必须先删除容器再删除镜像。

docker run 相关命令(通过run命令创建新的容器):
命令格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
常用选项说明:

  • -d, --detach=false,指定容器运行于前台还是后台,默认false
  • -i, --interactive=false,打开STDIN,用于控制台交互
  • -t, --tty=false,分配tty设备,支持终端登录,默认false
  • -u, --user="",指定容器的用户
  • -a, --attach=[],登录容器(必须是docker run -d启动的容器)
  • -w, --workdir="",指定容器工作目录
  • -c, --cpu-shares=0,设置容器CPU权重,在CPU共享场景使用
  • -e, --env=[],制定环境变量,容器中可以使用此环境变量
  • -m, --memory="",指定容器内存上限
  • -p, --publish=[],指定容器暴露端口
  • -h, --hostname="",指定容器主机名
  • -v, --volume=[],给容器挂载存储卷,挂载到容器某个目录
  • --volumesfrom=[],给容器挂载其他容器上的卷,挂载到容器某个目录
  • --cap-add=[],添加权限
  • --cap-drop=[],删除权限
  • --cidfile="",运行容器后,在指定容器中写入容器PID值,一种典型的监控系统用法
  • --cpuset="",设置容器可以使用那些CPU,此参数可以用来容器独占CPU
  • --device=[],添加主机设备给容器,相当于设备直通
  • --dns=[],指定容器dns服务器
  • --dns-search=[],指定容器dns搜索域名,写入到容器/etc/resolv.conf文件
  • --entrypoint="",覆盖image的入口点
  • --env-file=[],制定环境变量文件,文件格式每行一个环境变量
  • --expose=[],指定容器暴露的端口,即修改镜像暴露端口
  • --link=[],制定容器间关联,使用其他容器IP、env等信息
  • --lxc-conf=[],指定容器配置文件,只有在指定--exec-driver=lxc时使用
  • --name="",指定容器名字,后续可通过名字管理容器,links特性需要使用名字
  • --net="bridge",容器网络设置:
    • bridge:使用docker daemon指定的网桥
    • host:容器使用主机网络
    • container:NAME_OR_ID:使用其他容器的网络,共享IP和PORT等网络资源
    • none:容器使用自己的网络(类似bridge)
  • --privileged=false,指定容器是否为特权容器,特权容器拥有所有capabilities
  • --restart="no",指定容器停止后的重启策略:
    • no:容器退出时不重启
    • on-failure:容器故障退出(返回值非零)时重启
    • always:容器退出时总是重启
  • --rm=false,指定容器停止后自动删除容器(不支持docker run -d启动的容器)
  • --sig-proxy=true,设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP、SIGKILL不能被代理