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就成功了
新人小白一枚,欢迎大家多多点评交流!