博主多年一直使用vm虚拟机开发(一套环境走天下),近日听闻docker这门技术,发现好处不少
centos7下安装
目前,CentOS 仅发行版本中的内核支持 Docker。
Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
Docker 运行在 CentOS-6.5 或更高的版本的 CentOS,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本
//命令查看你当前的内核版本
uname -r
//yum安装
yum -y install docker
//启动docker服务
systemctl start docker
//查看docker版本
docker -v
由于本地没有hello-world这个镜像,所以会下载一个hello-world的镜像,并在容器内运行。
docker run hello-world
看到输出说明docker安装成功
由于众所周知的原因,docker国外源速度不快,所以这边我们使用ali的源,当然你可以选择其它的源。
ali的源需要先去https://cr.console.aliyun.com/注册,会得到一个加速的个人连接,注册相关请自行百度。
vim /etc/docker/daemon.json:
{
"registry-mirrors": ["https://yt3uvnue.mirror.aliyuncs.com"]
}
//重启使配置生效
systemctl restart docker
几个概念
博主出于研究学习,并没有采用别人配好的镜像文件,而是pull了最简单的版本,自己配置相关环境,制作一个全新的个人镜像。
//查看有哪些nginx的镜像可以使用
docker search nginx
//检出nginx官方镜像
docker pull nginx
//建立对应的目录
mkdir docker
cd docker
mkdir -p $PWD/nginx/www $PWD/nginx/logs $PWD/nginx/conf $PWD/nginx/conf/conf.d
cd ~
//下面运行最简单的nginx镜像
docker run -p 8000:80 --name mynginx -d nginx
//查看容器是否启动
docker ps
//进入容器找到nginx.conf目录及html目录
docker exec -it mynginx /bin/bash
//退出容器
exit
//切换目录
cd nginx
//拷贝nginx.conf
docker cp mynginx:/etc/nginx/nginx.conf ./conf/nginx.conf
docker cp mynginx:/etc/nginx/conf.d/default.conf ./conf/conf.d/default.conf
//停止容器服务
docker stop mynginx
//删除容器
docker rm 容器ID (docker ps -a 查询)
//生成新容器并映射相关的目录和文件
docker run -p 80:80 --name mynginx -v $PWD/www:/usr/share/nginx/html -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf -v $PWD/conf/conf.d/default.conf:/etc/nginx/conf.d/default.conf -v $PWD/logs:/var/log/nginx -d nginx
//搜索php镜像
docker search php
//下载php56官方镜像
docker pull php:5.6-fpm
//准备好相关的目录
cd docker
mkdir -p $PWD/php-fpm/logs $PWD/php-fpm/conf
//运行php容器
//注意在/usr/local/etc/php目录下放好一份php.ini文件,官网php镜像没有php.ini
docker run -p 9000:9000 --name myphp -v $PWD/nginx/www:/var/www/html -v $PWD/php-fpm/conf:/usr/local/etc/php -v $PWD/php-fpm/logs:/phplogs -d php:5.6-fpm
//查看php容器IP
docker inspect 容器ID或容器名 |grep '"IPAddress"'
//编辑nginx配置
vi /nginx/conf/conf.d/default.conf:
//重启nginx容器
docker restart mynginx
官方docker镜像安装扩展已有工具
//进入php容器
docker exec -it myphp /bin/bash
//切换安装工具目录
cd /usr/local/bin
//安装mysql扩展
./docker-php-ext-install pdo_mysql
//安装yaf扩展
./docker-php-ext-install yaf
//也可以自己下载好yaf包,拷贝进容器内,执行编译安装
//查看是否安装成功
php -m
容器打包成镜像:
先注册https://hub.docker.com (需要科学上网),自行百度
//打包,注意最后XXX必须为你的用户名
docker commit 容器ID XXX/nginx
//修改tag
//docker 容器ID XXX/nginx:latest (latest为版本,自行设置)
//登录dockerhub
docker login
docker push XXX/nginx
博主使用dockerhub库的过程中,有天突然发现pull操作正常,push却报错“net/http: TLS handshake timeout”,谷歌之,都在讲墙的原因,需要加上加速服务,博主换了163,ali等等一圈,发现并没解决问题,另外提醒一下各位,国内的daocloud push操作只对收费会员开放。最后,博主,注册了ali的镜像仓库服务(免费),push成功,ali镜像仓库官方教程很全面,我这边就不赘述了。
上面一顿操作,服务是配好了,同时也感觉很累,毕竟搭建这么一套简单lnmp都这么多命令,能不能有种工具可以帮我们?
docker-compose登场。只需一个yml文件,即可快速制作镜像。
https://github.com/docker/compose/releases/下载最新
curl -L https://github.com/docker/compose/releases/download/1.20.0-rc1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
dir docker
cd docker
mkdir -p $PWD/nginx/www $PWD/nginx/logs $PWD/nginx/conf $PWD/nginx/conf/conf.d
mkdir -p $PWD/php-fpm/logs $PWD/php-fpm/conf
//准备好/nginx/conf/nginx.conf和/nginx/conf/conf.d/default.conf
nginx.conf:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$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.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
default.conf:
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
if (!-e $request_filename) {
rewrite ^/(.*) /index.php?$1 last;
}
location ~ \.php$ {
#此处注意,是php容器内的代码目录,所以不是/usr/share/nginx/html;
root /var/www/html;
#这里testphp是php容器的服务名,不写IP,因为IP会变
fastcgi_pass testphp:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
include fastcgi_params;
}
}
编写vim docker/docker-compose.yml:
###指定撰写文件格式版本:1,2,3(最新)
version: '2.1'
services:
testnginx: #给容器一个名称
image: XXX/nginx #此处填写你之前push的镜像名
volumes: #此处为映射目录
- ./nginx/www:/usr/share/nginx/html
- ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/conf/conf.d/default.conf:/etc/nginx/conf.d/default.conf
ports: #映射IP
- "80:80"
container_name: testnginx #容器名称
depends_on: #容器依赖项,说明nginx依赖php,会先启动php
- testphp
links:
- testphp
testphp:
image: XXX/php
volumes:
- ./nginx/www:/var/www/html
- ./php-fpm/conf:/usr/local/etc/php
- ./php-fpm/logs:/phplogs
ports:
- "9000:9000"
container_name: testphp
如果你制作的镜像全部push成功,那么你只需保存好你的源码目录和docker-compose.yml文件,下次执行
docker-compose up -d
即可运行
当然,相关目录和yml也可托管到git
最后善用提醒,上传镜像前最好检查好权限: