最近开始学习Docker,目的很简单,解决万恶的开发环境配置问题。
准备工作:手头上有1台阿里云ECS服务器,CentOS7操作系统;

在阿里云上安装docker

step 1: 安装必要的一些系统工具

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

Step 2: 添加软件源信息

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

Step 3: 更新并安装 Docker-CE

1
2
sudo yum makecache fast
sudo yum -y install docker-ce

Step 4: 开启Docker服务

sudo service docker start

Step 5: 安装校验

docker version

Step 6: 修改daemon配置文件/etc/docker/daemon.json来使用加速器

1
2
3
4
5
6
7
8
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://cyb2bu5x.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

搭建LNMP开发环境

Centos下安装docker以及启动失败原因

1. 安装docker

1
yum install docker
2.查看docker状态
1
systemctl status docker.service
  • 如果linux的内核中的SELinux不支持 overlay2 graph driver ,
  • 解决方法有两个,要么启动一个新内核,要么就在docker里禁用selinux,–selinux-enabled=false
3.编辑docker配置文件
1
vi /etc/sysconfig/docker
4.解决docker启动nginx报错Error response from daemon: oci runtime error: container_linux.go:235: starting container process 这个问题的原因是: Linux和docker版本兼容问题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
1、查看你当前的内核版本
uname -r

2、更新yum包
sudo yum update

3、卸载已安装的docker(如果安装过的话)
yum remove docker docker-common docker-selinux docker-engine

4、安装需要的软件包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

5、设置yum源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

6、可以查看所有仓库中所有docker版本,并选择特定版本安装
yum list docker-ce --showduplicates | sort -r

7、重新安装docker
sudo yum install docker-ce

8、启动docker
sudo systemctl start docker

9、验证安装是否成功
docker version //查看docker的版本
docker ps //查看当前正在运行的容器

10、删除原本装好的nginx容器(如果安装过)
docker rm nginx(容器名字或者id)

11、删除nginx镜像文件
docker images //查看镜像文件
docker rmi nginx //删除nginx镜像
docker rmi -f nginx //强制删除nginx镜像

12、重装并启动nginx
docker run --name nginx -d -p 80:80 nginx
5. docker 容器启动成功但是无法访问
  • 解决办法:忙猜应该是防火墙的原因。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    vi /etc/sysctl.conf
    或者
    vi /usr/lib/sysctl.d/00-system.conf
    # 添加如下代码:
    net.ipv4.ip_forward=1

    # 重启network服务
    systemctl restart network


    # 查看是否修改成功
    sysctl net.ipv4.ip_forward

    # 如果返回为“net.ipv4.ip_forward = 1”则表示成功了

docker安装php7.2

1
2
3
4
5
# 下载镜像
docker pull php:7.2-fpm

# 创建php容器:
docker run --name php72 -v /root/lnmp/www/:/var/www/html/ -d php:7.2-fpm

参数说明:

  • –name php72 : 设置容器名称。
  • -v /root/lnmp/www:/var/www/html: 将主机中项目的目录 www 挂载到容器中的目录
安装PHP扩展
1
2
3
4
5
6
7
8
9
10
# 进入PHP容器
docker exec -it php72 bash
# 更新软件源
apt update
# 安装各种库
apt install -y libwebp-dev libjpeg-dev libpng-dev libfreetype6-dev
# 编译安装
docker-php-ext-install gd
# 查看是否成功安装gd扩展
php -m | grep gd
举个🌰🌰

PHP容器默认是没有redis扩展的。所以我们通过docker-php-ext-install安装redis扩展

1
2
3
4
5
6
7
8
9
10
11
12
13
# 下载扩展包
curl -L -o /tmp/reids.tar.gz https://codeload.github.com/phpredis/phpredis/tar.gz/5.0.2

# 解压
tar -xzf reids.tar.gz

# 安装
docker-php-source extract
mv phpredis-5.0.2 /usr/src/php/ext/phpredis
docker-php-ext-install phpredis

# 检查redis 扩展是否已经安装上
php -m | grep redis

docker安装nginx

1
2
3
4
5
6
7
8
9
docker pull nginx

# 创建一个nginx容器
docker run --name nginx -p 80:80 -d \
-v /root/lnmp/www:/usr/share/nginx/html \
-v /root/lnmp/nginx/conf.d:/etc/nginx/conf.d \

-v /root/lnmp/nginx/logs:/var/log/nginx/
--link php72:php \
Nginx

参数说明:

  • -p 8083:80: 端口映射,把 nginx 中的 80 映射到本地的 8083 端口。
  • ~/nginx/www: 是本地 html 文件的存储目录,/usr/share/nginx/html 是容器内 html 文件的存储目录。
  • ~/nginx/conf/conf.d: 是本地 nginx 配置文件的存储目录,/etc/nginx/conf.d 是容器内 nginx 配置文件的存储目录。
  • –link php72:php: 把 php 的网络并入 nginx,并通过修改 nginx 的 /etc/hosts,把域名 php 映射成 127.0.0.1,让 nginx 通过 php:9000 访问 php-fpm

docker安装mysql

1
2
3
4
5
6
7
docker pull mysql:5.6

# 创建mysql容器
docker run -itd --name mysql56 \
--link php72:php \
--link yb-nginx:nginx \
-p 3306:3306 -e MYSQL_ROOT_PASSWORD=qweasd -d mysql

参数说明

  • –link php72:php
    将此容器与php通过网络连接起来,这样在nginx容器里就可以访问到php容器里提供的服务。

  • –link yb-nginx:nginx
    将此容器与nginx容器通过网络连接起来,在nginx容器以后即可以通过主机名访问到mysql容器进行连接数据库操作。

  • -e MYSQL_ROOT_PASSWORD=qweasd
    设置mysql的root用户密码为qweasd

  • -p 3306:3306

进入容器操作mysql
1
2
3
4
5
# 进入容器
docker exec -it mysql-ybphp bash

# 登录mysql
mysql mysql -u root -p

注意:

  • 主机中执行docker exec -it <容器名 or id> /bin/bash进入容器的命令行。

php容器里安装mysql扩展

1
2
3
4
5
6
#进入php容器
docker exec -it php72 bash
# php容器自带pdo扩展
docker-php-ext-install pdo_mysql
# 查看版本
php -m

安装成功,退出docker,重启docker

1
docker restart php

注意:项目内部连接MySQL用的host是容器内部IP

1
docker inspect 容器id

将文件拷贝到容器

  • docker cp 要拷贝的文件路径 容器名(或者 容器id):要拷贝到容器里面对应的路径

示例:假设容器名为php72,现在要将宿主机/www/index.php文件拷贝到容器里面的/data/www路径下面,那么命令该怎么写呢?
答案:在宿主机上面执行如下命令

1
docker cp /www/index.php php72:/data/www/

Docker单独部署一个服务

Fastadmin框架部署举例

1
2
# 启动容器
docker run --name fastadmin -p 8081:80 -v /root/lnmp/www/fastadmin/:/usr/share/nginx/html -v /root/lnmp/nginx/fastadmin/conf.d/:/etc/nginx/conf.d -v /root/lnmp/nginx/fastadmin/log/:/var/log/nginx --link php72:php --link mysql57:mysql -d nginx:1.9.5

docker 常用命令

帮助类命令

1
2
3
docker version
docker info
docker help