常用命令
docker pull pkg:version # 拉取 image
docker images # 查看所有 image
docker rmi myphp # 删除 image
docker ps # 查看运行中的 container
docker ps -a # 查看所有 container
docker inspect myphp # 查看 container 配置
docker logs myphp # 查看 container 日志
docker restart myphp # 重启 container
docker stop myphp # 停止 container
docker rm myphp # 删除 container
docker exec -it myphp bash # 进入到 container
docker build -t repository_name[:tag_name] Dockerfile_dir # 构建 image
docker volume ls # 查看数据卷
docker volume prune # 删除所有数据卷!!!!!!超级危险,生产环境不要执行!!!!!!
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://e5w39ty6.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2.下载镜像
docker pull php:7.2-fpm # 冒号后选择版本
docker pull nginx
docker pull mysql:5.7 # 不需要本地数据库可忽略
docker pull redis:3.2 # 不需要本地redis可忽略
docker images # 查看已下载的所有镜像
3.创建容器
要注意容器的启动顺序
参数解释:
注:
-i 表示允许我们对容器进行操作
-t 表示在新容器内指定一个为终端
-d 表示容器在后台执行
/bin/bash 这将在容器内启动bash shell
-p 为容器和宿主机创建端口映射 -p 8081:8080 用于将容器内的8080端口映射到主机的8081端口
--name 为容器指定一个名字
-v 将容器内路径挂载到宿主机路径
--privileged=true 给容器特权,在挂载目录后容器可以访问目录以下的文件或者目录
--link可以用来链接2个容器,使得源容器(被链接的容器)和接收容器(主动去链接的容器)之间可以互相通信,解除了容器之间通信对容器IP的依赖
格式:原容器名:设置的别名
在nginx配置文件中,监听php的ip,就可以使用别名,而不使用ip
4.先创建php ,nginx的映射目录
/**nginx映射的宿主机目录*/
mkdir -p /usr/local/lnmp/nginx/conf.d /usr/local/lnmp/www /usr/local/lnmp/logs
/**php映射的宿主机目录*/
mkdir -p /usr/local/lnmp/php
首先创建一个测试的nginx
因为不能挂载文件,只能挂载文件夹,所以先在一个test容器中复制一份配置文件。
复制一份 nginx.conf和default.conf
docker run --name test -d nginx
docker cp test:/etc/nginx/nginx.conf /usr/local/lnmp/nginx/
docker cp test:/etc/nginx/conf.d/default.conf /usr/local/lnmp/nginx/conf.d
如果不知道配置文件的存放目录,可以进去容器查看一下。
docker exec -it test /bin/bash
启动容器
###### mysql容器
docker run --name mydb -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
# 注:-MYSQL_ROOT_PASSWORD=123456 给mysql设置初始密码,如果不需要搭建本地数据库直接下一步
###### php容器容器
docker run --name myphp -d -p 9000:9000 -e TZ=Asia/Shanghai -v /usr/local/lnmp/www:/var/www/html -v /usr/local/lnmp/php:/usr/local/etc/php --privileged=true php:7.2-fpm
#注意-v 挂载一个空文件夹是会覆盖容器中的内容,所以配置文件要事先准备好
###### nginx容器
docker run --name mynginx -d -p 80:80 -e TZ=Asia/Shanghai -v /usr/local/lnmp/www:/usr/share/nginx/html -v /usr/local/lnmp/nginx/nginx.conf:/etc/nginx/nginx.conf -v /usr/local/lnmp/nginx/conf.d:/etc/nginx/conf.d -v /usr/local/lnmp/logs/nginx:/var/nginx/logs --link myphp:myphp --privileged=true nginx
#注:
#-v语句冒号后是容器内的路径 我将nginx的网页项目目录 配置目录 日志目录分别挂载到了我事先准备好的/usr/local/lnmp/nginx目录下
#--link myphp:myphp 将nginx容器和php容器连接 通过别名myphp就不再#需要去指定myphp容器的ip了
查看所有容器运行成功 这里环境也就基本搭建完成了
docker ps -a
如果有容器创建失败,则可以使用docker logs name 查看日志,按照日志报错解决问题
在宿主主机的nginx工作目录里写一个phpinfo.php文件
我的在/usr/local/lnmp/www目录里
nginx配置修改 (因为之前是拷贝的test容器的nginx的配置文件,当作mynginx容器的主机映射配置文件,所以要修改)
我的在/usr/local/lnmp/nginx/conf.d文件夹下的default.conf文件
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
#这里是工作目录指定,已经映射到宿主主机的自定义文件夹
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root /var/www/html; #php的工作目录
fastcgi_pass myphp:9000;
#php容器的名字和端口,容器与容器之间建立连接必须指定对方ip 使用命令 docker inspect --format='{{.NetworkSettings.IPAddress}}' myphp就可以
# 我们在创建容器时,已经通过 --link 的方式创建容器,我们可以使用被link容器的别名进行访问,而不是通过ip,解除了对ip的依赖
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
在浏览器里访问就可以了
最后把 test的容器删掉
完结,撒花。
https://github.com/assoyuan/docker_example/blob/master/README.md
https://segmentfault.com/q/1010000016515320
https://blog.csdn.net/qq_42114918/article/details/85238011