Docker是基于Go语言实现的云开源项目,诞生于2013年初,最初发起者是dotCloud公司。Docker自开源后就受到广泛的关注和讨论,目前已有多个相关项目,逐渐形成了围绕Docker的生态体系。dotCloud公司后来也改名为Docker Inc,专注于Docker相关技术和产品的开发
Docker 特征
Docker有不少有趣的功能,通过本教程相信你会更好地理解它们。Docker的特性主要包括以下几点:
速度飞快以及优雅的隔离框架
物美价廉
CPU/内存的低消耗
快速开/关机
跨云计算基础构架
从浏览器下载 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@foundation25 kiosk]# yum install 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@foundation25 kiosk]# systemctl start docker.service
[root@foundation25 kiosk]# docker version #可以查看到版本号
容器启动时,将被分配一个随机的私有IP,其它容器可以使用这个IP地址与其进行通讯。这点非常重要,原因有二:一是它提供了容器间相互通信的渠道,二是容器将共享一个本地网络。
运行容器常用参数
-i 表示“交互模式”,常和-t一起用
-t 表示容器启动后进入其命令行
-v 表示容器挂载存储卷,挂载容器的某个目录
-d 表示在后台运行容器
-p 表示端口映射;host port:container port
-e 表示设置环境变量
--name 后面跟容器名,为容器命名
--rm 表示容器退出后自动删除容器
示例:
# 下载一个game2048.tar包,导入docker,作为镜像
[root@foundation25 kiosk]# docker load < game2048.tar
# 创建并运行容器
[root@foundation25 kiosk]# docker run -d --name vm1 game2048 #-d为打入后台
# 查看ip
[root@foundation25 kiosk]# docker inspect vm1
ip为172.17.0.2
在浏览器访问172.27.0.2
访问www.aliyun.com
在阿里云注册一个帐号,找到容器镜像服务—>镜像加速器
按照图上的步骤
# 编写daemon.json文件
[root@foundation25 kiosk]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://36k6eb6k.mirror.aliyuncs.com"]
}
# 重新加载
[root@foundation25 kiosk]# systemctl daemon-reload
# 重启服务
[root@foundation25 kiosk]# systemctl restart docker.service
[root@foundation25 kiosk]# mkdir /tmp/docker
[root@foundation25 kiosk]# cd /tmp/docker/
# 拉取服务(主机需要联网)
[root@foundation25 docker]# docker pull nginx
# 建立发布文件
[root@foundation25 docker]# mkdir web
[root@foundation25 docker]# cd web/
[root@foundation25 web]# vim index.html
www.redhat.com
[root@foundation25 web]# docker run -d --name vm2 -v /tmp/docker/web/:/usr/share/nginx/html nginx #挂载
[root@foundation25 web]# docker inspect vm2 #查看ip
浏览器访问172.17.0.2(vm1被关闭,资源会被释放,此ip可以重新分配)
[root@foundation25 web]# docker run -it --name vm3 -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro rhel7 bash #/data2为只读挂载
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 /data1
bash-4.2# touch file
bash-4.2# ls
file
bash-4.2# cd /data2
bash-4.2# touch file1
touch: cannot touch 'file1': Read-only file system #权限受限
# 在主机建立
[root@foundation25 data2]# touch file1
# 在容器内查看(/data2目录下)
bash-4.2# ls
file1
数据卷让你可以不受容器生命周期影响进行数据持久化。它们表现为容器内的空间,但实际保存在容器之外,从而允许你在不影响数据的情况下销毁、重建、修改、丢弃容器。Docker允许你定义应用部分和数据部分,并提供工具让你可以将它们分开。使用Docker时必须做出的最大思维变化之一就是:容器应该是短暂和一次性的。
[root@foundation25 data2]# docker create --name datavol -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro rhel7 bash #创建数据卷
[root@foundation25 data2]# docker run -it --name vm4 --volumes-from datavol rhel7 bash #创建容器
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 /data1
bash-4.2# ls
file
bash-4.2# cd /data2
bash-4.2# ls
file1
–rm表示运行后删除
[root@foundation25 ~]# docker run --rm -v /tmp/backup/:/backup ubuntu tar cf /backup/etc.tar /etc
# 容器已经被删,在主机查看
[root@foundation25 ~]# cd /tmp/backup/
[root@foundation25 backup]# ls
etc.tar
1)桥接模式
# 当没有docker开启
[root@foundation25 backup]# brctl show
#开启vm3
[root@foundation25 backup]# docker start vm3
[root@foundation25 backup]# brctl show
没有开启时:
开启时:
2)host模式
与本机一样,可用ip addr测试,对比一下
[root@foundation25 docker]# docker run -it --name vm3 --net host ubuntu
root@foundation25:/# ip addr
3)容器模式
与某个容器模式相同,可用ip addr测试,对比
[root@foundation25 data2]# docker run -it --name vm2 --net container:vm4 ubuntu # 建立与vm4相同的模式
root@331801f4ff57:/# ip addr
[root@foundation25 data2]# docker run -it --name vm1 --net none
ubunturoot@b78d2af2da19:/# ip addr
# 获取Pid
[root@foundation25 ~]# docker inspect vm1 | grep Pid
"Pid": 17049,
"PidMode": "",
"PidsLimit": 0,
[root@foundation25 ~]# cd /proc/17049/
[root@foundation25 17049]# cd ns
[root@foundation25 ns]# ip netns add test
[root@foundation25 ns]# cd /var/run/netns/
[root@foundation25 netns]# ls
test
[root@foundation25 netns]# ip netns del test
# 建立软连接
[root@foundation25 netns]# ln -s /proc/17049/ns/net /run/netns/17049
# 添加虚拟网卡veth0和veth1
[root@foundation25 netns]# ip link add name veth0 type veth peer name veth1
[root@foundation25 netns]# ip addr
# 将veth0与主机绑定
[root@foundation25 netns]# brctl addif docker0 veth0
[root@foundation25 netns]# ip addr
# 设置为up状态
[root@foundation25 netns]# ip link set up veth0
[root@foundation25 netns]# ip link set up veth1
[root@foundation25 netns]# ip addr
# veth1与容器绑定
[root@foundation25 netns]# ip link set veth1 netns 17049
root@b78d2af2da19:/# ip addr
# 更改名称
[root@foundation25 netns]# ip netns exec 17049 ip link set veth1 name eth0
root@b78d2af2da19:/# ip addr
# 状态设置为up
[root@foundation25 netns]# ip netns exec 17049 ip link set up dev eth0
# 添加ip
[root@foundation25 netns]# ip netns exec 17049 ip addr add 172.17.0.25/24 dev eth0
# 添加网关
[root@foundation25 netns]# ip netns exec 17049 ip route add default via 172.17.0.1
# 在容器内,可访问外网
root@b78d2af2da19:/# ping baidu.com
要开启容器间通讯,Docker允许你在创建一个新容器时引用其它现存容器,在你刚创建的容器里被引用的容器将获得一个(你指定的)别名。我们就说,这两个容器链接在了一起。
[root@foundation25 data2]# docker run -d --name vm1 nginx
[root@foundation25 data2]# docker run -it --name vm2 --link vm1:nginx ubuntu
root@a04d53f5d3c3:/# ls
root@a04d53f5d3c3:/# ping nginx
编写Dockerfile,指令有:
1.FROM(第一条指令必须为FROM):指定基础镜像
2.MAINTAINER:指定作者信息
3.RUN:指定需要运行的命令
4.CMD:容器启动命令,与run相似
5.EXPOSE:暴露端口
6.ENV :为后续的run提供环境变量
7.COPY:复制文件
8.ADD:更高级的复制文件,在copy上增加了一些功能
9.ENTRYPOINT:在指定容器启动程序及参数,目的与CMD一样
10.VOLUME:定义匿名卷
11.USER:指定当前用户
12.WOEKDIR:指定工作目录
13.ONBUILD:后面跟其他指令
编写完成Dockerile之后,可以通过docker build 命令来创建镜像。
基本的格式为docker build[ 选项]路径,该命令将读取指定路径下(包括子目录)的Dockerfile,并将该路径下所有内容发送给Docker服务端,由服务端来创建镜像。因此一般建议放置Dockerfile的目录为空目录。
另外,可以通过.dockerignore文件(每一行添加一条匹配模式)来让Docker忽略路径下的目录和文件。
要指定镜像的标签信息,可以通过一t选项
例1:httpd
[root@foundation25 data2]# cd /tmp/docker/
[root@foundation25 docker]# vim Dockerfile
FROM rhel7
ENV HOSTNAME server1
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN rpmdb --rebuilddb && yum install -y httpd && yum clean all
VOLUME ["/var/www/html"]
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
[root@foundation25 docker]# docker build -t rhel7:v1 .
[root@foundation25 docker]# docker images rhel7
[root@foundation25 docker]# docker run -d --name vm4 -v /tmp/docker/web/:/var/www/html rhel7:v1
中间省略。。。
查看ip
浏览器访问172.17.0.3
例2:ssh
[root@foundation25 docker]# mkdir ssh
[root@foundation25 docker]# cd ssh/
[root@foundation25 ssh]# cp ../Dockerfile .
[root@foundation25 ssh]# ls
Dockerfile
[root@foundation25 ssh]# cp ../dvd.repo .
[root@foundation25 ssh]# vim Dockerfile
FROM rhel7
ENV HOSTNAME server2
EXPOSE 22
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN rpmdb --rebuilddb && yum install -y openssh-server 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@foundation25 ssh]# docker build -t rhel:v2 .
[root@foundation25 ssh]# docker run -d --name vm5 rhel7:v2
[root@foundation25 ssh]# docker ps