您的位置:首页 >> WEB开发 >> Docker小笔记
Docker小笔记
[ 孤狼 | 2020-07-04 09:51:21 | WEB开发 | 413°C | 0条评论 ]

很久之前就很流行的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外面。下面的例子也会有相关操作。这样替换容器就不会影响数据。


LNMP配置实例

这里以centos7.3为例

安装docker

准备工作,我们替换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操作

启动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安装的位置可能会系统空间不足,所以最好给他挪个位置,毕竟他容量也不小。

先把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上去搜索,能搜到更细的版本,然后复制命令回来操作*


LNMP为例  

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!

转载请注明出处:http://gl.paea.cn/n.php?n=152
 
如您看得高兴,欢迎随意投喂,让我们坚持创作!
赞赏一个鸡腿
还没有人留下遗迹
综合 · 搜索