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