当前位置: 代码迷 >> 综合 >> centos7.4下Docker的架构、镜像、容器、数据卷、数据卷容器,端口映射,容器互联等基本命令详解
  详细解决方案

centos7.4下Docker的架构、镜像、容器、数据卷、数据卷容器,端口映射,容器互联等基本命令详解

热度:52   发布时间:2024-01-03 23:51:28.0

Docker是一个轻量级虚拟化解决方案,docker运输的是“集装箱”:将各种应用程序和他们所依赖的运行环境打包成标准的container/image,但并不包含操作系统内核,可以发布到不同的平台上运行。

------------docker的安装与启动----------

实验主机:192.168.80.185(www.ae.com)

----配置YUM源,要有公网环境----

[www.ae.com@ ~]# vi /etc/yum.repos.d/docker.repo

[docker-repo]

name=Docker Repository

baseurl=https://yum.dockerproject.org/repo/main/centos/7/

enabled=1

gpgcheck=1

gpgkey=https://yum.dockerproject.org/gpg

[Local]

name=CentOS-$releasever - Base

baseurl=file:///mnt

enabled=1

gpgcheck=0

:wq

-----安装-----

yum install -y docker-engine

systemctl enable docker

systemctl start docker

------镜像操作-----

1.搜索镜像

docker search lamp

docker search lamp -f stars=10  //搜索星级是10的镜像

2.获取镜像

docker pull 名称

docker pull nickistre/centos-lamp

3.查看镜像信息

docker images

4.镜像导出成普通文件

docker save -o centos-lamp nickistre/centos-lamp         //docker save -o 存储的镜像名 仓库名

5.删除镜像

docker rmi nickistre/centos-lamp          //docker rmi 仓库名称  docker rmi 镜像ID

6.导入镜像

docker load < centos-lamp               //docker load < 导入的文件  docker load --input 导入的文件

docker tag centos centos:7              //给镜像增加多个标签名称

7.上传镜像到仓库

docker push 镜像名称             //没有注册私有仓库用户ID时,默认push到根目录下,这个目录普通用户并无权限仅限付费用户才能使用push功能!!!

8.镜像删除

docker rmi 镜像名称                                                  //镜像没有使用才能删除成功,且只是删除名称

docker rmi -f ID                                                      //永久删除

docker rmi -f $(docker images | grep "<none>" | awk "{print \$3}")     //删除所有没有使用的镜像

------------容器操作---------

1.创建容器,默认是没有运行的

docker create -it nickistre/centos-lamp /bin/bash     //docker create [选项] 镜像 运行的程序选项一般是-it,-i让容器的输入保持打开,-t让docker分配一个伪终端

docker ps -a                                       //查看所有容器运行情况,需要关注容器ID

docker ps                                         //查看运行中的容器

2.运行容器

docker start 13198d132fbe                          //docker start 容器ID或容器名字

docker run nickistre/centos-lamp /bin/bash -c ls /    //创建容器的同时启动并运行相关程序(这里运行了查看根目录的程序),命令完成容器就停止。

 

 

docker pause/unpause nickistre/centos-lamp        //暂停容器

docker stop nickistre/centos-lamp                  //停止容器

-----进入运行中的容器中,对容器做各种操作----

1.进入容器

docker exec -it 13198d132fbe /bin/bash            //docker exec -it 容器ID/名称 /bin/bash

2.将容器导出成文件

docker export 13198d132fbe > centoslampcont    

3.将容器文件生成镜像

cat centoslampcont | docker import - lamp:centos      //cat 文件名 | docker import - 生成的镜像名称:标签

----------以下是把导出的镜像文件变成容器,再次查看---------

docker create -it lamp:centos /bin/bash

docker start 7f5a7347922f

docker exec -it 7f5a7347922f /bin/bash    //进入容器查看是否是之前修改过的镜像文件

docker ps -a

docker rm d4e863a654aa                 //删除容器,删除之前先停止容器

docker rm -f d4e863a654aa              //强制删除运行中的容器,不建议!!!

--------------制作镜像----------

1.基于现有镜像制作

将原始镜像加入容器并运行-》在原始镜像中部署各种服务-》退出容器-》使用下面命令将容器生成新的镜像

格式:docker commit [选项] 容器ID/名称 仓库名称:[标签]    选项:-m:说明信息 -a:作者信息 -p:生成过程中停止容器运行

docker ps

docker commit -m "shuoming" -a "zuozhe" a6039f46ea03 docker:lamp6     

2.基于镜像模板创建

https://download.openvz.org/template/precreated/           //去公网环境下载基础镜像

cat centos-7-x86_64.tar.gz | docker import - centos:new      //下载的系统基础镜像模板来创建镜像,将生成的镜像载入容器就可以运行了。

3.基于dockerfile创建

mkdir apache

cd apache

vi Dockerfile

#基于的基础镜像为centos

FROM centos

#维护该镜像的用户信息

MAINTAINER The Centos Project<cloud-ops@centos.org>

#镜像操作指令安装apache软件包

RUN yum -y update

RUN yum -y install httpd

#开启80端口

EXPOSE 80

#复制网站首页文件

ADD index.html /var/www/html/index.html

#将执行脚本复制到镜像中

ADD run.sh /run.sh

RUN chmod 755 /run.sh

#启动容器时执行脚本

CMD ["/run.sh"]

:wq

vi run.sh

#!/bin/bash

rm -rf /run/httpd/*                          //清理httpd的缓存

exec /usr/sbin/apachectl -D FOREGROUND   //启动Apache服务

:wq

vi index.html

this is test docker

:wq

docker build -t httpd:centos .             //生成镜像

docker images查看

docker run -d -p 49180:80 httpd:centos  //将新生成的镜像加载到容器运行,-d守护进程运行,-p 实现从本地49180到80端口的映射(因为docker只支持NAT模式,所以需要端口映射)

http://192.168.80.185:49180            //访问容器的httpd服务

--------数据卷:供容器使用的特殊目录,实现数据在宿主机与容器之间的迁移----------

第一种:创建一个名为web的容器,并且创建两个数据卷/data1和/data2,并且如果同时有多个目录,最先创建的目录被挂载

docker run -d -v /data1 -v /data2 --name web -itd centos:new /bin/bash    

 

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

 

docker inspect 容器ID          //查看容器信息

 

第二种:centos:new镜像创建一个容器,创建容器的时候指定宿主机的目录挂载到容器中的个目录。

docker run -v /var/test:/data3 -v /data4 -itd centos:new /bin/bash       

 

测试:在宿主机机/var/test目录下新建一个t1文件,再查看容器中有没有t1文件生成,若有则证明挂载成功

 

因为创建时默认是可读可写的,所以在容器的挂载目录下可以读写

扩展实验:用centos:new镜像创建一个test容器,创建容器的时候指定宿主机的目录挂载到容器中的个目录,并且只读。

docker run -v /var/test:/data:ro --name test -itd centos:new /bin/bash  

 

发现不可写

---------数据卷容器-----用于不同的容器之间共享数据-----

1.创建数据卷容器

docker run -itd -v /datevo --name dbdata centos:new /bin/bash      //别名dbdata,数据卷挂载/datevo目录下

 

 

docker run -it --volumes-from dbdata --name db1 centos:new /bin/bash       //在新的容器db1中使用容器卷dbdata在数据卷目录中的文件操作会同步此容器db1不会启动!!!

 

 


发现操作同步,证明数据卷容器完成,不同容器之间可以共享数据

----------网络通信------

1.端口映射:将宿主机端口映射到容器中,外部网络访问宿主机的端口便可访问容器内的服务

docker run -d -p 49180:80 httpd:centos       //将镜像加载到容器运行,-d守护进程运行,-p 实现从本地49180到80端口的映射,这里49180端口是随便选的

在浏览器中测试……

http://192.168.80.185:49180                 //访问容器的httpd服务

--------容器间通信-------

yum install bridge-utils \

iptables-services

 

pkill docker

iptables -t nat -F

ifconfig docker0 down

brctl delbr docker0

service docker restart

--------以上是iptables相关报错的解决方法----

1.创建源容器

docker run -itd -P --name web1 centos7:new /bin/bash                      //创建并运行容器取名web1,端口号自动映射

2.创建接受容器

docker run -itd -P --name web2 --link web1:web1 centos7:new /bin/bash    //创建并运行容器取名web2,链接到web1和其通信

docker exec -it web1 /bin/bash              //进入容器web1查看IP

 

docker exec -it web2 /bin/bash             //进入容器web2 测试网络连通性,能ping通web1就成功了

 

 新人小白一枚,欢迎大家多多点评交流!