www.9778.com 6

www.9778.com:Docker 学习笔记 (一)Dockerfile 创建本地镜像

一、测试环境

    dockerfile,
主要是四部分组成:基础镜像信息、维护者信息、镜像操作指令、容器启动执行指令。

build Build an image from a Dockerfile 通过Dockerfile构建出一个镜像

一、在Docker中安装环境(PHP、Nginx、MySQL、Redis、memcached、MongoDB)

OS version: CentOS Linux release 7.5.1804 (Core)

 

[root@localhost ~]# docker build --help

Usage:  docker build [OPTIONS] PATH | URL | -

Build an image from a Dockerfile

Options:
      --add-host list           Add a custom host-to-IP mapping (host:ip)                  添加自定义的主机到IP映射(主机:IP)
      --build-arg list          Set build-time variables                                   设置镜像创建时的变量
      --cache-from strings      Images to consider as cache sources                        指定缓存源,指定后将再不使用本地生成的镜像链,而是从镜像仓库中下载
      --cgroup-parent string    Optional parent cgroup for the container                   容器的可选父cgroup
      --compress                Compress the build context using gzip                      使用gzip压缩构建上下文
      --cpu-period int          Limit the CPU CFS (Completely Fair Scheduler) period       限制 CPU CFS周期
      --cpu-quota int           Limit the CPU CFS (Completely Fair Scheduler) quota        限制 CPU CFS配额
  -c, --cpu-shares int          CPU shares (relative weight)                               设置 cpu 使用权重
      --cpuset-cpus string      CPUs in which to allow execution (0-3, 0,1)                指定使用的CPU id
      --cpuset-mems string      MEMs in which to allow execution (0-3, 0,1)                指定使用的内存 id
      --disable-content-trust   Skip image verification (default true)                     忽略校验,默认开启
  -f, --file string             Name of the Dockerfile (Default is 'PATH/Dockerfile')      指定要使用的Dockerfile路径
      --force-rm                Always remove intermediate containers                      设置镜像过程中删除中间容器
      --iidfile string          Write the image ID to the file                             将图像ID写入文件
      --isolation string        Container isolation technology                             使用容器隔离技术
      --label list              Set metadata for an image                                  设置镜像使用的元数据
  -m, --memory bytes            Memory limit                                               设置内存最大值
      --memory-swap bytes       Swap limit equal to memory plus swap: '-1' to enable unlimited swap                    设置Swap的最大值为内存+swap,"-1"表示不限swap
      --network string          Set the networking mode for the RUN instructions during build (default "default")      在构建期间为RUN指令设置联网模式(默认“default”)
      --no-cache                Do not use cache when building the image                                               创建镜像的过程不使用缓存
      --pull                    Always attempt to pull a newer version of the image                                    尝试去更新镜像的新版本
  -q, --quiet                   Suppress the build output and print image ID on success                                安静模式,成功后只输出镜像ID
      --rm                      Remove intermediate containers after a successful build (default true)                 设置镜像成功后删除中间容器
      --security-opt strings    Security options                                                                       安全选项
      --shm-size bytes          Size of /dev/shm                                                                       设置/dev/shm的大小,默认值是64M
  -t, --tag list                Name and optionally a tag in the 'name:tag' format                                     以'name:tag'格式命名和可选的标记
      --target string           Set the target build stage to build.                                                   设置要构建的目标构建阶段。
      --ulimit ulimit           Ulimit options (default [])                                                            Ulimit配置

1、安装Docker

docker cluster : master 1 + data node 4

step 1: 按照语法,如下写一个centos操作系统的nignx镜像。

docker
build是非常重要的一个功能,你可以用它来制作出符合你自己需求的镜像
由于非官方镜像的安全性无法得到保证,而我们又确实需要某些特殊功能的镜像,因此我们可以使用Dockerfile,创建一个可以保证安全性的镜像

2、查看安装软件版本

docker version: 1.13.1

www.9778.com 1

所以本文第一个要讲的就是dockerfile
dockerfile可以通俗的理解为是docker的脚本,通过这个脚本你可以将原本一个单纯的系统镜像加入许多自己需要的软件。
dockerfile文件是一个由一系列构建指令组成的文本文件,docker
build命令会根据这些构建指令完成docker镜像的构建。

    #   docker -v  /  docker –version

    #   docker-compose -v

 

然后记得:wq保存和退出vi。

说明:构建会在Docker后台守护进程(daemon)中执行,而不是CLI中。构建前,构建进程会将全部内容(递归)发送到守护进程。大多情况下,应该将一个空目录作为构建上下文环境,并将Dockerfile文件放在该目录下。

3、在代码根目录新建docker安装环境所属目录:/data1/project/docker

二、材料准备

 

在构建上下文中使用的Dockerfile文件,是一个构建指令文件。为了提高构建性能,可以通过.dockerignore文件排除上下文目录下,不需要的文件和目录。

4、在 /data1/project/docker 新建 init.sh 脚本

  1. dockerfile 文件,如下

step 2: 构建dockerfile镜像文件

命令为:

5、#   chmod a+x init.sh

/opt/command/kevin_docker_www.9778.com,files/01_nginx/Dockerfile/kevin_nginx_dockerfile.dockerignore

备注:最后加1个空格,1个英文句号,OK

docker build -f Dockerfile_PATH .
也可以加入-t参数指定构建后的镜像名称、标签

如:docker build -t nginx:old -f Dockerfile_PATH .

6、添加以下命令加入到  /data1/project/docker/init.sh
文件中保存(#####中的所有内容)

# Instruction
FROM centos

# LABLE info
LABEL vendor="itshare" 
      version="0.0.1-beta" 
      release-date="2018-09-02"

# Dockerfile execute command
RUN mkdir -p /opt/apt/
RUN touch /opt/apt/sources.list
RUN echo "kevin.tian installed nginx" >> /opt/apt/sources.list
# RUN yum update && yum install -y nginx
RUN apt-get update && apt-get install -y nginx
RUN echo "ndaemon off;" >> /etc/nginx/nginx.conf

# Container startup command
CMD /usr/sbin/nginx

root >>> docker build -t kevin_nginx/v1:latest -f
/opt/command/kevin_docker_files/kevin_nginx_dockerfile.dockerignore
.

构建过程实质上是将你所写的dockerfile一步一步的独立进行执行,并且在每一步提交后会生成一个新的镜像,直至完成最后一步以后,会输出一个最终镜像的ID。

##########################################################################

 

然后回车,执行build如下图,只需要等待build所有过程完成即可。

那么如何写dockerfile呢?
首先需要了解一下dockerfile的基本命令

mkdir app

三、实验步骤

www.9778.com 2

From

Usage: FROM [image name]
DockerFile第一条必须为From指令,指定引用的镜像。如果同一个DockerFile创建多个镜像时,可使用多个From指令(每个镜像一次)

mkdir app/memcached

  1. 执行命令,顺序如下

 

MAINTAINER

Usage: MAINTAINER [name]
这个命令用于声明作者,并应该放在FROM的后面

mkdir app/mysql

# 查看本地的Docker镜像

最后,查看自己创建的镜像,使用如下命令(可以加参数过滤其他镜像)

RUN

Usage: RUN [command]
接受命令作为参数并用于创建镜像。不像CMD命令,RUN命令用于创建镜像(在之前commit的层之上形成新的层)。

mkdir app/nginx

root >> docker images

root >>> docker images

CMD

Usage 1: CMD application “argument”, “argument”, ..
和RUN命令相似,CMD可以用于执行特定的命令。和RUN不同的是,这些命令不是在镜像构建的过程中执行的,而是在用镜像构建容器后被调用。

mkdir app/nginx/conf

# 执行docker build命令,创建镜像,

 

EXPOSE

Usage: EXPOSE [port]
EXPOSE用来指定端口,使容器内的应用可以通过端口和外界交互。

mkdir app/php

# 注意:build命令结尾有个结束符号
英文句号“.”,不要忘记,否则执行会提示错误少个参数。

附上代码,如下地址(下载后,请记得修改文件后缀.sh为.dockerignore)

ENV

Usage: ENV key value
ENV命令用于设置环境变量。这些变量以”key=value”的形式存在,并可以在容器内被脚本或者程序调用。这个机制给在容器中运行应用带来了极大的便利。

mkdir app/redis

root >> docker build -f
“/opt/command/kevin_docker_files/01_nginx/Dockerfile/kevin_nginx_dockerfile.dockerignore”
-t “nginx/kevin.tian”
.

ADD

Usage: ADD [source directory or URL] [destination directory]
这个命令的基本作用是从源系统的文件系统上复制文件到目标容器的文件系统。如果源是一个URL,那该URL的内容将被下载并复制到容器中。

mkdir app/mongo

 

 

ENTRYPOINT

Usage: ENTRYPOINT application “argument”, “argument”, ..
配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
ENTRYPOINT
帮助你配置一个容器使之可执行化,如果你结合CMD命令和ENTRYPOINT命令,你可以从CMD命令中移除“application”而仅仅保留参数,参数将传递给ENTRYPOINT命令。
每个 Dockerfile 中只能有一个
ENTRYPOINT,当指定多个时,只有最后一个起效。

mkdir db

四、实验结果

如果对您有帮助,请帮我点赞,各位的支持也是我写作的动力,谢谢

COPY

Usage: COPY [source directory or URL] [destination directory]
复制本地主机的 (为Dockerfile所在目录的相对路径)到容器中的 。

mkdir logs

www.9778.com 3

VOLUME

Usage: VOLUME [“/dir_1”, “/dir_2” ..]
VOLUME命令用于让你的容器访问宿主机上的目录

mkdir tools

 

USER

Usage: USER [UID]
USER命令用于设置运行容器的UID。

mkdir tools/phpmyadmin

WORKDIR

Usage: WORKDIR /path
WORKDIR命令用于设置CMD指明的命令的运行目录

mkdir tools/console

ONBUILD

Usage: ONBUILD [INSTRUCTION]
配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令

这里做一个构建自己的nginx镜像的dockerfile演示

[root@localhost ~]# mkdir dockerfile
[root@localhost ~]# cd dockerfile/
[root@localhost dockerfile]# vim Dockerfile
FROM centos
MAINTAINER by hyhy
RUN yum install -y  epel-release
RUN yum install -y  nginx
EXPOSE 80
ENTRYPOINT systemctl start nginx && tailf /usr/local/nginx/logs/error.log
[root@localhost dockerfile]# docker build -t nginx_my:centos .
Step 1/6 : FROM centos
 ---> 2d194b392dd1
Step 2/6 : MAINTAINER by hyhy
 ---> Running in cbd47b6555e2
Removing intermediate container cbd47b6555e2
 ---> 625ef0f2b8f7
Step 3/6 : RUN yum install -y  epel-release
 ---> Running in 01e6f401252e
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: mirrors.cn99.com
 * extras: mirrors.tuna.tsinghua.edu.cn
 * updates: mirrors.tuna.tsinghua.edu.cn
Resolving Dependencies
--> Running transaction check
---> Package epel-release.noarch 0:7-9 will be installed
--> Finished Dependency Resolution
...
Dependencies Resolved
...
Installed:
  epel-release.noarch 0:7-9                                                     

Complete!
Removing intermediate container 01e6f401252e
 ---> 2a8bf13b1f05
Step 4/6 : RUN yum install -y  nginx
 ---> Running in 3b0eb58cf811
Loaded plugins: fastestmirror, ovl
https://linuxmirrors.ir/pub/epel/7/x86_64/repodata/2331fa699fd272785aad9dd629482586ceb0706e4fdd2447276e791c6921e172-updateinfo.xml.bz2: [Errno 14] HTTPS Error 404 - Not Found
Trying other mirror.
To address this issue please refer to the below wiki article 

https://wiki.centos.org/yum-errors

If above article doesn't help to resolve this issue please use https://bugs.centos.org/.

Loading mirror speeds from cached hostfile
 * base: mirrors.cn99.com
 * epel: mirrors.tuna.tsinghua.edu.cn
 * extras: mirrors.tuna.tsinghua.edu.cn
 * updates: mirrors.tuna.tsinghua.edu.cn
...
Installed:
  nginx.x86_64 1:1.12.2-1.el7                                                   
...
Complete!
Removing intermediate container 3b0eb58cf811
 ---> 9f2c5eee3470
Step 5/6 : EXPOSE 80
 ---> Running in 35a4d9a23074
Removing intermediate container 35a4d9a23074
 ---> 43335a444c08
Step 6/6 : ENTRYPOINT systemctl start nginx && tailf /usr/local/nginx/logs/error.log
 ---> Running in 3b31ab41740e
Removing intermediate container 3b31ab41740e
 ---> 43e745e08973
Successfully built 43e745e08973
Successfully tagged nginx_my:centos

制作完成,简单看一下,404M,官方的镜像只有109M,如果是源码安装的话应该会小很多,另外就是官方的Nginx镜像中少了很多命令,包括netstat和ps之类的都是没有的,可以说是十分精炼。

[root@localhost dockerfile]# docker images
REPOSITORY                             TAG                 IMAGE ID            CREATED             SIZE
nginx_my                               centos              43e745e08973        2 minutes ago       404MB
centos                                 latest              2d194b392dd1        3 days ago          195MB
busybox                                latest              f6e427c148a7        8 days ago          1.15MB
mysql                                  latest              5d4d51c57ea8        10 days ago         374MB
registry.docker-cn.com/library/nginx   latest              e548f1a579cf        2 weeks ago         109MB
hello-world                            latest              f2a91732366c        3 months ago        1.85kB

启动一下,看看能不能用

[root@localhost dockerfile]# docker run -i -t -p 80:80 43e745e08973 /bin/bash
Failed to get D-Bus connection: Operation not permitted

非常荣幸,我们遇到问题了,这个问题是centos镜像存在的问题,这个的原因是因为dbus-daemon没能启动。其实systemctl并不是不可以使用。将你的CMD或者entrypoint设置为/usr/sbin/init即可。会自动将dbus等服务启动起来。
然而我们这里完全可以不用systemctl,我们可以用/usr/sbin/nginx
那么我们修改一下我们的dockerfile

[root@localhost dockerfile]# vim Dockerfile
FROM centos
MAINTAINER by hyhy
RUN yum install -y  epel-release && yum clean all
RUN yum install -y  nginx && yum clean all
EXPOSE 80
CMD ["/usr/sbin/init"] 
[root@localhost dockerfile]# docker images
REPOSITORY                             TAG                 IMAGE ID            CREATED             SIZE
mynginx                                centos              a4e95eb48cbd        23 minutes ago      404MB
centos                                 latest              2d194b392dd1        3 days ago          195MB
busybox                                latest              f6e427c148a7        8 days ago          1.15MB
mysql                                  latest              5d4d51c57ea8        10 days ago         374MB
registry.docker-cn.com/library/nginx   latest              e548f1a579cf        2 weeks ago         109MB
hello-world                            latest              f2a91732366c        3 months ago        1.85kB
[root@localhost dockerfile]# docker run -i -t -d -p 80:80 a4e95eb48cbd /bin/bash
ec138dcf120f17072573750d7b8365c82c31adb05180db33705e537711a53bcb
[root@localhost dockerfile]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                NAMES
ec138dcf120f        a4e95eb48cbd        "/bin/bash"         About a minute ago   Up About a minute   0.0.0.0:80->80/tcp   confident_kirch
cf2c588a7b30        centos              "/bin/bash"         2 hours ago          Up 2 hours                               nifty_yonath
[root@localhost dockerfile]# docker run -i -t -d -p 8080:80 a4e95eb48cbd /bin/bash -c "systemctl start nginx"
0cfcba85f49ae81ca8125d8c5d46db0d328e92a640148ab9f6f987dfc335f8a6

由于这次修改的dockerfile,没有加入启动Nginx,这里重新制作一个镜像

[root@localhost dockerfile]# vim Dockerfile
FROM centos
MAINTAINER by hyhy
RUN yum -y install epel-release && yum clean all
RUN yum -y install nginx && yum clean all
EXPOSE 80
CMD ["/usr/sbin/nginx”,“ -g”, “daemon off”]
[root@localhost dockerfile]# docker build -t nginx:2 .
[root@localhost dockerfile]# docker images
REPOSITORY                             TAG                 IMAGE ID            CREATED              SIZE
nginx                                  1                   f31a08eb3bee        About a minute ago   286MB
centos                                 latest              2d194b392dd1        6 days ago           195MB
busybox                                latest              f6e427c148a7        11 days ago          1.15MB
mysql                                  latest              5d4d51c57ea8        13 days ago          374MB
registry.docker-cn.com/library/nginx   latest              e548f1a579cf        2 weeks ago          109MB
hello-world                            latest              f2a91732366c        3 months ago         1.85kB
[root@localhost dockerfile]# docker run -itd -p 8080:80 nginx:1 /bin/bash 
f61fe8c1b847e7b8ff30dbff34be1ddbb5337ff1a6d13dcaf302c0aac9797946
[root@localhost dockerfile]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
f61fe8c1b847        nginx:1             "/bin/bash"         3 seconds ago       Up 2 seconds        0.0.0.0:8080->80/tcp   epic_ride
cf2c588a7b30        centos              "/bin/bash"         3 days ago          Up 3 days                                  nifty_yonath

如果到这一步你和我同步的话,你可以尝试curl
127.0.0.1:8080,应该是可以看到nginx的页面的。
这里算是成功的完成了既定的目标,但是这里也是有点小问题,就是CMD和ENTRYPOINT,这里还是有点傻傻分不清楚怎么用
标记一下这点以后继续研究一下。

mkdir web

touch app/memcached/Dockerfile

touch app/mysql/Dockerfile

touch app/nginx/Dockerfile

touch app/php/Dockerfile

touch app/redis/Dockerfile

touch app/mongo/Dockerfile

touch tools/phpmyadmin/Dockerfile

touch tools/console/Dockerfile

touch app/nginx/conf/default.conf

touch app/php/opcache-recommended.ini

touch app/php/php.ini

touch app/php/proxychains.conf

touch app/php/proxychains-ng

touch docker-compose.yaml

curl -L -o
./app/php/redis.tar.gzhttps://github.com/phpredis/phpredis/archive/3.0.0.tar.gz

curl -L -o ./app/php/memcached.tar.gz
“https://codeload.github.com/php-memcached-dev/php-memcached/tar.gz/v3.0.2”

curl -L -o
./app/php/mongodb.tgzhttps://github.com/mongodb/mongo-php-driver/releases/download/1.3.2/mongodb-1.3.2.tgz

cat /dev/null > docker-compose.yaml

cat >> docker-compose.yaml <

version: “2”

services:

  mysql:

    build:

      context: ./app/mysql

      dockerfile: Dockerfile

    environment:

      MYSQL_ROOT_PASSWORD: “root”

      MYSQL_DATABASE: “app”

      MYSQL_USER: “app”

      MYSQL_PASSWORD: “111111”

    volumes:

      – ./db:/var/lib/mysql

  php:

    build:

      context: ./app/php

      dockerfile: Dockerfile

    volumes:

      – ./web:/opt/web

  nginx:

    build:

      context: ./app/nginx

      dockerfile: Dockerfile

    ports:

      – 8080:80

    depends_on:

      – php #此处代表nginx依赖php,php会在nginx之前启动

    volumes_from:

      – php

    volumes:

      – ./app/nginx/conf:/etc/nginx/conf.d

  redis:

    build:

      context: ./app/redis

      dockerfile: Dockerfile

#    ports:

#      – 6379:6379

  memcached:

    build:

      context: ./app/memcached

      dockerfile: Dockerfile

#    ports:

#      – 11211:11211

  mongo:

    build:

      context: ./app/mongo

      dockerfile: Dockerfile

#    ports:

#      – 27017:27017

  phpmyadmin:

    build:

      context: ./tools/phpmyadmin

      dockerfile: Dockerfile

    ports:

      – “8081:80”

    environment:

      PMA_HOST: “mysql”

      PMA_USER: “root”

      PMA_PASSWORD: “root”

  console:

      build:

        context: ./tools/console

        dockerfile: Dockerfile

      volumes_from:

        – php

      tty: true

#networks:

volumes:

  db:

    driver: local

EOF

cat /dev/null > ./app/php/Dockerfile

cat >> ./app/php/Dockerfile <

FROM php:7.1.11-fpm

# 以下几行为安装代理工具,如不需要,可将其屏蔽

# COPY proxychains-ng /opt/proxychains-ng

# COPY proxychains.conf /etc/proxychains.conf

# WORKDIR /opt/proxychains-ng

# RUN ./configure && make && make install

# 替换为阿里云源

RUN echo
“debhttp://mirrors.aliyun.com/debian/jessie
main non-free contribn\

debhttp://mirrors.aliyun.com/debian/jessie-proposed-updates
main non-free contribn\

deb-srchttp://mirrors.aliyun.com/debian/jessie
main non-free contribn\

deb-srchttp://mirrors.aliyun.com/debian/jessie-proposed-updates
main non-free contrib” > /etc/apt/sources.list

# 安装php扩展

WORKDIR /tmp

ENV PHPREDIS_VERSION 3.0.0

COPY ./redis.tar.gz /tmp/redis.tar.gz

COPY ./memcached.tar.gz /tmp/memcached.tar.gz

COPY ./mongodb.tgz /tmp/mongodb.tgz

COPY ./yar.tgz /tmp/yar.tgz

RUN tar xfz /tmp/redis.tar.gz

  && rm -r /tmp/redis.tar.gz

  && tar xf /usr/src/php.tar.xz

  && mv php-7.1.11 /usr/src/php

  && mv phpredis-$PHPREDIS_VERSION /usr/src/php/ext/redis

  && mkdir -p /usr/src/php/ext/memcached

  && tar -C /usr/src/php/ext/memcached -zxf /tmp/memcached.tar.gz
–strip 1

  && rm /tmp/memcached.tar.gz

  && mkdir -p /usr/src/php/ext/mongodb

  && tar -C /usr/src/php/ext/mongodb -zxf /tmp/mongodb.tgz –strip 1

  && rm -r /tmp/mongodb.tgz

  && mkdir -p /usr/src/php/ext/yar

  && tar -C /usr/src/php/ext/yar -zxf /tmp/yar.tgz –strip 1

  && rm -r /tmp/yar.tgz

# 安装php

RUN apt-get clean

  && apt-get update

  && apt-get -y remove libssl1.0.0

  && apt-get install -y libpng12-dev libjpeg-dev libmemcached-dev
libssl-dev libcurl4-openssl-dev

  && rm -rf /var/lib/apt/lists/*

  && docker-php-ext-configure gd –with-png-dir=/usr
–with-jpeg-dir=/usr

  && docker-php-ext-install gd mysqli pdo_mysql zip opcache redis

  && docker-php-ext-configure memcached

  && docker-php-ext-install memcached

  && docker-php-ext-configure mongodb

  && docker-php-ext-install mongodb

  && docker-php-ext-configure yar

  && docker-php-ext-install yar

  && docker-php-ext-configure bcmath

  && docker-php-ext-install bcmath

# 生成配置文件

COPY ./php.ini /usr/local/etc/php/conf.d/

COPY ./opcache-recommended.ini /usr/local/etc/php/conf.d/

EOF

echo “FROM nginx:1.12.1” > ./app/nginx/Dockerfile

echo “FROM mysql:5.7” > ./app/mysql/Dockerfile

echo “FROM memcached:1.5” > ./app/memcached/Dockerfile

echo “FROM redis:4.0.0” > ./app/redis/Dockerfile

echo “FROM mongo:3.5.13” > ./app/mongo/Dockerfile

echo “FROM phpmyadmin/phpmyadmin:4.7” > ./tools/phpmyadmin/Dockerfile

cat >> ./tools/console/Dockerfile <

FROM php:7.1.11

WORKDIR /mnt/app

# 替换为阿里云源

RUN echo
“debhttp://mirrors.aliyun.com/debian/jessie
main non-free contribn\

debhttp://mirrors.aliyun.com/debian/jessie-proposed-updates
main non-free contribn\

deb-srchttp://mirrors.aliyun.com/debian/jessie
main non-free contribn\

deb-srchttp://mirrors.aliyun.com/debian/jessie-proposed-updates
main non-free contrib” > /etc/apt/sources.list

# 常用工具

RUN apt-get update && apt-get install -y git curl wget cron vim locales
libfreetype6-dev mariadb-client \

  && rm -rf /var/lib/apt/lists/* \

  && docker-php-ext-install zip \

  && docker-php-ext-install mysqli pdo_mysql

# 把语言设置成简体中文

RUN dpkg-reconfigure locales && \

  locale-gen C.UTF-8 && \

  /usr/sbin/update-locale LANG=C.UTF-8

RUN echo ‘zh_CN.UTF-8 UTF-8’ >> /etc/locale.gen && \

  locale-gen

ENV LC_ALL C.UTF-8

ENV LANG zh_CN.UTF-8

ENV LANGUAGE zh_CN.UTF-8

RUN php -r
“copy(‘https://install.phpcomposer.com/installer’,
‘composer-setup.php’);” \

  && php composer-setup.php \

  && php -r “unlink(‘composer-setup.php’);” \

  && mv ./composer.phar /usr/local/bin/composer \

  && chmod +x /usr/local/bin/composer

RUN echo ‘export PATH=”$PATH:$HOME/.composer/vendor/bin”‘ >>
~/.bashrc \

  && . ~/.bashrc \

  && composer config -g repo.packagist
composerhttps://packagist.phpcomposer.com

EOF

echo “opcache.memory_consumption=128

opcache.interned_strings_buffer=8

opcache.max_accelerated_files=4000

opcache.revalidate_freq=1

opcache.fast_shutdown=1

opcache.enable_cli=1

opcache.enable=0″ > ./app/php/opcache-recommended.ini

echo “memory_limit = 256M

post_max_size = 100M

upload_max_filesize = 100M” > ./app/php/php.ini

cat >> ./app/nginx/conf/default.conf <

server {

  listen        80;

  server_name   localhost;

  root          /opt/web;

  index         index.php index.html index.htm;

  location / {

     try_files $uri $uri/ /index.php?$query_string;

   }

  location ~ .php$ {

     fastcgi_pass   php:9000;

     fastcgi_index  index.php;

     fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

     include        fastcgi_params;

  }

}

EOF

##########################################################################

7、当前 /data1/project/docker 目录下运行init.sh脚本

    #  ./init.sh

8、若下载超时 或 失败 ,多次执行  #  ./init.sh 命令即可

9、执行docker-compose up -d 来启动环境、并安装

10、确保Mac/Linux环境端口8080未被占用,执行期间若error报错端口已占用,则更改Mac/Linux环境端口,不被占用即可

11、Mac/Linux环境端口改完重启当前系统,执行

#    docker-compose down

12、再次执行编译安装

#    docker-compose up -d

13、查看已存在镜像

#    docker images

14、查看服务是否已启动

#    docker ps -a

此时可以查看到已经安装:nginx、mongo、php、mysql、redis、phpmyadmin、memcached

15、如果后续增加PHP扩展,vi
/data1/project/docker/app/php/Dockerfile 增加扩展,然后关闭,再启动并且编译

#    docker-compose down

#    docker-compose up -d –build

16、若要远程连接mysql、memcache、redis ……..    则编辑  vi
/data1/project/docker/docker-compose.yaml

(截图范围有限,若要远程连接,都增加端口开放即可)

www.9778.com 4

17、关闭容器,在重启容器,查看当前所有容器的端口均已开启

#    docker-compose down

#    docker-compose up -d

#    docker ps  -a

www.9778.com 5

18、测试mysql连接虚拟机Docker中的MySQL

打开Navicat(此处的3307端口是 /data1/project/docker/docker-compose.yaml
中MySQL增加)

IP:10.0.1.145

port:3307

username:root

password:root

www.9778.com 6

二、在Docker内配置Nginx开发环境设置(此处配置laravel框架路由)

注意:默认安装的容器访问根目录为:/opt/web/

1、Nginx配置文件默认为:/data1/project/docker/app/nginx/conf/default.conf

server {

  listen        80;

  server_name   docker.laravel.com;

  root          /opt/web/laravel/public;

  index         index.php index.html index.htm;

  location / {

     try_files $uri $uri/ /index.php?$query_string;

  }

  location ~ .php$ {

     fastcgi_pass   php:9000;

     fastcgi_index  index.php;

     fastcgi_param  SCRIPT_FILENAME 
$document_root$fastcgi_script_name;

     include        fastcgi_params;

  }

}

2、重启docker Nginx 环境

#    docker restart docker_nginx_1

17、本地主机配置host域名:127.0.0.1  docker.laravel.com 
,所有配置文件访问均已映射到宿主机:8080端口去访问docker:80端口,本地浏览器访问

eg:docker.laravel.com:8080

18、本地docker目录:/data1/project/docker/web 与任意容器目录:/opt/web/形成互相映射,在本地目录或者容器目录操作项目文件即可

19、进入docker_php_1容器

#    docker exec -it docker_php_1 /bin/bash

#    docker exec -it docker_php_1 bash