一.Docker
Docker 是一个开源的应用容器引擎,主要利用 linux 内核 namespace 实现沙盒隔离,用cgroup 实现资源限制。让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。由于其基于LXC的轻量级虚拟化的特点,docker相比KVM之类最明显的特点就是启动快,资源占用小。docker能够只加载每个container变化的部分,这样资源占用小,能够在单机环境下与KVM之类的虚拟化方案相比能够更加快速和占用更少资源。隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库。Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用。和宿主机共用一部分资源,内核要求在3.10以上。
docker容器是docker镜像的实例化,docker容器开启方便,即创即用,随着要求进行删除添加。国内有很多容器云服务服务商:华为云,阿里云,时速云,腾讯云。近几年云服务是大热门,几乎各大厂商都有参与。镜像用来创建容器,是容器的只读模板,默认可以从 docker hub 上下载。docker 的镜像是增量修改,每次创建新的镜像都会在父镜像上构建一个增量的层,基于 AUFS 技术。
二.容器管理
1.docker的安装(用的rhel7.3的yum源)
下载docker以及相关依赖
yum install -y *
container-selinux-2.21-1.el7.noarch.rpm
docker-ce-18.06.1.ce-3.el7.x86_64.rpm
libsemanage-2.5-8.el7.x86_64.rpm
libsemanage-python-2.5-8.el7.x86_64.rpm
pigz-2.3.4-1.el7.x86_64.rpm
policycoreutils-2.5-17.1.el7.x86_64.rpm
policycoreutils-python-2.5-17.1.el7.x86_64.rpm
启动docker
systemctl start docker
查看当前docker信息
[root@server6 docker]# docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 18.06.1-ce
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 468a545b9edcd5932818eb9de8e72413e616e86e
runc version: 69663f0bd4b60df09991c08812a60108003fa340
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-514.el7.x86_64
Operating System: Red Hat Enterprise Linux Server 7.3 (Maipo)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 992.7MiB
Name: server6
ID: WGDT:45ZS:F53A:2KVR:35ZJ:Z6RL:WDBZ:MGF2:2Z7O:5AET:RGWD:24UD
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
2.内核要求3.10以上
[root@server6 docker]# uname -r
3.10.0-514.el7.x86_64
3.容器的基本操作
(1)导入镜像,创建容器
docker load -i 镜像的tar包
[root@server6 images]# docker load -i ubuntu.tar
56abdd66ba31: Loading layer 196.8MB/196.8MB
9468150a390c: Loading layer 208.9kB/208.9kB
11083b444c90: Loading layer 4.608kB/4.608kB
5f70bf18a086: Loading layer 1.024kB/1.024kB
Loaded image: ubuntu:latest
[root@server6 images]# docker load -i rhel7.tar
e1f5733f050b: Loading layer 147.1MB/147.1MB
[root@server6 images]# docker load -i nginx.tar
014cf8bfcb2d: Loading layer 58.46MB/58.46MB
832a3ae4ac84: Loading layer 53.91MB/53.91MB
e89b70d28795: Loading layer 3.584kB/3.584kB
Loaded image: nginx:latest
(2)docker images ##查看本地镜像
[root@server6 images]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest e548f1a579cf 12 months ago 109MB
ubuntu latest 07c86167cdc4 2 years ago 188MB
rhel7 latest 0a3eb3fde7fd 4 years ago 140MB
创建ubuntu (-it 交互式)
[root@server6 images]# docker run -it --name vm1 ubuntu
root@50cbbef57bb9:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
##启动容器,没启动加 docker ps -a查看
[root@server6 images]# docker start vm1
vm1
[root@server6 images]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
50cbbef57bb9 ubuntu "/bin/bash" 3 minutes ago Up 2 seconds vm1
##进入这个容器
[root@server6 images]# docker container attach vm1
root@50cbbef57bb9:/#
root@50cbbef57bb9:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
##退出容器不关闭容器crtl+p+q
##退出容器关闭容器crtl+d+q
(3)基于nginx镜像创建容器
[root@server6 images]# docker run -d nginx
a274e9248f699a4da9dda45111923d499890d9a177ba06395a683a4b7a372559
[root@server6 images]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a274e9248f69 nginx "nginx -g 'daemon of…" 5 seconds ago Up 4 seconds 80/tcp pensive_goldwasser
50cbbef57bb9 ubuntu "/bin/bash" 15 minutes ago Up 3 minutes vm1
(4)创建容器的发布文件,把发布文件复制到容器
[root@server6 images]# cd /tmp/
[root@server6 tmp]# ls
[root@server6 tmp]# mkdir docker
[root@server6 tmp]# cd docker/
[root@server6 docker]# vim index.html
[root@server6 docker]# cat index.html
server6
[root@server6 docker]# docker container cp index.html a2:/usr/share/nginx/html
(4)docker inspect a2 ##查看容器详情
[root@server6 docker]# docker inspect a2 ##a2是nginx的id前两位,也可以输全id
.....中间省略一部分.....
"NetworkID": "60dca791efa06c41630b0df5e7b17d3b7b5fb7924be4ff8274923406b7a954e2",
"EndpointID": "0ec953ef240ebd502e80289c7b329bc0ae09a04b1e7c7d9e9c628ea4e3454e51",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:03",
"DriverOpts": null
}
}
}
}
]
[root@server6 images]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a274e9248f69 nginx "nginx -g 'daemon of…" 5 seconds ago Up 4 seconds 80/tcp pensive_goldwasser
50cbbef57bb9 ubuntu "/bin/bash" 15 minutes ago Up 3 minutes vm1
(5)测试
[root@server6 docker]# curl 172.17.0.3
server6
相关命令
docker top vm1 ##查看容器进程
docker logs vm1 ##查看容器指令输出
docker stats vm1 ##查看容器资源使用率
docker diff vm1 ##查看容器修改
docker stop vm1 ##停止容器
docker start vm1 启动容器
docker kill vm1 强制干掉容器
docker restart vm1 重启容器
docker pause/unpause vm1 暂停/恢复容器
docker rm -f vm1 删除容器
docker export vm1 > vm1.tar ##导出容器
4.容器的四种网络模式
bridge 桥接模式、host 模式、container 模式和 none 模式。启动容器时可以使用 --net 参数指定,默认是桥接模式。bridge桥接模式: Docker Container 在使用时,并非为开发者包办了一切。最明显的是,该模式下 Docker Container 不具有一个公有 IP,即和宿主机的 eth0 不处于同一个网段。导致的结果是宿主机以外的世界不能直接和容器进行通信。
host 模式:bridge 桥接模式很好的补充。采用 host 模式的 Docker Container,可以直接使用宿主机的 IP 地址与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公有 IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换。
[root@server6 docker]# docker run -it --name vm1 --net host ubuntu
root@server6:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
root@server6:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:f0:ae:21 brd ff:ff:ff:ff:ff:ff
inet 172.25.21.6/24 brd 172.25.21.255 scope global ens3
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fef0:ae21/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:7a:bd:3d:71 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:7aff:febd:3d71/64 scope link
valid_lft forever preferred_lft forever
Container 网络模式:
(1) 查找 other container(即需要被共享网络环境的容器)的网络 namespace;
(2)将新创建的DockerContainer(也是需要共享其他网络的容器)的 namespace,使用other container 的 namespace
vm4通过Container 网络模式共享vm1的网络环境
[root@server6 docker]# docker run -it --name vm3 ubuntu
root@dd40fd5b5266:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
14: eth0@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
root@dd40fd5b5266:/# [root@server6 docker]#
[root@server6 docker]# docker run -it --name vm4 --net container:vm3 ubuntu
root@dd40fd5b5266:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
14: eth0@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
root@dd40fd5b5266:/#
None 网络模式:
网络环境为 none,即不为 Docker Container 任何的网络环境。一旦 Docker Container 采用了none 网络模式,那么容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。
[root@server6 docker]# docker run -it --name vm2 --net none ubuntu
root@3f227611164f:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
获取容器的PID
[root@server6 docker]# docker inspect vm1 | grep Pid
"Pid": 14103,
"PidMode": "",
"PidsLimit": 0,