Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
一、docker的安装与部署
系统环境:要求centos7以上,内核必须不小于3.10
下载包,安装 ,启动服务,并查看
[root@foundation50 Desktop]# ls
docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm
docker-engine-selinux-17.03.1.ce-1.el7.centos.noarch.rpm
tidb
u=1157039478,3562742726&fm=11&gp=0.jpg
u=3125687640,261110254&fm=11&gp=0.jpg
u=769843676,2995011661&fm=11&gp=0.jpg
Untitled Folder
[root@foundation50 Desktop]# yum install -y docker-engine-*
[root@foundation50 Desktop]# systemctl start docker
[root@foundation50 Desktop]# docker info
二、镜像的导入和容器的使用
1、导入镜像并查看
[root@foundation50 Desktop]# mv game2048.tar /var/www/html/images/
[root@foundation50 Desktop]# cd /var/www/html/images/
[root@foundation50 images]# ls
game2048.tar
[root@foundation50 images]# docker load -i game2048.tar
011b303988d2: Loading layer 5.05 MB/5.05 MB
36e9226e74f8: Loading layer 51.46 MB/51.46 MB
192e9fad2abc: Loading layer 3.584 kB/3.584 kB
6d7504772167: Loading layer 4.608 kB/4.608 kB
88fca8ae768a: Loading layer 629.8 kB/629.8 kB
Loaded image: game2048:latest
2、使用镜像创建容器,并查看信息
[root@foundation50 images]# docker run -d --name vm1 game2048
[root@foundation50 images]# iptables -t nat -nL
[root@foundation50 images]# docker inspect vm1
3、网页查看
4、同样的方式导入nginx查看
[root@foundation50 images]# docker images nginx
[root@foundation50 images]# docker run -d --name vm2 -p 8080:80 nginx
[root@foundation50 images]# docker ps
[root@foundation50 images]# docker inspect vm2
在网页上可以搜 172.17.0.3
输入真机 IP + 端口 ,意思是可以做端口映射:
5、远程
[root@foundation50 images]# cd /etc/docker/
[root@foundation50 docker]# ls
key.json
[root@foundation50 docker]# vim deamon.json
{
"registry-mirrors": ["https://4hih87cm.mirror.aliyuncs.com"]
}
[root@foundation50 docker]# systemctl daemon-reload
[root@foundation50 docker]# systemctl restart docker
[root@foundation50 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
64893efa7c20 nginx "nginx -g 'daemon ..." 46 minutes ago Exited (0) 13 minutes ago vm2
6a464e8a5b1c game2048 "/bin/sh -c 'sed -..." About an hour ago Exited (137) 13 minutes ago vm1
[root@foundation50 ~]# docker rmi nginx
Error response from daemon: conflict: unable to remove repository reference "nginx" (must force) - container 64893efa7c20 is using its referenced image af4b3d7d5401
[root@foundation50 ~]# docker rm vm2
vm2
[root@foundation50 ~]# docker rmi nginx
Untagged: nginx:latest
[root@foundation50 ~]# docker search nginx
[root@foundation50 ~]# docker search nginx
[root@foundation50 ~]# cd /etc/docker
[root@foundation50 docker]# ls
deamon.json key.json nginx.tar
[root@foundation50 docker]# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
6a464e8a5b1cc67f7edf7425bb585a5440270276a9730e41e1a74f71a5e93624
Total reclaimed space: 4.074 kB
[root@foundation50 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@foundation50 docker]# docker load -i nginx.tar
cdb3f9544e4c: Loading layer 58.44 MB/58.44 MB
a8c4aeeaa045: Loading layer 54.24 MB/54.24 MB
08d25fa0442e: Loading layer 3.584 kB/3.584 kB
Loaded image: nginx:latest
[root@foundation50 docker]# docker run -d --name vm1 nginx
ea5890cf08dd1102ff9691f3f2db6a4f3d4a92eb870fa50b9c7e2103aa101d01
[root@foundation50 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ea5890cf08dd nginx "nginx -g 'daemon ..." 17 seconds ago Up 16 seconds 80/tcp vm1
[root@foundation50 docker]# cd
[root@foundation50 ~]# vim index.html
www.westos.org
[root@foundation50 ~]# docker inspect vm1
在网页输入 所查询到的 172.17.0.2
[root@foundation50 tmp]# mkdir docker
[root@foundation50 tmp]# cd docker/
[root@foundation50 docker]# ls
[root@foundation50 docker]# mkdir web
[root@foundation50 docker]# cd web/
[root@foundation50 web]# cd
[root@foundation50 ~]# mv index.html /tmp/docker/web/
[root@foundation50 ~]# docker run -d --name vm1 -v /tmp/docker/web/:/usr/share/nginx/html nginx
docker: Error response from daemon: Conflict. The container name "/vm1" is already in use by container ea5890cf08dd1102ff9691f3f2db6a4f3d4a92eb870fa50b9c7e2103aa101d01. You have to remove (or rename) that container to be able to reuse that name..
See 'docker run --help'.
[root@foundation50 ~]# docker stop vm1
vm1
[root@foundation50 ~]# docker rm vm1
vm1
[root@foundation50 ~]# docker run -d --name vm1 -v /tmp/docker/web/:/usr/share/nginx/html nginx
[root@foundation50 ~]# docker inspect vm1
[root@foundation50 ~]# cd /tmp/docker/web/
[root@foundation50 web]# ls
index.html
[root@foundation50 web]# vim index.html
<h1>www.westos.org</h1>
网页上输入 172.17.0.2
[root@foundation50 web]# docker save nginx > nginx.tar
[root@foundation50 web]# docker history nginx
6、数据卷管理
创建容器时使用 -v 参数可以挂载一个或多个数据卷到当前运行的容器中,-v的作用是将宿主机上的目录作为容器的数据卷挂载到容器中,使宿主机和容器之间可以共享一个目录
[root@foundation50 web]# cd /etc/docker/
[root@foundation50 docker]# ls
deamon.json key.json nginx.tar rhel7.tar
[root@foundation50 docker]# docker
docker docker-containerd-ctr dockerd docker-proxy
docker-containerd docker-containerd-shim docker-init docker-runc
[root@foundation50 docker]# docker load -i rhel7.tar
e1f5733f050b: Loading layer 147.1 MB/147.1 MB
[root@foundation50 docker]# docker run -it --name vm2 rhel7 bash
bash-4.2# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
bash-4.2# exit
并且可以设置读写权限
[root@foundation50 docker]# docker run -it --name vm1 -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro -v /etc/yum.repos.d/dvd.repo:/etc/yum.repos.d/dvd.repo:ro rhel7 bash
[root@foundation50 tmp]# cd data1/
[root@foundation50 data1]# ls
[root@foundation50 data1]# touch file1
[root@foundation50 data1]# pwd
/tmp/data1
[root@foundation50 data1]#
bash-4.2# cd /data2/
bash-4.2# ls
file
bash-4.2# rm -fr file
rm: cannot remove 'file': Read-only file system
bash-4.2# cd /data1
bash-4.2# ls
file1
bash-4.2# rm -fr file1
[root@foundation50 ~]# cd /tmp/data2
[root@foundation50 data2]# ls
[root@foundation50 data2]# pwd
/tmp/data2
[root@foundation50 data2]# touch file
[root@foundation50 data2]#
备份数据卷 –volumes-from
[root@foundation50 ~]# docker create --name datavol -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro -v /etc/yum.repos.d/yum.repo:/etc/yum.repos.d/yum.repo:ro rhel7 bash
8d88be8de230ce60cdf58e91092eab0dcfb34cf71540d548a55590388dea6a60
[root@foundation50 ~]# docker run -it --name vm1 --volumes-from datavol rhel7 bash
对于foreground容器,由于其只是在开发调试过程中短期运行,其用户数据并无保留的必要,因而可以在容器启动时设置–rm选项,这样在容器退出时就能够自动清理容器内部的文件系统,如下图在ubuntu环境下打包一个文件
[root@foundation50 ~]# docker run --rm -v /tmp/backup:/backup ubuntu tar cf /backup/etc.tar /etc
[root@foundation50 docker]# cd /tmp/backup/
[root@foundation50 backup]# ls
etc.tar
[root@foundation50 backup]# docker inspect vm1 |grep Pid
"Pid": 17485,
"PidMode": "",
"PidsLimit": 0,
[root@foundation50 17485]# cd ns/
[root@foundation50 ns]# ls
ipc mnt net pid user uts
[root@foundation50 ns]# ll
[root@foundation50 docker]# brctl show
三、网络管理
Docker 在启动时会创建一个虚拟网桥 docker0,默认地址为 172.17.0.1/16, 容器启动后都会被桥接到 docker0 上,并自动分配到一个 IP 地址。
四种网络模型
1、bridge模式,不需要-net指定,为默认设置
改模式docker网络隔离基于网络命名空间,在物理机上创建docker容器时会为每一个docker容器分配网络命名空间,并且把容器IP桥接到物理机的虚拟网桥上。
这里写代码片
2、host模式:此模式创建的容器没有自己独立的网络命名空间,是和物理机共享一个Network Namespace,并且共享物理机的所有端口与IP,并且这个模式认为是不安全的
3、container模式:此模式和host模式很类似,只是此模式创建容器共享的是其他容器的IP和端口而不是物理机,此模式容器自身是不会配置网络和端口,创建此模式容器进去后,你会发现里边的IP是你所指定的那个容器IP并且端口也是共享的,而且其它还是互相隔离的,如进程等。
4、none模式:此模式下创建容器是不会为容器配置任何网络参数的,如:容器网卡、IP、通信路由等,全部需要自己去配置
Docker Daemon 利用 veth pair 技术,在宿主机上创建两个虚拟网络接口设备,假设为veth0和veth1。而 veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将报文传输给另一方。
Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0 网桥上。保证宿主机的网络报文可以发往 veth0
在/var/run/下建立netns目录,并查看容器pid,建立链接
[root@foundation50 run]# cd netns/
[root@foundation50 netns]# pwd
/var/run/netns
[root@foundation50 netns]# ls
[root@foundation50 netns]# ln -s /proc/17485/ns/net /var/run/netns/17485
[root@foundation50 netns]# ip netns list
17485
[root@foundation50 netns]# ip link add name veth0 type veth peer name veth1 ##容器间的互连
--link 参数可以在不映射端口的前提下为两个容器间建立安全连接, --link 参数可以连接一个或多个容器到将要创建的容器。
--link 参数的格式为 --link name:alias,其中 name 是要链接的容器的名称,alias 是这个连接的别名
[root@foundation50 netns]# ip addr
查看网桥,没有需要我们自建建立,在真机端和容器端建立连接
[root@foundation50 netns]# brctl show
[root@foundation50 netns]# brctl addif docker0 veth0
[root@foundation50 netns]# ip link set up veth0
[root@foundation50 netns]# ip link set up veth1
Pid 会变,所以我们得注意千万不能随意退掉进程,不然会释放掉,就不会起作用。
我们得重新编写软连接在作加网关等一系列的操作。
Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为 eth0。如此一来,保证宿主机的网络报文若发往 veth0,则立即会被 eth0 接收,实现宿主机到Docker Container 网络的联通性;同时,也保证 Docker Container 单独使用 eth0,实现容器网络环境的隔离性。
[root@foundation50 netns]# ip link set veth1 netns PID
[root@foundation50 netns]# ip netns exec PID ip link set veth1 name eth0
[root@foundation50 netns]# ip netns exec PID ip link set up dev eth0
[root@foundation50 netns]# ip netns exec PID ip addr 172.17.0.100/24 dev eth0
[root@foundation50 netns]# ip netns exec PID ip route add default via 172.27.0.1