一、准备内容使用Docker搭建环境的好处:操作简单、搭建快捷、环境隔离Docker常用操作命令及参数:dockersearch#FindimagedockerfromDockerHubimages#查看本地镜像列表dockerpull#从镜像仓库中拉取或更新指定镜像dockerrun#创建一个新容器并运行命令dockerrm#删除一个容器dockerrmi#删除一个镜像dockerinspect#获取容器/镜像元数据dockerps#查看启动的容器,加参数-a查看所有容器dockerbuild#使用Dockerfile创建镜像常用Dockerfile指令:FROM#格式为FROMimage或FROMimage:tag,第一条指令在Dockerfile中必须是FROM命令,在同一个Dockerfile中创建多个镜像时,可以使用多个FROM命令RUN#格式为RUN命令或者RUN["EXECUTABLE","PARAM1","PARAM2".......],前者在shell终端运行命令,/bin/sh-c命令,例如:/bin/sh-c"echohello";后者使用exec执行,指定其他运行终端使用RUN["/bin/bash","-c","echohello"]CMD#用于指定容器启动时执行的命令MAINTAINER#指定维护者信息ENV#用来指定环境变量,以后RUN命令可以使用EXPOSE#暴露端口,供Container外部链接使用2.开始搭建顺序:mysql-->phpfpm-->nginx必须先搭建phpfpm,然后构建docker_nginx来构建docker_mysql首先使用dockersearchmysql列出仓库中的mysql镜像使用dockerpull命令将STARTS最多的镜像下载到本地(下载时间有点长。。。)dockerpullmysql下载完成后,使用dockerimages查看镜像是否已经下载进入本地dockerimages,可以看到如下内容使用dockerrun命令启动一个docker_mysql容器dockerrun-di--namemydockermysql-p3308:3306-eMYSQL_ROOT_PASSWORD=123456mysqldockerrun##启动容器的命令-i##交互操作-d##守护进程--name##指定容器名称为mydockermysql-p##将容器的3306端口映射到主机的3308端口-e##指定环境变量,可以在容器中使用,并设置root密码最后mysql是指定使用镜像,使用dockerps命令查看容器是否启动。如果能看到刚才建好的mysql,说明容器创建成功。如果没有看到,可以使用dockerlogmydockermysql命令查看有什么错误,修改命令重启即可,但是需要删除刚才的容器。命令是dockerrmmydockermysql。尝试使用navicat工具连接数据库,发现失败。检查并进入mysql容器dockerexec-itmydockermysql/bin/bash启动mysqlmysql-uroot-p123456查看mysql版本状态授权远程链接GRANTALL*.*TO`'root'@'%'`;刷新权限刷新权限;更改加密规则ALTERUSER'root'@'localhost'IDENTIFIEDBY'password'PASSWORDEXPIRENEVER;修改root密码ALTERUSER'root'@'%'IDENTIFIEDWITHmysql_native_passwordBY'123456';刷新权限刷新权限ges;这时候用Navicat发现可以连接mydockermysql了。在容器中,先退出mysql,再退出容器。这时候docker_mysql容器就搭建完成了。mysql版本为8.0。如果需要构建5.x版本,只需要dockerpullmysql:5.x,使用这个镜像启动容器,只需要在容器内部授权远程连接,无需修改加密即可使用规则搭建docker_phpfpm搭建docker_phpfpm有点繁琐,因为php有不同的版本,不同的扩展和依赖,所以可以使用dockerfile搭建docker_phpfpm,灵活配置需要的扩展新建一个Dockerfile,内容如下FROMphp:7.1-fpmMAINTAINERyourname#定义扩展版本号#redis扩展ENVPHPREDIS_VERSION4.0.0#swoole扩展ENVSWOOLE_VERSION4.0.3#settimeRUN/bin/cp/usr/share/zoneinfo/Asia/Shanghai/etc/localtime\&&echo'Asia/上海'>/etc/timezone#替换deb源RUNmv/etc/apt/sources.list/etc/apt/sources.list.bak&&\echo"debhttp://mirrors.aliyun.com/debianstablemaincontribnon-free">/etc/apt/sources.list&&\echo"debhttp://mirrors.aliyun.com/debianstable-updatesmaincontribnon-free">>/etc/apt/sources.list&&\echo"deb-srchttp://mirrors.aliyun.com/debianstablemaincontribnon-free">>/etc/apt/sources.list&&\echo"deb-srchttp://mirrors.aliyun.com/德比anstable-updatesmaincontribnon-free">>/etc/apt/sources.list#一些既不在PHP源码包也不在PECL扩展仓库的扩展,使用apt直接安装扩展RUNapt-getupdate\&&apt-getinstall-y\curl\wget\git\zip\libz-dev\libssl-dev\libnghttp2-dev\libpcre3-dev\libmemcached-dev\zlib1g-dev\libfreetype6-dev\libjpeg62-turbo-dev\libmcrypt-dev\libpng-dev\&&apt-getclean\&&apt-getautoremove#安装ComposerRUNcurl-sShttps://getcomposer.org/installer|php\&&mvcomposer.phar/usr/local/bin/composer\&&composerself-update--clean-backups#PHP源文件目录自带扩展名docker-php-ext-install直接安装#mysqli扩展名RUNdocker-php-ext-installmysqli#PDO扩展RUNdocker-php-ext-installpdo_mysql#BcmathRUNdocker-php-ext-installbcmath#gd扩展RUNdocker-php-ext-install-j$(nproc)iconvmcryptRUNdocker-php-ext-configuregd--with-freetype-dir=/usr/include/--with-jpeg-dir=/usr/include/RUNdocker-php-ext-install-j$(nproc)gd#有些不是包含在PHP源文件中,但包含在PHP扩展中库存储库中存在的扩展使用peclinstall安装扩展,然后使用docker-php-ext-enable命令启用扩展RUNwgethttp://pecl.php.net/get/redis-${PHPREDIS_VERSION}.tgz-O/tmp/redis.tgz\&&peclinstall/tmp/redis.tgz\&&rm-rf/tmp/redis.tgz\&&docker-php-ext-enableredis#msgpackextensiondownloadpecllocalinstallationenableextension(使用延迟队列减少源数据足迹)RUNwgethttp://pecl.php.net/get/msgpack-${MSGPACK_VERSION}.tgz-O/tmp/msgpack.tgz\&&peclinstall/tmp/msgpack.tgz\&&rm-rf/tmp/msgpack.tgz\&&docker-php-ext-enablemsgpack#Hiredis依赖安装RUNwgethttps://github.com/redis/hiredis/archive/v${HIREDIS_VERSION}.tar.gz-O/tmp/hiredis.tar.gz\&&mkdir-p/tmp/hiredis\&&tar-xf/tmp/hiredis.tar.gz-C/tmp/hiredis--strip-components=1\&&rm/tmp/hiredis.tar.gz\&&(\cd/tmp/hiredis\&&make-j$(nproc)\&&makeinstall\&&ldconfig\)\&&rm-r/tmp/hiredis#Swoole扩展安装打开扩展RUNwgethttps://github.com/swoole/swoole-src/archive/v${SWOOLE_VERSION}.tar.gz-O/tmp/swoole.tar.gz\&&mkdir-p/tmp/swoole\&&tar-xf/tmp/swoole.tar.gz-C/tmp/swoole--strip-components=1\&&rm/tmp/swoole.tar.gz\&&(\cd/tmp/swoole\&&phpize\&&./configure--enable-async-redis--enable-mysqlnd--enable-openssl--enable-http2\&&make-j$(nproc)\&&makeinstall\)\&&rm-r/tmp/swoole\&&docker-php-ext-enableswoole创建好Dockerfile文件后,在文件所在目录执行如下命令构建镜像sudodockerbuild-tfpm-php-7.1:v1.0.0.注意:命令的最后。使用dockerimages代表当前目录检查镜像是否创建成功使用dockerrun命令启动一个docker_phpfpm容器dockerrun--namedocker_phpfpm71\--restart=always\-p9000:9000\-v~/sites:/data/home\-v~/Sites/docker_phpfpm71/logs:/data/logs\--privileged\-dfpm-php-7.1:v1.0.0-v##将容器中的目录挂载到本地目录--特权d##让容器中的root拥有真正的root权限,否则容器中的root只是一个外部普通用户权限--restart##设置容器重启策略,当容器退出时,Dockerdaemon是否重启容器刚刚退出使用dockerps命令查看容器是否运行dockerpsdocker_phpfpm成功构建docker_nginx启动docker_nginx时,需要使用--link参数将nginx容器与刚刚启动的phpfpm容器相关联,需要做一些目录挂载操作先在本地创建几个存放nginx配置的目录mkdir-p~/Sites/docker_nginx/{conf,conf.d,html,logs}在~/Sites/docker_nginx/conf/目录下创建一个nginx.conf文件,内容如下usernginx;worker_processesauto;error_log/var/log/nginx/error.log;pid/run/nginx.pid;include/usr/share/nginx/modules/*.conf;events{worker_connections1024;}http{log_formatmain'$remote_addr-$remote_user[$time_local]"$request"''$status$body_bytes_sent"$http_referer"'"$http_user_agent""$http_x_forwarded_for"';access_log/var/log/nginx/access.logmain;发送文件;tcp_nopush上;tcp_nodelayon;keepalive_timeout65;types_hash_max_size2048;包括/etc/nginx/mime.types;default_type应用程序/八位字节流;包括/etc/nginx/conf.d/*.conf;r{听80默认服务器;听[::]:80默认服务器;服务器名称本地主机;根/usr/share/nginx/html;#加载默认服务器块的配置文件。包括/etc/nginx/default.d/*.conf;error_page404/404.html;location=/40x.html{}error_page500502503504/50x.html;location=/50x.html{}location~^/assets/.*\.php${全部拒绝;}location~\.php${包括fastcgi_params;fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;fastcgi_passdocker_phpfpm71:9000;#fastcgi_passunix:/var/run/php5-fpm.sock;try_files$uri=404;}位置~*/\.{全部拒绝;}}}使用dockerrun命令启动一个nginx容器dockerrun--namedocker_nginx-d-p80:80-v~/Sites/docker_nginx/conf/nginx.conf:/etc/nginx/nginx.conf-v~/Sites/docker_nginx/logs:/var/log/nginx-v~/Sites:/usr/share/nginx/html-v~/Sites/docker_nginx/conf.d:/etc/nginx/conf.d--linkdocker_phpfpm71:phpfpm--volumes-fromdocker_phpfpm71nginx--link##链接2个容器,使源容器(正在链接的容器)和接收容器(主动去链接的容器)可以相互通信,和receive容器可以获取源容器的一些数据,比如源容器的环境变量--volumes-from##授权一个容器访问另一个容器的Volume使用dockerps命令查看容器是否启动并在浏览器中访问localhost
