2013年发布至今, Docker 一直广受瞩目,被认为可能会改变软件行业。但是,许多人并不清楚 Docker 到底是什么,要解决什么问题,好处又在哪里?今天通过一个简单的LNMP项目架构部署环节让大家让了解docker的使用方法,所有的软装按照均采用docker部署。

第一步、centos7安装docker

1.1如果之前安装过docker,卸载旧版本

yum remove docker docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine

1.2安装需要的软件包

yum install -y yum-utils device-mapper-persistent-data lvm2

1.3添加软件源信息(可选)

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

1.4更新yum包缓存(可选)

yum makecache fast

1.5安装docker-ce

yum -y install docker-ce

1.6启动docker后台服务及开机启动

systemctl enable docker && systemctl start docker

1.7docker相关配置

# CentOS7的Docker默认存储路径修改
vi /usr/lib/systemd/system/docker.service
# 找到以下内容
ExecStart=/usr/bin/dockerd-current \
# -g 或 --graph 或 --data-root,插入或修改后保存
  -g /datadisk/docker/data
# 修改后需要重载设置
systemctl daemon-reload

#配置镜像加速
i.获取阿里云镜像加速器参考:https://blog.csdn.net/li1325169021/article/details/90770119
[root@localhost ~]#  mkdir -p /etc/docker
[root@localhost ~]# vim  /etc/docker/daemon.json
在文件中添加如下配置
#阿里云镜像加速器
{"registry-mirrors": ["http://hub-mirror.c.163.com"] }
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
ii.配置镜像加速后重启docker可能会报错,参考:https://blog.csdn.net/li1325169021/article/details/90782846

1.8查看docker版本

docker version

1.9运行 hello-world

docker run hello-world

1.10卸载删除docker-ce

[root@localhost ~]#  systemctl stop docker 
[root@localhost ~]# yum -y remove docker-ce
[root@localhost ~]# rm -rf /var/lib/docker

第二步、Docker安装部署Nginx

2.1拉取官方的最新版本的镜像

docker pull nginx:latest

2.2拉取官方的最新版本的镜像

docker pull nginx:latest

2.3docker命令查看是否已安装了 nginx

docker images
#在上图中可以看到我们已经安装了最新版本(latest)的 nginx 镜像。

2.4安装完成后,运行 nginx 容器

docker run --name nginx-test -p 8081:80 -d nginx

#参数说明:
--name nginx-test:容器名称。
-p 8081:80: 端口进行映射,将本地 8081 端口映射到容器内部的 80 端口。
-d nginx: 设置容器在在后台一直运行。

2.5检查nginx 容器是否运行成功

docker container ls
#说明
如果安装成功,是可以看到name为nginx-test已经存在运行列表中,期间如果我们想修改端口,重新运行容器的话
要先终止,在删除
docker container kill [containID]
docker container rm[containID]

最后我们可以通过浏览器可以直接访问 IP地址:8081,检查nginx 服务是否开启。

雷小天博客

到这步nginx基本安装成功了,但是还是不行,因为运行的Nginx的配置文件是在容器内部的,不方便修改,所以我们可以先把容器内的配置文件复制到宿主机。

2.6查看容器中nginx的配置文件目录

docker exec nginx-prod ls /etc/nginx
conf.d
fastcgi_params
koi-utf
koi-win
mime.types
modules
nginx.conf
scgi_params
uwsgi_params
win-utf

#说明
nginx-prod是你运行nginx容器的名称,可以通过docker container ls查看,以上是你容器/etc/nginx目录结构
容器中默认的nginx目录地址:root   /usr/share/nginx/html;

#当然你也可以用下面命令进入容器
docker exec -it 243c32535da7 /bin/bash
#说明
243c32535da7:是你容器的id

#进入容器,发现容器根目录如下
[root@lxh2eeg4mh7oujtc-1122667 leixiaotian]# docker exec -it d977338be31a /bin/bash
root@d977338be31a:/# ls
bin  boot  dev	etc  home  lib	lib64  media  mnt  opt	proc  root  run  sbin  srv  sys  tmp  usr  var	www  wwwlogs

2.7复制容器内的配置文件到宿主机

如果你不想复制整个文件夹,可仅复制conf.d文件夹内的配置文件,运行时挂载相应文件即可

docker cp -a nginx-prod:/etc/nginx/ /srv/nginx/conf

#说明
nginx-prod依然是你的容器运行名称

2.8停止Nginx容器并删除

我们要重新运行容器,挂载配置文件,那么这个容器就没用了,需要停止再删除

docker stop nginx-prod
docker rm nginx-prod

#说明
nginx-prod依然是你的容器运行名称,或者也可以用下面方式
docker container kill [containID]
docker container rm[containID]

2.9重新运行容器,并挂载我们在2.7步复制出来的配置文件目录

docker run -p 8081:80 --restart always --name nginx-prod -v /srv/nginx/www:/www -v /srv/nginx/conf/:/etc/nginx/ -v /srv/nginx/logs:/var/log/nginx -v /srv/nginx/wwwlogs:/wwwlogs -d nginx

#说明
--restart always :无论退出状态是如何,都重启容器
-v:挂载命令,主机目录:容器目录,当然你如果不想挂载那么多,只挂载配置文件也行,注意,这个时候你需要复制一份项目目录到容器中去
所以,/srv/nginx/www:/www这个挂载的作用就是把你主机项目文件夹挂载到容器中,然后再在主机配置文件nginx.conf中,设置root /www即可
最后强调下,挂载的配置文件中设置的根目录不是宿主机的目录,而是容器的根目录。
推荐挂载宿主机总目录到容器总目录,如:-v /data/www:/www

2.10修改配置文件,重启Nginx

到此Nginx已安装完成,如有需要就直接修改/srv/nginx/conf/conf.d目录下的配置文件,然后重启Nginx容器即可生效

docker restart nginx-prod

第三步、Docker安装部署PHP7

3.1拉取官方的PHP7.2.25镜像

查找 Docker Hub 上的 php 镜像:

雷小天博客

可以通过 Sort by 查看其他版本的 php,默认是最新版本 php:latest。此外,我们还可以用 docker search php 命令来查看可用版本。这里我们拉取官方的镜像,标签为7.2.25-fpm

docker pull php:7.2.25-fpm

3.2检查PHP7.2.25镜像

docker images

3.3运行PHP镜像

docker run --name php7 -v /data/www:/www -d php:7.2.25-fpm
docker run --name php7 -p 9000:9000 -v /data/www:/www -d php:7.2.25-fpm

#说明
这里一定记得要挂载目录,每个容器是独立的,前面挂载过新的容器也要挂载。这里如果不定义端口映射的话,
后面的nginx中的default.conf配置文件需要把127.0.0.1:9000改成php-fpm的地址172.1.0.3:9000
容器的ip地址查看命令:docker inspect c13785c033c3(容器ID)
-d php:7.2.25-fpm 后台运行
我这边配置的就是用无,端口映射+配置php-fpm的地址172.1.0.3:9000
#错误
 connect() failed (111: Connection refused) while connecting to upstream, client: 183.14.30.76, service
把fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;这一行
改为:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

3.4测试PHP环境是否安装成功

首先在宿主机/data/www/test/目录下,新增test.php文件

<?php
   phpinfo();
?>
#为什么我们要在/data/www/test目录下新增test.php文件,因为我在文件/srv/nginx/conf/conf.d/default.conf中
设置的root /www/test,而我挂载的项目根目录是-v /data/www:/www,所以宿主机的/data/www/test目录正是对应/www/test目录

然后在浏览器运行ip:8081/test.php

第四步、Docker安装部署MySQL

4.1拉取官方的MySQL8.0.18镜像

拉取MySQL镜像,可参照PHP的方法,在 Docker Hub 上的 查找你需要的MySQL 镜像:

docker pull mysql:8.0.18

4.2查看本地镜像

docker images

4.3运行MySQL容器

安装完成后,我们可以使用以下命令来运行 mysql 容器

docker run -itd --name mysql-prod -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.18

#参数
-p 3306:3306 :映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务。
MYSQL_ROOT_PASSWORD=123456:设置 MySQL 服务 root 用户的密码。

4.4容器机登录MySQL

容器可以通过 root 和密码 123456 访问 MySQL 服务

mysql -h localhost -u root -p
#创建数据库
CREATE DATABASE `laravel` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci

雷小天博客

#当然在这步可能你的php-fpm容器连接不上mysql容器,因为默认的php-fpm是没有安装pdo_mysql扩展的
#所以通过以下三步解决pdo_mysql安装
1.进入到php容器中:docker exec -it [容器ID] /bin/bash
2.进入容器后,切换到目录:/usr/local/bin
3.执行命令安装扩展:docker-php-ext-install pdo pdo_mysql
4.重启php容器:docker restart php7

#解决MySql出现的[2054]连接失败的问题
#登录mysqlmysql -u root -p
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
#修改项目mysql配置文件中的host
DB_HOST=172.17.0.4
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=123456

至此,LNMP所有的软件已全部使用Docker安装完成,相信你通过对本文的阅读,对docker有了更深层的了解!