Docker:是对应用的虚拟化,共享了底层宿主机的操作系统内核,是一种标准的应用程序打包、部署方式
虚拟机技术:对整个操作系统的虚拟化,用于模拟完整的操作系统
Docker在centos上的安装,Ubuntu上的安装可以参考Docker官网给的安装教程
sudo yum install –y docker-io
启动docker
sudo systemctl start docker
搜索docker镜像
sudo docker search centos
获取镜像
sudo docker pull centos
查看镜像
sudo docker images
删除镜像
sudo docker rmi <镜像名称>
启动容器
sudo docker run --name –h hostname
列如启动一个‘Hello world’镜像为centos的docker容器
sudo docker run centos /bin/echo ‘Hello world’
启动自定义名称的docker容器,并进入到容器里面
sudo docker run --name mydocker -it centos /bin/bash
启动已经创建好的docker容器
sudo docker start <容器ID>
启动docker容器,并让其在后台运行
sudo docker run -d --name mynginx nginx
交互型容器:运行在前台,通常会指定有交互的控制台,可以给容器输入,也可以得到容器的输出
sudo docker run -it --name <容器名称> <镜像> /bin/bash
守护型容器:运行在后台,创建启动之后就与终端无关
sudo docker run -d --name <容器名称> <镜像> /bin/bash
获取容器PID
sudo docker inspect --format “{{.State.Pid}}” <容器ID/容器名称>
进去正在运行的容器,其中pid、net、ipc、mount、uts分别表示容器的进程、网络、消息、文件系统和主机名
sudo nsenter --target <容器PID> --mount --uts --ipc --net --pid
停止容器
sudo docker stop CONTAINER ID
查看当前正在运行的容器
sudo docker ps
查看所有容器,包括运行和停止的
sudo docker ps -a
查看最新创建的容器
sudo docker ps -l
查看最后创建的x个容器
sudo docker ps -n=x
删除容器
sudo rm CONTAINER ID
Docker没有提供一次性删除所有容器的命令,但是可以用下面的命令来实现这个目的
sudo docker rm ‘docker ps -a -q’
这个命令会用docker ps列出当前的所有容器,-a标志列出所有容器,-q标志只列出容器的ID,不包括容器的其他信息。然后将这个列表传给docker rm命令,依次删除容器
编写进入容器脚本in.sh
vim in.sh #!/bin/bash CNAME=$1 CPID=$(sudo docker inspect --format "{{.Status.Pid}}" $CNAME) sudo nsenter --target "$CPID" --mount --uts --ipc --net --pid
赋予脚本可执行权限
sudo chmod u+x in.sh
进入容器只需 ./in.sh <主机名>
查看网桥情况,可以看出网络中是有docker的网桥的
brctl show
查看防火墙规则,同样网络中含有docker的防火墙规则
sudo iptables -L
随机映射
sudo docker run -P
sudo docker run -d -P --name mynginx1 nginx
指定映射
sudo docker run -p hostPort:containerPort sudo docker run -p ip:hostPort:containerPort sudo docker run -p ip::containerPort sudo docker run -d -p 91:80 --name mynginx2 nginx
通过nginx在容器中部署静态网站
sudo docker run -it -p 80 --name web ubuntu /bin/bash root@425c7a0e6949:/# apt-get update root@425c7a0e6949:/# apt-get install nginx root@425c7a0e6949:/# apt-get install vim root@425c7a0e6949:/# mkdir -p /var/www/html root@425c7a0e6949:/# cd /var/www/html/ root@425c7a0e6949:/var/www/html# vim index.html root@425c7a0e6949:/var/www/html# whereis nginx nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx root@425c7a0e6949:/var/www/html# ls /etc/nginx/ root@425c7a0e6949:/var/www/html# ls /etc/nginx/sites-enabled/ root@425c7a0e6949:/var/www/html# vim /etc/nginx/sites-enabled/default(将root后的目录改为自己创建的静态网站的目录) root@425c7a0e6949:/var/www/html# cd root@425c7a0e6949:~# nginx root@425c7a0e6949:~# ps -ef
在宿主机查看正在运行的容器,可以看到容器映射的端口信息
sudo docker ps
也可以直接查看容器映射的端口号和容器内进程
sudo docker port web
sudo docker top web
可以在通过宿主机本地IP加上端口号查看所创建的网页,也可以直接通过容器IP查看,当然也可以在浏览器里面直接输入IP地址
curl http://127.0.0.1:<端口号> curl http://172.17.0.2
使用commit构建镜像
sudo docker commit <容器名称/容器ID> <镜像名称>
使用Dockerfile构建镜像
mkdir -p dockerfile/df_test1 cd dockerfile/df_test1 vim dockerfile #First dockerfile for test FROM ubuntu MAINTAINER(维护人信息) RUN apt-get update RUN apt-get install nginx EXPOSE 80 sudo docker build -t=<镜像名称>
Dockerfile的指令
# 后面跟着注释的内容
INSTRUCTION argument <指令以大写的指令名开头,后面跟指令的参数>
FROM <镜像名> (已经存在的镜像,也成为基础镜像,必须是Dockerfile中第一条非注释指令)
MAINTAINER <name> (指定镜像的作者信息,包含镜像的所有者和联系信息)
RUN <command>
EXPOSE <port> (指定该镜像运行的容器使用的端口)
Dockerfile构建过程
从基础镜像运行一个容器
执行一条指令,对容器作出修改
执行类似docker commit的操作,提交一个新的镜像层
再基于刚提交的镜像运行一个新的容器
执行Dockerfile中的下一条指令,直至所有指令执行完毕
commit构建镜像实例
对镜像进行升级 root@e8730dd51d57:/# apt-get update 安装网络工具 root@e8730dd51d57:/# apt-get install net-tools 安装Ping工具 root@e8730dd51d57:/# apt-get install iputils-ping sudo docker commit <容器ID> 名字/镜像
再用sudo docker images去查看可以发现多处了镜像
在另外一个终端中进入已经运行的容器
sudo docker attach <容器ID>
sudo docker exec -it <容器ID> /bin/bash
利用docker logs命令来查看容器日志,其中-f标志可以查看实时日志,-t标志可以日志产生的时间,也可以用--tail标志来指定查看日志的最后部分
sudo docker run -d --name logs ubuntu /bin/sh -c "while true;do echo Hello world;sleep 1;done" sudo docker logs -t logs sudo docker logs -f logs sudo docker logs -t -f --tail=0 logs
查看容器内进程
sudo docker top <容器名称>
查看docker守护进程
sudo ps -ef | grep docker
启动停止docker守护进程
sudo service docker start
sudo service docker stop
sudo service docker restart
修改docker0默认分配的ip地址
sudo ifconfig docker0 192.168.200.1 netmask 255.255.255.0 sudo service docker restart
添加虚拟网桥
sudo ovs-vsctl add-br br0 sudo ifconfig br0 192.168.100.1 netmask 255.255.255.0
更改docker守护进程的启动配置:
/etc/default/docker中添加DOCKER_OPTS值 -b=br0
拒绝所有容器间互联
/etc/default/docker中添加DOCKER_OPTS值 --icc=false,然后再用重启docker守护进程
sudo vim /ect/default/docker DOCKER_OPTS=”--icc=false” sudo service docker restart
允许特定容器间的连接
Docker守护进程的启动选项
--icc=false --iptables=true
--link 在容器启动时添加link
docker利用iptables中的机制,在icc=false时,阻断所有的docker容器间的访问,仅仅运行利用link选项配置的容器进行相互的访问
查看docker网络
sudo docker network ls
sudo docker network inspect <网络类型>
建立自己的网络
sudo docker network create --driver bridge mynet
让容器运行在自己创建的网络中
sudo docker run -it --network=mynet --name <容器名称> <镜像>
数据卷是经过特殊设计的目录,可以绕过联合文件系统,为一个或多个容器提供访问
数据卷的设计目的,在于数据的永久化,它完全独立于容器的生成周期,因此,docker不会在容器删除时删除其挂载的数据卷,也不会存在类似的垃圾手机机制,对容器引用的数据卷进行处理
数据卷的特点
(1)数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中
(2)数据卷可以在容器之间共享和重用
(3)可以对数据卷里的内容直接进行修改
(4)数据卷的变化不会影响镜像的更新
(5)卷会一直存在,即使挂载数据卷的容器已经被删除
为容器添加数据卷
在用docker run命令的时候,使用-v标记来添加一个数据卷。在一次run中多次使用可以挂载多个数据卷,下面加载一个卷到web容器上
sudo docker run -it --name web -v /web ubuntu /bin/bash
web是容器中的目录,目录不存在会重新创建
挂载一个主机目录作为数据卷
sudo docker run -it --name web -v /opt/web:/web ubuntu /bin/bash
为数据卷添加访问权限为只读
sudo docker run -it --name web -v /opt/web:/web:ro ubuntu /bin/bash
挂载一个宿主主机文件作为数据卷
sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
创建一个容器数据卷
sudo docker run -itd -v /logdata --name logdata ubuntu
在其他容器中挂载logdata容器的数据卷
sudo docker run -itd --name web1 --volumes-from logdata ubuntu udo docker run -itd --name web2 --volumes-from logdata ubuntu
备份
sudo docker run --volumes-from logdata -v /containet_backup:/backup ubuntu tar cvf /backup/backup.tar /data
恢复
先创建一个数据卷
sudo docker run -v /data --name logdata2 ubuntu
再将备份文件恢复到这个数据卷容器
sudo docker run --volumes-from logdata2 -v /container_backup:/backup ubuntu tar xvf /backup/backup.tar
最后启动一个容器挂载验证/data目录数据恢复成功
sudo docker run -itd --volumes-from logdata2 --name web_recover ubuntu
迁移容器和镜像
先创建测试容器
sudo docker exec web touch /opt/test.txt
sudo docker exec web ls /opt
执行导出
sudo docker export web > web.tar
执行导入
cat web.tar | sudo docker import - web:v2
启动容器
sudo docker run -itd --name web_v2 web:v2 /bin/bash
进入容器查看
sudo docker exec web_v2 ls /opt
导出
sudo docker save web > web.tar
导入
sudo docker load < web.tar