一.安装docker
Docker要求运行在Centos 7上,要求系统为64位,系统内核版本3.10以上

1.uname -an 查看当前系统版本

2.yum -y install docker 下载安装docker

3.service docker start  启动docker服务

4.docker version  检查docker是否安装成功

当看到下图的信息,就是表示本机docker已经安装成功,很简单

二.镜像操作
创建容器要以镜像为基础,所以先讲下docker镜像的操作

搜索镜像

docker images ll 查看下本机的是否已经有了镜像

目前机器里还没有镜像,去Docker Hub下载(镜像还可自定义,这里就不细说了)

docker search java  ,还能指定具体的版本进行下载,

例如:docker search  Ubuntu:1.2.5.4,可以进行搜docker Hub 会列出很多镜像

下载镜像

docker pull docker.io/nginx 进行下载

下载到本地的镜像要比docker Hub上搜索出来的要大,因为下载过程中自动解压了,在查看镜像列表就有了刚才下载的镜像

列表包含了仓库名,版本标签,镜像ID,创建时间以及所占用的空间

删除镜像

删除没用的镜像docker rmi镜像id

三.镜像的创建与管理
前边我们已经下载好了Nginx的镜像,接下来我们就创建一个只有Nginx应用的容器docker run -i -t <IMAGE_ID> /bin/bash:-i:标准输入给容器 -t:分配一个虚拟终端 /bin/bash:执行bash脚本,​​​​​​

docker run -idt --name container_nginx -p 8080:80  docker.io/nginx
启动一个使用镜像docker.io/nginx,名字container_nginx的容器,-p 8080:80表示将容器的80端口映射到主机的8080端口,这样我们只要访问主机的8080端口就可以访问到容器的服务了。

注意:name前面是两个-, 端口前面有-p, docker.io/nginx是镜像名,8080是主机的端口,80是Nginx应用的端口

主机上的一个端口只能映射一个容器端口,不可以多个容器端口对应一个主机端口(如果容器安装的centos类的系统,那么容器端口随便设定,但如果容器内只是单纯的应用,那么容器端口要是应用自身的端口)

这样我们就创建并启动了一个容器!

exit 退出容器

docker ps 查看运行中的容器

docker ps -a 查看运行中和非运行中的所有容器

docker exec -it container_nginx /bin/bash 进入容器

如果容器还未启动 执行docker start container_nginx
进入容器后启动Nginx

whereis nginx 找Nginx的启动目录

[root@iz2zehzeir87zi8q99krk1z ~]# docker start container_nginx
container_nginx
[root@iz2zehzeir87zi8q99krk1z ~]# docker exec -it container_nginx /bin/bash
root@84683e425116:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@84683e425116:/# /usr/sbin/nginx

此时在浏览器访问 http://51.110.218.9:8080/ 就可以直接访问容器内的Nginx

如果访问不成功,可能是主机端口的防火墙开着,执行下边的命令关闭

/ sbin / iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
由于我用的阿里云服务器,所以需要在阿里云把8080端口开放

删除容器

容器删除之前先将容器停止

docker stop container_nginx 或者是容器的id

docker rm -f container_nginx 容器删除
docker start 与 docker run 的区别

docker start name 启动一个已经创建的容器

docker run 创建并启动一个容器
docker run 命令其实是 docker create 和 docker start 的命令组合,先执行docker create 创建一个容器 再接着docker start启动

主机和容器文件相互复制

从主机复制到容器 sudo docker cp host_path containerID:container_path

从容器复制到主机 sudo docker cp containerID:container_path host_path
请注意,以上这两个命令都是在主机中执行的,不能再容器中执行

docker cp container_nginx:/usr/local/xin.txt  /usr/local/software/   容器向主机复制文件
docker cp /usr/local/xinzhifu.txt  container_nginx:/usr/local/  主机向容器复制文件

这样一个基础的docker容器就创建完了 。。。。。。。。。。。。

反过来大家再看一看docker的容器与镜像的区别  https://www.cnblogs.com/linjiaxin/p/7381421.html

那么其实镜像与容器的本质区别并不大,那么镜像可以生成容器 ,容器是否可以做成镜像呢?

docket commit container_nginx  image_nginx:v1

容器名 自己起一个镜像的名字:版本号
 用当前的容器生成了redis镜像

例如:A、B两台机器都想安装redis,A机器上创建容器并在容器中做好redis的一切配置,让后将这个容器docker commit 成镜像image_redis,B机器也想要安装redis,直接用镜像image_redis创建容器就行了,docker就是做这样一劳永逸的事情。

而且传统方式得在每台机器上安装配置redis非常麻烦

四.镜像的导入与导出
 
镜像压缩打包 (主机上进行操作),有两种方式 docker save 与 docker load 和 docker export 与 docker import

docker save nginx | gzip > nginx_xin_image.tar.gz  将现有的镜像压缩打包

docker load -i nginx_xin_image.tar.gz 压缩的镜像解压

docker images 进行查看
docker save 是直接将镜像进行打包   docker save <镜像名>或<镜像id>

docker export container_nginx> nginx_image.tar

cat nginx_image.tar | sudo docker import  - nginx_image:import
docker export 是直接将容器进行打包   docker save <容器名>或<容器id>

需要注意两种方法配套的,切不可混用。虽然导入导出时没问题,但是在创建容器时候会报错

如果使用import导入save产生的文件,虽然导入不提示错误,但是启动容器时会提示失败,

会出现类似"docker: Error response from daemon: Container command not found or does not exist"的错误。

类似,使用load载入export产生的文件,也会出现问题。

——————————————————————————————————————————————————————————————————————

因为之前服务器是装着军哥的lnmp1.4,担心跟 docker 有冲突,所以一直也没有去接触 docker,另外一方面是自己懒,因为每次折腾,没有个一两天是完事不了的(其实就是水平 low 呗),好了,这不蹭着暑假这波(从去年就喊,每次给服务器搬个家,累得要死,赶紧换 docker 了)今天可算是真枪实战一波了。

建议阅读本文之前可以先去docker 官网先了解下容器,镜像,仓库等概念,再来观看本文的操作!

1、准备 docker 的运行环境

①查看自己服务器内核版本,命令: uname  –a  返回结果在 3.1  64bit 的,即可安装。

②不行的话建议升级内核版本后,再来安装。docker 内核升级教程可参考:

因为我是结合这两篇教程操作的,所以就放着两篇地址,其他的没操作过,没话语权。这里建议按步骤走,网上的很多教程有这坑,这步操作好了,就可以开始初探 docker 了。

2、安装 docker

①先更新下 yum,命令 yum update

②添加 yum 仓库,命令如下

  1. tee /etc/yum.repos.d/docker.repo <<-'EOF'
  2. [dockerrepo]
  3. name=Docker Repository
  4. baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
  5. enabled=1
  6. gpgcheck=1
  7. gpgkey=https://yum.dockerproject.org/gpg
  8. EOF

③安装 docker 命令:yum install -y docker-engine

安装好,如下图:

图片中有句 Cannot connect to the Dokcer daemon。。。我当时装好的时候也有这句,我没管他, 也不影响使用。继续。

④启动 docker 命令 service docker start

上面这部分教程来源:linux 上安装 Docker(非常简单的安装方法),当时在查找教程中还发现个问题,就是有的命令带有 sodo (sudo 是一种权限管理机制,管理员可以授权于一些普通用户去执行一些 root 执行的操作),因为我自己都是用 root 操作的,所以不存在这个问题。

3、安装 mysql

①去 docker 仓库(https://hub.docker.com/)拉取 mysql 镜像,命令 docker pull mysql

该命令是拉取最新的 mysql 版本,如果你要指定 mysql 版本,命令 docker pull mysql:5.6

②创建 mysql 容器,命令

  1. docker run \
  2. --name web-mysql \
  3. -d -p 3306:3306 \
  4. -e MYSQL_ROOT_PASSWORD=123456789 \
  5. -v /web/mysql/data:/var/lib/mysql \
  6. -v / web /mysql/conf.d:/etc/mysql/conf.d \
  7. -v /etc/localtime:/etc/localtime:ro \
  8. c54721a9eb17

参数说明

  • --name 给这个容器取个别名叫 web-mysql
  • --d 保持后台运行
  • -p 指定端口,进行端口映射,将宿主机的 3306 端口映射到容器内的 3306
  • -v 目录挂载,这个-v 主要用处是方便我们在宿主机上操作容器内的配置文件,要不然每次操作配置文件都需要进入容器后然后修改配置文件
  • -v /etc/localtime:/etc/localtime:ro 特别说下,因为我发现容器内的时间会跟宿主机相差 8 个小时,加载这个目录是为了校正时间跟宿主机时间一致。
  • c54721a9eb17——是容器的 ID (可通过 docker images 可以看到)

更多参数的详解,请参考Docker 命令大全

这里有个问题,关于我在查找教程的时候,发现有的人需要配置 docker 的镜像源(因为 docker 在国内访问较慢),所以就有先要修改镜像源的操作,主要解决国内环境下载慢的问题,修改镜像源方法请参考:Docker 镜像源修改。本文中因为我的服务器在国外的,所以就不用考虑配置什么国内源。

4、安装 php

①拉取 php 镜像,命令  docker pull php-fpm,指定版本的命令同上。

②创建 php 容器,命令

  1. docker run \
  2. --name web-php \
  3. -d -p 9000:9000 \
  4. -v /web/php-fpm/etc/:/usr/local/etc/php \
  5. -v /web/nginx/web:/var/www/html \
  6. -v /web/localtime:/etc/localtime:ro \
  7. --link web-mysql \
  8. 953f20b0e810

这里的多了个参数

--link 是跟已经运行的 web-mysql 容器建立链接。所以才说要按顺序安装容器的。

其他的命令同上,php 容器运行好后,有个问题要注意,因为默认的 php 镜像中是不带有 mysqli 模块(这个模块是一定要装的,因为连接数据都需要用到)。操作方法

(1)使用命令的进入容器内部 docker exec -it 890ec4245c56 /bin/bash

这的 890ec4245c56 是你运行好后的容器 ID(用 docker ps 查看获取)

(2)进去后,输入命令 docker-php-ext-install mysqli 等待安装好, 如果出现

cannot create /usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini: Directory nonexistent

请参考:docker 下 php 安装扩展进行解决。

5、安装 nginx

①拉取 nginx 镜像,命令 docker pull nginx,指定版本命令同上 。

②创建 nginx 容器,命令

  1. docker run \
  2. --name web-nginx \
  3. -d -p 80:80 \
  4. -v /web/nginx/conf/nginx.conf:/etc/nginx/nginx.conf/  \
  5. -v /web/nginx/conf/vhost/conf.d:/etc/nginx/conf.d \
  6. -v /web/nginx/web:/usr/share/nginx/html  \
  7. -v /web/nginx/logs:/var/log/nginx/  \
  8. -v /etc/localtime:/etc/localtime:ro \
  9. --link web -php \
  10. 436be79de93f

安装后 nginx 容器后有几个点要注意:

nginx 配置文件中要把 php 部分的参数改成 php 的,这样 php 才能进行解析。

先进入 nginx 容器中,用命令(这条命令是把 web-nginx 容器里面的 nginx.conf 配置文件复制到我们的指定的目录下):

  1. docker cp web-nginx:/etc/nginx/nginx.conf /web/nginx/conf/

这条命令详解请参考:Docker cp 命令

然后就可以直接到我们宿主机上修改 nginx.conf 文件。

还有个配置文件是 default.conf 是主要来负责做站点解析

  1. server {
  2. listen       80;
  3. server_name  www.web.com web.com;
  4. #charset koi8-r;
  5. access_log  /var/log/nginx/host.access.log  main;
  6. location / {
  7. root   /usr/share/nginx/html/;
  8. index  index.html index.htm index.php;
  9. }
  10. #error_page  404              /404.html;
  11. # redirect server error pages to the static page /50x.html
  12. #
  13. error_page   500 502 503 504  /50x.html;
  14. location = /50x.html {
  15. root   /usr/share/nginx/html;
  16. }
  17. # proxy the PHP scripts to Apache listening on 127.0.0.1:80
  18. #
  19. #location ~ \.php$ {
  20. #    proxy_pass   http://127.0.0.1;
  21. #}
  22. # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  23. #
  24. location ~ \.php$ {
  25. root           html;
  26. fastcgi_pass     web-php:9000;
  27. fastcgi_index  index.php;
  28. fastcgi_param  SCRIPT_FILENAME  /var/www/html/$fastcgi_script_name;
  29. include        fastcgi_params;
  30. }
  31. # deny access to .htaccess files, if Apache's document root
  32. # concurs with nginx's one
  33. #
  34. #location ~ /\.ht {
  35. #    deny  all;
  36. #}
  37. }

web-php 和/var/www/html/是需要修改的两个地方,如果你是按上面的命令进行操作的,就修改这两个地方,然后上传到我们的指定的目录/ web /nginx/conf/vhost/conf.d 里

我说下修改的地方

第一处地方我改成 web-php,因为这是我们自己创建了一个叫 web-php 容器名称/id(ID 太长了不好分辨),9000 也正是 php 的端口

第二处修改地方,是指 php 需要执行的文件地址,为什么填这个地址呢?因为这是 php 默认解析目录地址。

操作完上面的几个步骤了,先停止所有容器,然后重启(为了让配置生效)。

停止容器的命令  docker  stop 容器 ID/容器别名

开启容器的命令  docker  start 容器 ID/容器别名(开启的时候一定要按顺序 1.mysql 2.php 3.nginx,因为容器之间都有做关联,如果你所需关联的容器没有先启动,那这个容器是不是就会开启失败了,这就是为什么一定要按顺序!!!)

上面所有需要创建的配置文件,我都整理好,不想自己动手配置的可以直接下载配置文件,点此下载 docker 配置文件

下面分享下常见的 docker 命令

  • 容器的开启/停止/重启:docker start/stop/restart 容器 ID/别名
  • 容器的删除:docker rm 容器 ID/别名
  • 镜像删除:docker rmi 镜像 ID(先停止容器后,删除。方法二强制删除 docker rmi –f 容器 ID/别名,这就不用管他停没停止了 )
  • 进入容器:docker exec -it 容器 ID/容器别名 /bin/bash(网上还有条进入容器的命令,不过我都是用这条,因为用这条命令进去的容器,你退出容器后还是容器是还在运行的状态!)
  • 查看容器的 ID 地址:docker inspect --format '{{ .NetworkSettings.IPAddress }}' 容器 ID/容器别名
  • 查看正在运行的容器:docker ps
  • 查看所有状态下的容器:docker ps –a
  • 查看某个容器的日志: docker logs 容器 ID/容器别名
  • 停止所有的容器:docker stop $(docker ps -a -q)
  • 删除所有的容器:docker rm $(docker ps -a -q)
  • docker 的开启/重启/状态:service docker start/restart/status

接触 docker 好几天了,才对他有那么一丢点了解(生怕下次再操作的时候会忘记了,所以特地写了篇文章,以备不时之需,而且里面的操作,都是我装 docker 时遇到的问题,把所有发生的问题都记录整合在一起,这样也省了有同样问题的朋友,要百度好几次,而浪费时间!),

我自己也同时在几个服务器上配了 docker,不得不说 docker 配置环境真的很快,我第一次配的时候,因为不熟练,所以配的慢, 等到我第二次配的时候,所有操作 10 分钟搞定,相比之前用军哥的一键安装包的配置时间真的缩短的不是一两倍啊!还有 docker 占用内存也比我之前的低。所以搞下来这几天,还是挺有收获的!

文中所有的操作方法,皆是来源于网络,由我整合归纳,如有发现错误,还请麻烦指正,谢谢!

Linux 安装docker,以及docker的基本操作:https://blog.csdn.net/xinzhifu1/article/details/83579256

docker的安装部署及使用docker安装mysql+php+nginx教程:https://boke112.com/6402.html

后端好书阅读与推荐(续):https://segmentfault.com/a/1190000011076865#articleHeader4

服务器部署docker lnmp环境的更多相关文章

  1. 记录Linux CentOS 7系统完整部署Docker容器环境教程

    笔者之前有在"详细介绍Ubuntu 16.04系统环境安装Docker CE容器的过程"文章中有介绍到利用Ubuntu系统安装Docker容器环境的过程.如果我们有使用CentOS ...

  2. Docker LNMP环境搭建

    原文地址:https://www.awaimai.com/2120.html 1 快速使用 2 安装docker和docker-compose 3 使用国内镜像仓库 4 目录说明 4.1 目录结构 4 ...

  3. 服务器部署docker

    docker简介 可以把docker是一个容器,可以让开发者将自己的项目部署到这个容器中,最常用的场景是将自己的后端项目部署到服务器的时候会将其打入docker镜像中,可以理解为一个开销更小的虚拟机. ...

  4. Ubuntu部署Docker容器环境

    1.首先切换到root用户 2.安装网卡报错 解决办法,删除锁住的文件: 再次安装成功. 4.ubuntu下面安装:apt-get install openssh-server  安装远程工具 5.设 ...

  5. ThinkPHP部署在lnmp环境中碰到的问题

    先说一下问题: 因为tp5的入口文件在public目录下,而Application和public同级, 我用的lnmp1.5默认做了防跨站目录设置,所以导致入口文件无法进入application目录, ...

  6. 使用Dockerfile构建docker lnmp环境

    一.mysql 1.创建 Dockerfile mkdir mysql # 创建一个目录存放之后的Dockerfile,目录名无所谓 cd mysql # 进入目录 vi Dockerfile # 创 ...

  7. 原lnmp环境服务器升级为mysql+nginx+php单个docker容器构建的lnmp环境

    时间:2018年2月 一.项目背景 我单位现web服务架构为lnmp环境,服务器软件.硬件升级部署难:同时开源软件日新月异,考虑到技术升级,领导决定服务器架构整体升级为容器架构,维护性.移植性强. 二 ...

  8. 阿里云Ubuntu安装LNMP环境之PHP7

    在QQ群很多朋友问阿里云服务器怎么安装LNMP环境,怎么把项目放到服务器上面去,在这里,我就从头开始教大家怎么在阿里云服务器安装LNMP环境. 在这之前,我们先要知道什么是LNMP. L: 表示的是L ...

  9. 阿里云Ubuntu安装LNMP环境之Mysql

    在QQ群很多朋友问阿里云服务器怎么安装LNMP环境,怎么把项目放到服务器上面去,在这里,我就从头开始教大家怎么在阿里云服务器安装LNMP环境. 在这之前,我们先要知道什么是LNMP. L: 表示的是L ...

随机推荐

  1. [PHP] 浅谈 Laravel Authentication 的 auth:api

    auth:api 在 Laravel 的 Routing , Middleware , API Authentication 主题中都有出现. 一. 在 Routing 部分可以知道 auth:api ...

  2. linux 资源

    linux 资源查看 cpu 信息 通过/proc/cpuinfo 查看  # 总核数 = 物理CPU个数 X 每颗物理CPU的核数  # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 ...

  3. myeclipse An internal error occurred during: "Initialize metrics".

    重新安装的myeclipse,在打开的时候弹出:    An internal error occurred during: "Initialize metrics". com/g ...

  4. POJ-动态规划-背包问题模板

    背包问题模板 一.0-1背包 状态:背包容量为j时,求前i个物品所能达到最大价值,设为dp[i][j].初始时,dp[0][j](0<=j<=V)为0,没有物品也就没有价值. 状态转移方程 ...

  5. python 异常处理(25)

    在python开发中,代码书写时难免有疏忽或者意向不到的bug,导致程序run的过程中有可能会直接崩溃:然后对于程序猿而言,程序因bug崩溃是家常便饭,为了增加程序的健壮性,防止程序崩溃,我们可以对程 ...

  6. 执行sudo supervisorctl reload报错ImportError: No module named supervisor.supervisord

    由于yum install supervisor 会默认使用python2.6环境,首先要安装好python2.6的环境,然后修改以下文件首行为2.6即可 [root@VM_0_15_centos ~ ...

  7. LeetCode 540. 有序数组中的单一元素(Single Element in a Sorted Array) 42

    540. 有序数组中的单一元素 540. Single Element in a Sorted Array 题目描述 每日一算法2019/6/14Day 42LeetCode540. Single E ...

  8. iframe高度自适应的方法

    第一种:iframe内容未知,高度可预测 这个时候,我们可以给它添加一个默认的CSS的min-height值,然后同时使用JavaScript改变高度.常用的兼容代码有: // document.do ...

  9. 第1课,python输出,输入,变量,运算

    课程内容: 为什么要学习python 如何学python 实践体验 图片来源网络分享 为什么要学python: 简单 (设计如此) 强大(因为开源,有库) 如何学习python: 变量 --> ...

  10. python代码执行SQL文件(逐句执行)

    一.简介 关于Python如何连接数据库并执行SQL语句,几乎所有的Python教程都会讲,教程里基本只介绍了执行单条SQL语句的方法,但是实际生产过程中可不只是执行一两条语句,动辄几十条甚至上百条的 ...