很久之前就很流行的Docker,一直没有机会接触,工作场景中服务器布置完毕很少去各种替换版本,所以一直也没准备去get它,直到最近搭建TrinityCore的时候,那各种编译bug的出现让我觉得有必要对编译好的TrinityCore来一次docker。受限于docker不会对基础系统产生依赖,那么直接部署也不会有编译上的bug了。
docker确实是一个很好的想法,把每个服务都单独隔离到独立的容器里,通过镜像的方式快速搭建部署。在速度上确实比虚拟机来的快,容量也更加轻巧。而且他每个容器可以配置独立的系统环境,那么与宿主机之间的各种联系也可以很好的断开。不论你宿主机是windows还是linux,只要镜像相同,运行就相同。不过宿主系统不同在配置上会有一定的差异,单运行的容器内还是一样的。
宿主隔离,独立环境,这就是他流行的原因,以前是空服务器直接安装整个镜像,现在是不论你运行的什么系统,只要安装上docker就可以直接运行。运维大军爱死这玩意了。以前还要各种给那帮孙子配置环境,现在只要装个系统装个docker就行了。什么?你网站运行不了?不好意思,docker内部环境我们不管。哈哈,开玩笑,只是说,他的确实很方便。可以快速配置,批量安装到各种系统上。
是不是一定要用docker?
当然不是,如果你的公司不是很激进的跟进最新的软件版本,那么docker基本没太大意义了。这种情况占很大比例(国内)。大多数网站很久都不会换php版本,nginx版本,除非阿里云给你发了漏洞警告。
那么docker适合谁呢?
适合激进的公司,激进的个人,还有运维,还有就是——懒人。
为啥他们要用?
激进公司:很多新项目,如果用了docker,每个项目需要的环境就可以彼此隔离,比如web跑在centos下,TrinityCore跑在debian下......等等,一台服务器就可以实现很多系统环境,还彼此不打扰。随时都可以上新。
当然了,一般公司针对新项目也会独立服务器,这里只是提出假设情况。但是配置的速度也会很快。
激进的个人 :也就是喜欢折腾的人,他们喜欢玩各种新东西,docker可以很快为他们配置好需要的环境
运维:最喜欢的应该就是他们了,比如新项目需要用php7,但是老系统是php5,怎么快速替换?3步就行,关闭php5,创建php7,启动php7,几秒钟就可以完成。因为每个应用都是独立容器的,所以都是独立环境,直接替换。(数据和应用要分开)
懒人:对,就是我上面说编译bug的问题,我懒得再编译几个小时还有可能失败,直接在docker里编译成功,打包成镜像,用的时候直接创建就行了。几秒钟就替代了几小时的编译。其实就是把docker当虚拟机来用。
怎么理解容器,镜像和仓库
仓库没啥好说的,就是一个hub,类似github各种项目在里面,只不过这里是各种镜像在里面。一般特指docker官方仓库,也有自建的。
镜像,你就直接理解成光盘镜像。不可修改,只能直接复制里面的内容创建一个新的容器。
容器,就是用镜像安装好的一个独立的环境。
比较绕的几个点:
1.容器是用镜像创建的会不会很大?
不会,容器基于镜像,所以容器本身容量很小,只保存了在镜像基础上修改的部分。所以创建了容器,镜像就不能删除,否则容器就没了基础。这点和普通理解的镜像操作不同,普通我们理解镜像复制完之后就多了一个拷贝,然后在拷贝上操作修改,容量与原有镜像一样大,类似光盘安装。但是这里的镜像不是用来拷贝的,是作为基础环境的。类似与在镜像上一层创建容器,修改保存在容器。所以容量大致等于镜像+容器总和。
2.用镜像创建容器会不会和装系统一样慢?
不会,上面说了,这里的镜像不用来复制,用来做基底使用,所以创建容器只是在镜像基础上新建了一个容器环境,速度很快,几秒即可。所以你要批量创建几十个容器也就是几秒钟就搞掂了。
3.容器彼此之间完全独立吗?
是的,A崩了不影响B,但是可以通过一些设置让他们产生影响,比如外部目录,外部链接等等。
4.docker到底和虚拟机有啥区别?
可以看出,传统虚拟机完全独立,每个都要单独装系统,而docker镜像层是通用的,在镜像基础上新建容器来使用,容器里出问题,不会影响镜像。这样容量也会少很多。
5.为什么说容器最好单独安装一个应用?
这里就是替换问题了,再看上面的图,我们看到有独立的lnmp容器,还有3个独立的php7,mysql,nginx容器。如果这时候有个新项目,需要用到php8,lnmp容器就要整套换掉。而如果你用3个独立的容器做支持,这时候只需要替换php7容器为php8即可。所以建议一个容器只装一个应用。当然你可以完全不遵守。
6.如果换了容器,数据怎么办?
这里就是使用方法了,我们创建容器的时候,一定要把数据关联到外部文件夹。让容器里的应用调用外部文件夹来操作。比如网站数据,一定放到docker外面。下面的例子也会有相关操作。这样替换容器就不会影响数据。
这里以centos7.3为例
准备工作,我们替换yum源为阿里云,避免连不上,你懂得
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum update -y
yum update
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
安装最新版docker
yum install -y docker-ce docker-ce-cli containerd.io
安装指定版本
yum list docker-ce --showduplicates | sort -r
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
配置镜像加速,特殊环境,你懂得
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://bh03ndqc.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
上面的加速地址https://bh03ndqc.mirror.aliyuncs.com是我向阿里云申请的,你也可以去阿里云申请。也可以直接用我的。
启动Docker服务
systemctl start docker
开机启动
systemctl enable docker
查看信息
docker version
docker info ----可查看位置
查看当前正在运行的容器
docker ps
查看所有容器的状态
docker ps -a
启动/停止某个容器
docker start/stop id/name
启动一个伪终端以交互式的方式进入某个容器(使用exit退出后容器不停止运行)
docker exec -it id/name /bin/bash
查看本地镜像
docker images
删除某个容器
docker rm id/name
删除某个镜像
docker rmi id/name
以镜像 centos:centos7.8.2003 创建名为test的容器,并以后台模式运行,并把容器80端口映射到宿主机8080端口
docker run -d -p 8080:80 --name test centos:centos7.8.2003
docker复制文件 [来源位置 目标位置]
docker cp 来源位置 目标位置
例:
docker cp /home/a 965515536d565:/home/b
docker容器目录需要 容器名(id):目录 形式书写
容器自启动,默认容器是不自动启动的
docker update --restart=always 容器名称
容器配置信息
/var/lib/docker/containers/{容器ID+ 一些字符串}/hostconfig.json
默认docker安装的位置可能会系统空间不足,所以最好给他挪个位置,毕竟他容量也不小。
先把docker关闭
systemctl stop docker
方式1,软连接方式
cp -r /var/lib/docker/* /home/docker/
mv /var/lib/docker /var/lib/docker_bak
ln -s /home/docker /var/lib/docker
方式2,修改配置方式
vi /usr/lib/systemd/system/docker.service
修改 ExecStart=/usr/bin/dockerd --graph /home/docker
systemctl daemon-reload
systemctl restart docker.service
搜索镜像
docker search 镜像关键字
*docker自带的搜索比较弱,推荐去hub.docker.com上去搜索,能搜到更细的版本,然后复制命令回来操作*
1.拉取Centos7.8.2003镜像
docker pull centos:centos7.8.2003
查看下载的镜像
docker images
查看所有容器
docker ps -a
使用centos:centos7.8.2003创建容器LNMP并绑定容器80端口到宿主机80端口(-p绑定端口 -d后台运行 -i交互式操作 -t终端 -v挂载真实目录)
docker run -it -d -p 80:80 --name LNMP centos:centos7.8.2003
启动容器
docker start LNMP(或容器ID)
进入容器(docker exec -it 容器PID或容器名 /bin/bash)
docker exec -it LNMP /bin/bash
替换容器内源
yum -y install wget
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache fast
安装lnmp
wget http://soft.vpser.net/lnmp/lnmp1.7.tar.gz -cO lnmp1.7.tar.gz && tar zxf lnmp1.7.tar.gz && cd lnmp1.7 && ./install.sh lnmp
其他软件安装与真机一致,比如redis等等
配置容器内开启自启
cd /
vi start.sh
在start.h里输入
#!/bin/sh
lnmp start
service redis start
/bin/bash
给权限
chmod 777 start.sh
先终止服务
lnmp stop
service redis stop
退出容器
exit
复制数据和配置文件到宿主机,隔离数据与容器,避免丢失
docker cp LNMP:/home/wwwroot /home/wwwroot
docker cp LNMP:/home/wwwlogs /home/wwwlogs
mkdir /home/lnmp-config
docker cp LNMP:/usr/local/php/etc /home/lnmp-config/php
docker cp LNMP:/usr/local/nginx/conf /home/lnmp-config/nginx
docker cp LNMP:/usr/local/redis/etc /home/lnmp-config/redis
docker cp LNMP:/usr/local/mysql/var /home/mysqldata
mkdir /home/lnmp-config/mysql
docker cp LNMP:/etc/my.cnf /home/lnmp-config/mysql/my.cnf
chmod 777 /home/wwwroot
chmod 777 /home/wwwlogs
chmod 777 /home/mysqldata
chmod 777 /home/lnmp-config
chmod 777 /home/lnmp-config/mysql
创建镜像
docker commit -m "这里是描述" -a "这里是作者名称" 现有的容器ID或名称 仓库名:Tag标记
例
docker commit -m "centos7.2003+mysql5.7+php7.4.7+redis5.0.9" -a "gulang" LNMP gulang/lnmp:v1
删除之前容器
docker stop LNMP
docker rm LNMP
查看是否还有
docker ps -a
使用新镜像重新创建容器(-v 真实目录:容器目录 /bash.sh为默认启动脚本)
docker run -it -d -p 80:80 -p 8080:8080 -p 443:443 -v /home/wwwroot:/home/wwwroot -v /home/wwwlogs:/home/wwwlogs -v /home/lnmp-config/php:/usr/local/php/etc -v /home/lnmp-config/nginx:/usr/local/nginx/conf -v /home/lnmp-config/redis:/usr/local/redis/etc -v /home/mysqldata:/usr/local/mysql/var -v /home/lnmp-config/mysql/my.cnf:/etc/my.cnf --name LNMP lnmp:lnmp_v1 /start.sh
*注意,这里-v目录链接设置创建完成之后不能修改,所以想好再创建,如果已经创建了,那么就删除重新创建*
导出镜像到本地文件
docker save -o 宿主机目录.tar 容器
例
docker save -o /home/lnmp.tar lnmp:lnmp_v1
导入镜像到本地文件
docker load --input lnmp.tar
好了基本就这些了,enjoy it!