Mac系统Docker快速搭建LNMP开发环境

本文详细介绍如何在macOS Mojave系统上使用Docker搭建本地LNMP开发环境,包括Docker的安装、基本命令的使用、镜像的搜索下载及运行,以及如何通过Dockerfile构建自定义的LNMP镜像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

docker技术流行也有一段时间了,虽然关注过但是一直没有真正实际的操作做过。最近看到同事用docker搭建的本地开发环境,所以抽时间也折腾折腾,试着在本机搭建了一套基于docker的开发环境,记录一下。

我之前一直用的Vagrant搭建的环境,有想用的可以去Vagrant官网看看文档。

下面步入正题:

操作系统:

macOS Mojave 10.14.2版本

Step1、安装docker:

打开终端输入如下命令行安装或直接下载Docker.dmg包安装

//安装
➜  ~ brew cask reinstall docker
==> Satisfying dependencies
==> Downloading https://download.docker.com/mac/stable/29211/Docker.dmg
#################################################################### 100%
...后面的照提示操作...

//查看版本
➜  ~ docker -v
Docker version 18.09.0, build 4d60db4

//显示所有命令
➜  ~ docker <Tab> 
docker                         docker-compose                 docker-credential-osxkeychain  docker-machine

//显示docker命令选项
➜  ~ docker <回车>
Usage:	docker [OPTIONS] COMMAND
A self-sufficient runtime for containers
...省略...
Run 'docker COMMAND --help' for more information on a command.
 

安装成功后,启动台点击Docker图标开启,标题栏出现如下标记表示启动成功。

Step2、搜索/下载/查看/运行镜像容器

这里已centos镜像为例。Docker官方镜像地址:https://hub.docker.com/

//搜索centos镜像
//列属性:NAME镜像名 DESCRIPTION介绍 STARS收藏量 OFFICIAL是否官方 AUTOMATE
➜  ~ docker search centos
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                             The official build of CentOS.                   5058                [OK]
ansible/centos7-ansible            Ansible on Centos7                              119                                     [OK
...省略...

//下载centos镜像,版本7.6.1810(hub上有可选项,不指定默认最新版latest)
➜  ~ docker pull centos:7.6.1810
7.6.1810: Pulling from library/centos
a02a4930cb5d: Pull complete
Digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426
Status: Downloaded newer image for centos:7.6.1810

//查看已下载镜像
//列属性:REPOSITORY镜像名 TAG标签/版本 IMAGEID镜像唯一标识 CREATED创建时间
➜  ~ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7.6.1810            d5f224905a66        12 days ago         202MB

//运行镜像生成容器(运行操作系统必须带上/bin/bash,否则容器不会是启动UP状态)
//-d: 后台运行容器,并返回容器ID;
//-i: 以交互模式运行容器,通常与 -t 同时使用;
//-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
//--privileged: 给这个容器扩展的特权,否则类似systemctl命令无权限执行
//--name: 给容器起个唯一名字,不指定随机生成
//其他参数使用docker run --help查看
➜  ~ docker run -dit --privileged --name first centos:7.6.1810 /bin/bash
b517f35f7350f92bf605af56365a4649f149a79515f55e47b6022af64271c624

//查看容器列表,下面就是刚才生成的容器
➜  ~ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                      PORTS               NAMES
b517f35f7350        centos:7.6.1810     "/bin/bash"              About a minute ago   Up 59 seconds                                   ecstatic_shannon

//进入容器操作,b517f35f7350可以是上面的容器ID或NAMES
➜  ~ docker exec -it b517f35f7350 /bin/bash
[root@b517f35f7350 /]# uname -a
Linux b517f35f7350 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
   

到此docker从安装运行到进入容器交互算是结束了。你也可以再尝试下其他的镜像,比如nginx\php\mysql的等等。

下面基于docker部署lnmp开发环境。

Step3、部署lnmp开发环境(不仅限于MacOS系统)

部署方式有两种:

一种是单独pull对应的nginx/php/mysql镜像后,分别生成容器,容器间连接运行(相当于多台服务器交互);

另一种就是直接下载基础linux镜像,基础镜像配合Dockfile构建自己的镜像(在镜像内安装nginx/php/mysql运行,相当于单台服务器);

我使用的是第二种方式,暴力。。。

首先,新建一个目录lnmp,然后创建一个Dockfile文件。格式参考地址:https://docs.docker.com/engine/reference/builder/#dockerignore-file

//创建进入lnmp目录,生成文件Dockerfile
//注意:以下操作都是在lnmp目录中
➜ mkdir lnmp
➜ cd lnmp
➜ pwd
/Users/liuns/Workspace/docker/lnmp //具体位置以自己的为准
➜ touch Dockerfile
➜ vim Dockerfile
...省略,具体内容在下面依次列出来...

//这是我的一个目录结构,以及构建时需要的资源、挂载到容器的目录、一些快捷脚本
➜ ll
8 -rw-r--r--@  1 liuns  staff  1624 12 16 20:07 CentOS-Base.repo //yum镜像
8 -rw-r--r--@  1 liuns  staff  2387 12 17 10:04 Dockerfile //构建文件
8 -rwxr-xr-x   1 liuns  staff    40 12 17 01:57 docker_build.sh //构建镜像shell
8 -rwxr-xr-x   1 liuns  staff    43 12 17 01:59 docker_exec.sh //进入容器交互shell
8 -rwxr-xr-x@  1 liuns  staff   623 12 17 02:25 docker_run.sh //运行镜像生成容器
0 drwxr-xr-x   6 liuns  staff   192 12 17 01:55 nginx //挂载的nginx配置目录
0 drwxr-xr-x   3 liuns  staff    96 12 17 01:37 php-fpm.d //挂载的php-fpm配置目录
0 drwxr-xr-x  41 liuns  staff  1312 12 17 01:43 php.d //挂载的php配置目录

➜ tree
.
├── CentOS-Base.repo
├── Dockerfile
├── docker_build.sh
├── docker_exec.sh
├── docker_run.sh
├── nginx
│   ├── conf.d
│   │   ├── default.conf
│   ├── nginx.conf
├── php-fpm.d
│   └── www.conf
└── php.d
    ├── 15-xdebug.ini
    ├── 20-bcmath.ini
    ├── 20-bz2.ini
    ├── 20-calendar.ini
    ├── 20-ctype.ini
    ├── 20-curl.ini
    ├── 20-dom.ini
    ├── 20-exif.ini
    ├── 20-fileinfo.ini
    ├── 20-ftp.ini
    ├── 20-gd.ini
    ├── 20-gettext.ini
    ├── 20-iconv.ini
    ├── 20-imap.ini
    ├── 20-json.ini
    ├── 20-ldap.ini
    ├── 20-mbstring.ini
    ├── 20-mysqlnd.ini
    ├── 20-pdo.ini
    ├── 20-phar.ini
    ├── 20-simplexml.ini
    ├── 20-soap.ini
    ├── 20-sockets.ini
    ├── 20-sqlite3.ini
    ├── 20-tokenizer.ini
    ├── 20-xml.ini
    ├── 20-xmlwriter.ini
    ├── 20-xsl.ini
    ├── 30-mcrypt.ini
    ├── 30-mysqli.ini
    ├── 30-pdo_mysql.ini
    ├── 30-pdo_sqlite.ini
    ├── 30-wddx.ini
    ├── 30-xmlreader.ini
    ├── 40-igbinary.ini
    ├── 40-swoole.ini
    ├── 40-yaf.ini
    ├── 40-zip.ini
    └── 50-redis.ini

//以上内容都添加后开始构建
➜ sh ./docker_build.sh
...这里需要下载需要的包...
...滚屏...
...滚屏...
...滚屏...
...Completed...

//查看自己的镜像 //镜像名称是lnmp
➜ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
lnmp                1.0                 2da93e8d1eba        46 hours ago        2.17GB
centos              7.6.1810            d5f224905a66        12 days ago         202MB

//运行镜像容器
➜ sh ./docker_run.sh lnmp_1 //lnmp_1是自定义的镜像NAME

//查看刚才生成的NAME是lnmp_1的容器,生成后可再浏览器访问localhost访问(lnmp环境都是在Docerfile文件里配置好的,并且相关端口都会映射到宿主机)
➜ docker ps -a 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
4ac166e672b6        lnmp:1.0            "/usr/sbin/init /bin…"   46 hours ago        Up 38 hours ago                       lnmp_1

//进入容器交互
➜ sh ./docker_exec.sh lnmp_1 //lnmp_1是自定义的镜像NAME

下面是lnmp目录下相关文件的具体内容:

或者直接从github上拉取:https://github.com/liuensong/docker_lnmp.git


CentOS-Base.repo

# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#

[base]
name=CentOS-$releasever - Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
baseurl=https://mirrors.ustc.edu.cn/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates
[updates]
name=CentOS-$releasever - Updates
# mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
baseurl=https://mirrors.ustc.edu.cn/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
# mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
baseurl=https://mirrors.ustc.edu.cn/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
# mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
baseurl=https://mirrors.ustc.edu.cn/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

Dockerfile

# This is lnmp Dockerfile
# Version 1.0
# docker build -t lnmp:1.0 ./
# docker run -dit -p 80:80 -p 21:21 -p 22:22 -p 3306:3306 -p 6739:6739 -p 11211:11211 \
#-v /Users/liuns/Workspace:/usr/share/nginx/html \
#-v /Users/liuns/Workspace/docker/lnmp/php.d:/etc/php.d \
#-v /Users/liuns/Workspace/docker/lnmp/php-fpm.d:/etc/php-fpm.d \
#-v /Users/liuns/Workspace/docker/lnmp/nginx/nginx.conf:/etc/nginx/nginx.conf \
#-v /Users/liuns/Workspace/docker/lnmp/nginx/conf.d:/etc/nginx/conf.d \
#--privileged=true --name lnmp lnmp:1.0 /bin/bash	

# Base images 基础镜像
FROM centos:7.6.1810

#MAINTAINER 维护者信息
MAINTAINER liuensong <liuensong@gmail.com>

#中文支持
RUN yum -y install kde-l10n-Chinese telnet
RUN yum -y reinstall glibc-common
RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8

#ENV 设置环境变量
ENV LANG "zh_CN.UTF-8"
ENV LC_ALL "zh_CN.UTF-8"

#RUN 执行以下命令 
#更换ali镜像源
COPY ./CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo
RUN yum makecache && yum -y update

#remi镜像源
RUN yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm
RUN yum install -y yum-utils
RUN yum-config-manager --enable remi-php72
RUN yum -y update

#安装vim
RUN yum install -y vim

#安装htop
RUN yum install -y htop

#安装openvpn
RUN yum install -y openvpn

#安装nginx
RUN yum install -y nginx*
RUN systemctl enable nginx.service

#安装mysql/mariadb
RUN yum install -y mariadb*
RUN systemctl enable mariadb.service

#安装redis
RUN yum install -y redis
RUN systemctl enable redis.service

#安装memcached
RUN yum install -y memcached*
RUN systemctl enable memcached.service

#安装php
RUN yum install -y php php-fpm php-bcmath php-dom php-gd php-igbinary php-imap \
php-ldap php-mbstring php-mcrypt php-mysqli php-mysqlnd php-pdo php-pdo_mysql \
php-pdo_sqlite php-redis php-soap php-sqlite3 php-swoole php-wddx \
php-xdebug php-xml php-xmlreader php-xmlwriter php-xsl php-yaf php-zip
RUN systemctl enable php-fpm.service

#WORKDIR 相当于cd
WORKDIR ~ 

#EXPOSE 映射端口
EXPOSE 80 21 22 3306 6739 11211

ENTRYPOINT ["/usr/sbin/init"]

#CMD [""]

docker_build.sh

#!/bin/bash
docker build -t lnmp:1.0 ./

 

docker_run.sh

#!/bin/bash
name="lnmp";
if [ $1 ]; then
name=$1;
fi
docker run -dit -p 80:80 -p 21:21 -p 22:22 -p 3306:3306 -p 6739:6739 -p 11211:11211 \
-v /Users/liuns/Workspace:/usr/share/nginx/html \
-v /Users/liuns/Workspace/docker/lnmp/php.d:/etc/php.d \
-v /Users/liuns/Workspace/docker/lnmp/php-fpm.d:/etc/php-fpm.d \
-v /Users/liuns/Workspace/docker/lnmp/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /Users/liuns/Workspace/docker/lnmp/nginx/conf.d:/etc/nginx/conf.d \
--privileged=true --name $name lnmp:1.0 /bin/bash

-v是需要的挂载的内容,可以直接从容器内把对应的文件拷贝出来放到lnmp对应目录下。


docker_exec.sh

#!/bin/bash
name="lnmp";
if [ $1 ]; then
name=$1;
fi
docker exec -it $name /bin/bash

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值