docker相关

docker 

        应用场景:假设用户试图基于最常见的LAMP (Linux + Apache + MySQL+ PHP)组合来运维一个网站。按照传统的做法,首先,需要安装Apache、MySQL 和PHP以及它们各自运行所依赖的环境,之后分别对它们进行配置(包括创建合适的用户、 配置参数、开放端口等),经过大量的操作后,还需要进行功能测试,看是否工作正常。

更重要的是,在开发后期测试完毕后,正式平台环境的搭建移植,以及后期维护问题,一旦需要重新部署环境或服务器迁移,又需要重新部署和调试,漫长而心烦。

而Docker提供了一种更为聪明的方式,通过容器来打包应用,封装对应的docker镜像,意味着迁移只需要在新的服务器上启动需要的容器就可以了。这无疑将节约大量的宝贵时间,并降低部署过程出现问题的风险。


注册服务器(registry)>仓库(respository)>镜像(image)>容器(container

  • 安装docker:centos7的扩展源里已经内置docker源,直接使用

#yum install -y docker 安装即可

#yum update docker  更新docker

注:若在安装过程中报错,尝试更换yum下载源试试

  • 启动docker服务

systemctl start docker 

开启docker服务时报错:


关键信息如下:

        这是由于我安装docker使用的操作系统是Centos7发行版,Centos系统的内核为3.X,官方基于此内核构建了overlay存储驱动,但是默认情况不加载,而docker的存储驱动默认使用overlay2,由于默认不加载overlay存储驱动,安装docker以后会改变存储驱动为overlay2,然后被SElinux安全模块禁止了,所以出现如图报错,此时我们可以修改配置文件:

vi /etc/sysconfig/docker


docker启动后,使用docker info查看docker所有信息:


如上图所示:docker已经使用overlay2存储驱动,docker启动完成.

  • 验证docker已经正常安装

docker run hello-world

运行一个叫hello-world的容器

  • 查看本地镜像库:

docker images

  • 查看所有容器

docker ps -a

  • 设置docker开机启动

systemctl enable docker.service

  • 下载镜像:

docker pull 镜像名:tag     从默认的docker hub远端镜像仓库下载指定tag版本的镜像,若不指定tag默认为下载latest最新版本。

注:命令中的tag和镜像仓库都可根据自己的需要进行更改,其中镜像仓库分远端(互联网共享)和本地两种。

  • 查看本地已有的镜像:

docker images

  • 搜寻远端仓库中的镜像:

docker search 镜像名

  • 删除镜像:

注:删除镜像分为删除某个镜像对应的某个tag和镜像文件,若命令最后为镜像ID,则删除此镜像所有tag及镜像文件

一般删除镜像的步骤为:

  • docker images

查看本地已有镜像,记录镜像ID及对应的tag

  • docker ps -a

查询本地已有容器,若某个容器依赖对应的镜像,则无法删除,需要先移除此容器

  • docker rm 容器id/name   

删除容器,若要删除的容器正在运行,也需要先停止容器,P

  • docker stop 容器id/name

停止容器运行,

PS:

docker stop $(docker ps -q)停止所有容器运行

docker rm $(docker ps -qa)删除所有容器

  • docker rmi 镜像名:tag/镜像ID

若要强行删除某个镜像,可带-f 参数,但这样做的话,系统会重新复制一个此镜像临时附给容器使用,所以没意义,谨慎操作!

  • 存储相关
  • 挂载宿主机目录至容器,用于宿主机于容器共享存储
在创建运行容器时,用-v参数,挂载宿主机目录存储到容器(路径为绝对路径)

docker run -it -v /home/xuchuan:/usr/xu docker.io/centos --name centos-tomcat /bin/bash

基于docker.io/centos镜像创建一个镜像并挂载宿主机/home/xuchuan目录至容器/usr/xu目录.

挂载目录的默认权限为rw,可在容器目录后加:ro(read only)设置为只读权限,设置为只读后,用户在容器内无法更改目录内容,若要使用挂载目录作为软件数据存储,则不能设置为只读:

docker run -it -v /home/xuchuan:/usr/xu:ro docker.io/centos --name centos-tomcat /bin/bash

进入容器,访问挂载的目录,发现无法打开,报错如下图:


这是因为以宿主机作为挂载源的/home/xuchuan目录的所属用户与容器内/usr/xu目录不一致,导致centos系统里安全模块selinux把权限给禁掉了,可用以下两种方法解决:

1.更改宿主机目录所属用户uid(在此基于uid更改,不能基于用户名更改,会导致容器内因为没有相应用户也无法访问)

chown -R 1000 /home/xuchuan

2.把目录添加selinux放行规则

添加selinux规则,将要挂载的目录添加到白名单

chcon -Rt svirt_sandbox_file_t /home/xuchuan

同一个宿主机目录可同时挂载至多个容器内且同步更新,在宿主机或任一容器内对目录做了修改,其他目录也会做相应修改,但在容器中无法对目录执行删除操作,只能在宿主机中对挂载目录进行删除,删除之后,容器内对应目录也被清空。

  • 创建一个数据卷当作存储的数据卷容器,用于多个容器共享一些持续更新的数据(实时同步)
将一个正常的容器作为数据卷,让其他容器通过挂载这个容器实现数据共享,数据卷容器会降低I/O性能

docker run -it -v /usr/xu  --name volume-test docker.io/centos /bin/bash

基于docker.io/centos镜像创建一个名为volume-test的数据卷,并把数据卷/usr/xu目录作为共享目录;

进入容器/usr/xu目录,创建文件aaa,添加内容:test


此时宿主机中会在/var/lib/docker/volumes目录下自动创建一个随机目录与数据卷容器/usr/xu目录进行绑定,并实时更新,

docker inspect volume-test     查看volume-test元数据


如图,mounts节点显示了宿主机上自动创建的目录/var/lib/docker/volume/lf09............/_data,


进入目录可以看出,宿主机目录内的文件及内容与数据卷容器内的一致。

  • 其他容器使用--volumes-from来挂载数据卷容器

    

docker run -it --name db1 --volumes-from volume-test docker.io/centos /bin/bash

容器的数据卷的备份:

注:所有对于挂载目录的修改,都是独立于镜像之外的,并不会对镜像做任何修改,即使使用docker commit命令提交修改制作镜像也不会保存挂载目录的修改。

1.若采用直接挂载宿主机目录至容器的方式共享存储,则只需要备份宿主机对应的目录即可;

2.若采用创建数据卷容器的方式共享存储,有以下两种方式:

2.1新建一个容器,把宿主机目录和数据卷容器都挂载到新建的容器内,然后进行打包操作,一条命令解决,最后再

docker run --rm --volumes-from volume-test --privileged=true -v /root/xuchuan:/backup --name backup5  docker.io/centos tar -zcvf /backup/aaabbb.tar /usr/xu

基于docker.io/centos镜像创建一个名叫backup5的容器,把宿主机/root/xuchuan目录和volume-test数据卷容器同时挂载到backup5容器内,并在容器启动后执行打包命令,打包容器/usr/xu目录所有内容,最后执行-rm删除此容器。(由于宿主机/root/xuchuan和容器内/backup是挂载关系,并实时更新,所以打包完成后会在宿主机/root/xuchuan目录下同时生成aaabbb.tar)

2.2前面说过,新建数据卷容器后,docker会自动在宿主机/var/lib/docker/volume目录下创建一个目录来对应数据卷,所以我们只需要在宿主机上备份这个目录即可。

  • 宿主机和容器间的数据拷贝

docker cp /etc/uar(源) 容器ID:容器内路径(目的)

将主机/home/xuchuan目录拷贝到容器96f7f14e99ab的/usr/xu目录下。

docker cp /home/xuchuan 96f7f14e99ab:/usr/xu


将容器96f7f14e99ab的/xu目录拷贝到主机的/tmp目录中。
docker cp  96f7f14e99ab:/xu /tmp/

  • 制作镜像:
  • 提交修改并生成镜像:

docker commit -m/-a/-p 源镜像名/ID 新镜像名称:tag    

-a 作者消息

-m 提交消息

-p 创建时暂停容器运行

用户对运行的容器做修改,但这些修改并不会影响对应的镜像,docker commit就是用来提交用户的修改并生成一个新镜像。

docker inspect 容器/镜像   查看容器/镜像的元数据

docker tag 源镜像名:tag 新镜像名:tag     新建一个带tag的镜像,镜像ID与源镜像相同,若带参数-f,则不会新建,而是覆盖源镜像

save/load    保存/载入         把镜像保存到宿主机中/从宿主机中载入镜像   此命令会保存/载入镜像中所有历史,也就是所有容器

  • 保存镜像:

docker save -o centos7-nigix.tar 源镜像名:tag

  • 载入镜像:

docker load -i CentOs_7.4.tar 

docker save             对镜像进行保存,会保存镜像里所有的版本,每一次修改后用docker commit生成的新镜像包括初始源镜像都会被保存下来并生成一个tar包,这个包里会保存所有镜像版本和元数据。

docker commit         提交对容器的修改操作并创建一个镜像版本,生成的是一个镜像,不是tar包



了解dockerfile生成镜像,了解docker-compose 自动化部署


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值