Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。 Docker
可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低
Web 应用的自动化打包和发布。
自动化测试和持续集成、发布。在服务型环境中部署和调整数据库或其他的后台应用。 从头编译或者扩展现有的OpenShift或Cloud
Foundry平台来搭建自己的PaaS环境
1、简化程序:
Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是
Docker的最大优势,过去需要用数天乃至数周的 任务,在Docker容器的处理下,只需要数秒就能完成。2、避免选择恐惧症:
如果你有选择恐惧症,还是资深患者。Docker 帮你 打包你的纠结!比如 Docker 镜像;Docker 镜像中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如
Hadoop 集群、消息队列等等都可以打包成一个镜像部署。3、节省开支:
一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式
实验环境:
物理机:172.25.41.250
docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm
docker-engine-selinux-17.03.1.ce-1.el7.centos.noarch.rpm
[root@foundation41 Desktop]# yum install -y docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm docker-engine-selinux-17.03.1.ce-1.el7.centos.noarch.rpm
[root@foundation41 Desktop]# systemctl start docker
[root@foundation41 Desktop]# docker info #查看信息
[root@foundation41 Desktop]# docker version
[root@foundation41 Desktop]# mkdir /var/www/html/images
[root@foundation41 Desktop]# mv game2048.tar /var/www/html/images
[root@foundation41 Desktop]# cd /var/www/html/images
[root@foundation41 images]# ls
game2048.tar
[root@foundation41 images]# docker load -i game2048.tar #加载镜像
[root@foundation41 Desktop]# docker run -d --name vm1 game2048
#-d打入后台
# --name表示为这个容器起的名字是vm1
[root@foundation41 images]# docker inspect vm1 #查看容器vm1
[root@foundation41 images]# ip addr
docker run -it --name vm1 ubuntu bash # 创建容器
docker ps -a #查看容器状态
docker attach vm1 #连接容器
docker top vm1 #查看容器进程
docker logs vm1 #查看容器指令输出 -f 参数可以实时查看
docker inspect vm1 #查看容器详情
docker stats vm1 #查看容器资源使用率
docker diff vm1 #查看容器修改
docker run -d --name vm1 ubuntu bash -c "while true; do echo westos; sleep 1; done" #后台运行
docker stop vm1 #停止容器
docker start vm1 #启动容器
docker kill vm1 # 强制干掉容器
docker restart vm1 #重启容器
docker pause/unpause vm1 #暂停/恢复容器
docker rm vm1 #删除容器
docker export vm1 > vm1.tar #导出容器
docker import vm1.tar image #导入容器为镜像 image
镜像用来创建容器,是容器的只读模板,默认可以从 docker hub 上下载。docker 的镜像是增量修改,每次创建新的镜像都会在父镜像上构建一个增量的层,基于 AUFS 技术。
[root@foundation41 docker]# docker ps -a
[root@foundation41 docker]# docker stop vm3
[root@foundation41 docker]# docker rm vm3
[root@foundation41 docker]# docker rmi nginx
[root@foundation41 docker]# docker images nginx
[root@foundation41 docker]# docker images |grep nginx
[root@foundation41 docker]# docker search nginx #查询镜像
[root@foundation41 docker]# docker search nginx
[root@foundation41 docker]# docker ps -a
[root@foundation41 docker]# mv /var/www/html/images/nginx.tar .
[root@foundation41 docker]# docker ps -a
[root@foundation41 docker]# docker load -i nginx.tar
[root@foundation41 docker]# docker run -d --name vm2 nginx #命名为vm2
[root@foundation41 docker]# docker inspect vm2 #查看网页访问IP
[root@foundation41 docker]# cd
[root@foundation41 ~]# vim index.html
[root@foundation41 ~]# cat index.html
www.westos.org
[root@foundation41 ~]# docker cp index.html vm2:/usr/share/nginx/html/
[root@foundation41 ~]# vim index.html
[root@foundation41 ~]# cat index.html
www.westos.org
[root@foundation41 ~]# docker cp index.html vm2:/usr/share/nginx/html/
远程挂载
[root@foundation41 ~]# cd /tmp/
[root@foundation41 tmp]# mkdir docker
[root@foundation41 tmp]# cd docker/
[root@foundation41 docker]# mkdir web/
[root@foundation41 docker]# cd
[root@foundation41 ~]# mv index.html /tmp/docker/web/
[root@foundation41 ~]# docker stop vm2
[root@foundation41 ~]# docker rm vm2
[root@foundation41 ~]# docker run -d --name vm2 -v /tmp/docker/web/:/usr/share/nginx/html nginx #挂载时,必须要停止镜像,删除镜像,否则会报错
[root@foundation41 ~]# docker inspect vm2
[root@foundation41 ~]# cd /tmp/docker/web/
[root@foundation41 web]# vim index.html
[root@foundation41 web]# cat index.html
hello a
[root@foundation41 web]# docker save nginx > nginx.tar
网页再次访问:就可以看到文件中编辑的内容
这样就实现了远程挂载现象
docker run 在创建容器时使用 -v 参数可以挂载一个或多个数据卷到当前运行的容器中,
-v的作用是将宿主机上的目录作为容器的数据卷挂载到容器中,使宿主机和容器之间可以共
享一个目录。
[root@foundation41 web]# docker ps -a
[root@foundation41 web]# docker stop vm1
[root@foundation41 web]# docker stop vm2
[root@foundation41 web]# docker rm vm2
[root@foundation41 web]# docker rm vm1
[root@foundation41 web]# docker ps -a
[root@foundation41 Desktop]# docker load -i rhel7.tar
[root@foundation41 ~]# docker run -it --name vm1 -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro -v /etc/yum.repos.d/rhel-dvd.repo:/etc/yum.repos.d/rhel-dvd.repo:ro rhel7 bash #挂载宿主机
bash-4.2# cd /
bash-4.2# ls
bin data1 dev home lib64 mnt proc run srv tmp var
boot data2 etc lib media opt root sbin sys usr
bash-4.2# cd /etc/yum.repos.d/
bash-4.2# ls
rhel-dvd.repo rhel7.repo
bash-4.2# cat rhel-dvd.repo
[rhel-dvd]
name="Remote classroom copy of dvd"
baseurl=file:///var/www/html/source7.3
gpgcheck=0
bash-4.2# cd /data2/
bash-4.2# ls
bash-4.2# touch file1
touch: cannot touch 'file1': Read-only file system
bash-4.2# cd /data1/
bash-4.2# touch file1
1.添加独立卷
root@foundation41 ~]# docker run -d --name vm2 -v /usr/share/nginx/html nginx
[root@foundation41 ~]# docker inspect vm2 |grep vol
"Type": "volume",
"Source": "/var/lib/docker/volumes/25032c212664fb0aed24a48088e09839a06f734a4d12d157994ea3eaaff4345b/_data", #来源
[root@foundation41 ~]# cd /var/lib/docker/volumes/25032c212664fb0aed24a48088e09839a06f734a4d12d157994ea3eaaff4345b/_data
[root@foundation41 _data]# ls
50x.html index.html
2.删除独立卷
vm2
[root@foundation41 ~]# docker ps -a
[root@foundation41 ~]# docker stop vm2
[root@foundation41 ~]# docker rm vm2
[root@foundation41 ~]# docker volume rm 25032c212664fb0aed24a48088e09839a06f734a4d12d157994ea3eaaff4345b #删除vm2独立卷
[root@foundation41 ~]# cd -
vm1
[root@foundation41 ~]# docker stop vm1
[root@foundation41 ~]# docker rm vm1
[root@foundation41 ~]# docker volume rm 17dd941ce05d840b5b0b94c973835a538cf72a674c10b25660f8e742052aa77a #删除vm1独立卷
[root@foundation41 ~]# docker volume ls #查看独立卷
[root@foundation41 ~]# docker volume rm `docker volume ls -q` #删除独立卷
[root@foundation41 ~]# docker volume ls
[root@foundation41 Desktop]# docker load -i ubuntu.tar
[root@foundation41 web]# docker start vm1
[root@foundation41 web]# docker ps
[root@foundation41 web]# docker inspect vm1 |grep Pid
[root@foundation41 tmp]# cd /proc/
[root@foundation41 proc]# cd 19235/
[root@foundation41 19235]# ls
[root@foundation41 19235]# cd
[root@foundation41 ~]# docker stop vm1
[root@foundation41 ~]# brctl show
[root@foundation41 docker]# docker rm -f `docker ps -aq`
[root@foundation41 docker]# docker ps -a
[root@foundation41 docker]# docker run -d --name vm1 nginx -p 8080:80 nginx
[root@foundation41 docker]# docker ps -a
[root@foundation41 docker]# docker rm vm1
[root@foundation41 docker]# docker run -d --name vm1 -p 8080:80 nginx
[root@foundation41 docker]# iptables -t nat -nL
[root@foundation41 docker]# docker run -it --name vm2 --link vm1:nginx ubuntu
root@b7d2810c24b0:/# cat /etc/hosts
root@15d2503c8492:/# ping nginx
1·封装阿帕奇
[root@foundation41 ~]# docker stop vm3
[root@foundation41 ~]# docker rm vm3
[root@foundation41 ~]# docker run -it --name vm3 rhel7 bash
bash-4.2# cd /etc/yum.repos.d/
bash-4.2# vi dvd.repo
bash-4.2# cat dvd.repo
[dvd]
name=rhel7.3
baseurl=http://172.25.41.250/source7.3
gpgcheck=0
bash-4.2# yum repolist
bash-4.2# yum install -y httpd
[root@foundation41 Desktop]# cd /tmp/docker/
[root@foundation41 docker]# vim Dockerfile
FROM rhel7 # 源镜像是rhel7,最好将名为rhel7的镜像放在本地
ENV HOSTNAME server1 #定义hostname为server1
MAINTAINER westos@westos.org #定义邮箱
EXPOSE 80 #定义端口为80
COPY dvd.repo /etc/yum.repos.d/dvd.repo #配置yum源
RUN rpmdb --rebuilddb && yum install -y httpd && yum clean all
# 执行命令安装httpd并清除yum缓存
# rpmdb 命令用于初始化和重建rpm数据库
# --rebuilddb:从已安装的包头文件,反向重建RPM数据库
VOLUME ["/var/www/html"] # 数据卷所在的位置
CMD ["/usr/sbin/httd", "-D", "FOREGROUND"]
## 打开apach服务
# -D 是全局文件/etc/sysconfig/httpd中的打开参数
[root@foundation41 docker]# vim dvd.repo
[dvd]
name=rhel7
baseurl=http://172.25.41.250/source7.3
gpgcheck=0
[root@foundation41 docker]# docker build -t rhel7:v1 . # rhel:v1是自己封装的镜像的名称和版本号
2·封装一个带有ssh服务
[root@foundation41 docker]# mkdir ssh/
[root@foundation41 docker]# cd ssh
[root@foundation41 ssh]# vim Dockerfile
vim Dockerfile
FROM rhel7
ENV HOSTNAME server2
MAINTAINER westos@westos.com
EXPOSE 22 # 对外端口是22
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN rpmdb --rebuilddb && yum install -y openssh-server && yum install -y openssh-clients yum clean all && ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" && ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N "" && ssh-keygen -q -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N "" && echo root:redhat | chpasswd
CMD ["/usr/sbin/sshd","-D"]
[root@foundation41 ssh]# vim dvd.repo
[dvd]
name=rhel7
baseurl=http://172.25.41.250/source7.3
gpgcheck=0
[root@foundation41 docker]# docker build -t rhel7:v2 .
3·利用supervisord一次封装多个服务
[root@foundation41 docker]# pwd
/tmp/docker
[root@foundation41 docker]# cat Dockerfile
FROM rhel7
EXPOSE 80 22
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN rpmdb --rebuilddb && yum install -y httpd openssh-server openssh-clients supervisor && yum clean all && ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" && ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N "" && ssh-keygen -q -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N "" && echo root:westos | chpasswd
COPY supervisord.conf /etc/supervisord.conf
CMD ["/usr/bin/supervisord"]
[root@foundation41 docker]# cat supervisord.conf
[supervisord]
nodaemon=true
[program:sshd]
command=/usr/sbin/sshd -D #打开sshd服务
[program:httpd]
command=/usr/sbin/httpd #打开httpd服务
[root@foundation41 docker]# docker build -t rhel7:v3 .
[root@foundation41 docker]# docker run -d --name vm1 -v /tmp/docker/web:/var/www/html rhel7:v3
[root@foundation41 docker]# docker ps
[root@foundation41 docker]# curl 172.17.0.2
[root@foundation41 docker]# ssh -l root 172.17.0.2
ENTRYPOINT 容器启动后执行的命令,让容器执行表现的像一个可执行程序一样,与CMD 的 区 别 是 不 可 以 被 docker run 覆 盖 , 会 把 docker run 后 面 的 参 数 当 作 传 递 给ENTRYPOINT 指令的参数。Dockerfile 中只能指定一个 ENTRYPOINT,如果指定了很多,只 有 最 后 一 个 有 效 。 docker run 命 令 的 -entrypoint 参 数 可 以 把 指 定 的 参 数 继 续 传 递 给ENTRYPOINT。
(1)
[root@foundation41 docker]# cd /tmp/docker/
[root@foundation41 docker]# mkdir test
[root@foundation41 docker]# cd test/
[root@foundation41 test]# vim Dockerfile
[root@foundation41 test]# cat Dockerfile
FROM rhel7
CMD echo "hello world!"
[root@foundation41 test]# docker build -t rhel7:v4 .
[root@foundation41 test]# docker run --rm rhel7:v4
hello world!
[root@foundation41 test]# docker run --rm rhel7:v4 echo westos
westos
(2)
[root@foundation41 test]# docker rmi rhel7:v4
[root@foundation41 test]# vim Dockerfile
[root@foundation41 test]# cat Dockerfile
FROM rhel7
ENTRYPOINT ["/bin/echo","hello"]
CMD ["world"]
[root@foundation41 test]# docker build -t rhel7:v4 .
[root@foundation41 test]# docker run --rm rhel7:v4
hello world
[root@foundation41 test]# docker run --rm rhel7:v4 westos
hello westos
(3)
[root@foundation41 test]# docker rmi rhel7:v4
[root@foundation41 test]# vim Dockerfile
[root@foundation41 test]# cat Dockerfile
FROM rhel7
ENV name westos
ENTRYPOINT echo "hello $name"
[root@foundation41 test]# docker build -t rhel7:v4 .
[root@foundation41 test]# docker run --rm rhel7:v4
hello westos
[root@foundation41 test]# docker run --rm rhel7:v4 westos
hello westos