docker入门(1)

Docker是基于Go语言实现的云开源项目,诞生于2013年初,最初发起者是dotCloud公司。Docker自开源后就受到广泛的关注和讨论,目前已有多个相关项目,逐渐形成了围绕Docker的生态体系。dotCloud公司后来也改名为Docker Inc,专注于Docker相关技术和产品的开发
Docker 特征
Docker有不少有趣的功能,通过本教程相信你会更好地理解它们。Docker的特性主要包括以下几点:
速度飞快以及优雅的隔离框架
物美价廉
CPU/内存的低消耗
快速开/关机
跨云计算基础构架

1.安装docker

从浏览器下载 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  #可以查看到版本号

docker入门(1)_第1张图片
docker入门(1)_第2张图片

镜像与容器

容器启动时,将被分配一个随机的私有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

docker入门(1)_第3张图片

# 创建并运行容器
[root@foundation25 kiosk]# docker run -d --name vm1 game2048  #-d为打入后台
# 查看ip
[root@foundation25 kiosk]# docker inspect vm1

这里写图片描述
ip为172.17.0.2
docker入门(1)_第4张图片
在浏览器访问172.27.0.2
docker入门(1)_第5张图片

从网上拉取镜像

访问www.aliyun.com
在阿里云注册一个帐号,找到容器镜像服务—>镜像加速器
docker入门(1)_第6张图片
按照图上的步骤

# 编写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

这里写图片描述
docker入门(1)_第7张图片

# 建立发布文件
[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可以重新分配)
docker入门(1)_第8张图片

只读挂载

[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入门(1)_第9张图片
这里写图片描述
这里写图片描述
docker入门(1)_第10张图片

数据卷

数据卷让你可以不受容器生命周期影响进行数据持久化。它们表现为容器内的空间,但实际保存在容器之外,从而允许你在不影响数据的情况下销毁、重建、修改、丢弃容器。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

这里写图片描述
docker入门(1)_第11张图片

–rm

–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

docker入门(1)_第12张图片

docker四种网络方式

1)桥接模式

# 当没有docker开启
[root@foundation25 backup]# brctl show

#开启vm3
[root@foundation25 backup]# docker start vm3 
[root@foundation25 backup]# brctl show

没有开启时:
docker入门(1)_第13张图片
开启时:
docker入门(1)_第14张图片
2)host模式
与本机一样,可用ip addr测试,对比一下

[root@foundation25 docker]# docker run -it --name vm3 --net host ubuntu
root@foundation25:/# ip addr

docker入门(1)_第15张图片

3)容器模式
与某个容器模式相同,可用ip addr测试,对比

[root@foundation25 data2]# docker run -it --name vm2 --net container:vm4 ubuntu   # 建立与vm4相同的模式
root@331801f4ff57:/# ip addr

docker入门(1)_第16张图片
4)none模式
可自行添加ip

[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入门(1)_第17张图片
这里写图片描述
docker入门(1)_第18张图片
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
docker入门(1)_第19张图片
这里写图片描述
docker入门(1)_第20张图片
这里写图片描述
docker入门(1)_第21张图片
这里写图片描述
这里写图片描述
ping baidu.com
docker入门(1)_第22张图片

容器互联

要开启容器间通讯,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

docker入门(1)_第23张图片

使用Dockerfile创建镜像

编写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

docker入门(1)_第24张图片
中间省略。。。
docker入门(1)_第25张图片
docker入门(1)_第26张图片
docker入门(1)_第27张图片
这里写图片描述
查看ip
docker入门(1)_第28张图片
浏览器访问172.17.0.3
docker入门(1)_第29张图片
例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

docker入门(1)_第30张图片
Dockerfile内容:
docker入门(1)_第31张图片
docker入门(1)_第32张图片
docker入门(1)_第33张图片
docker入门(1)_第34张图片

你可能感兴趣的:(docker入门(1))