数据卷
我们知道Dokcer容器中仅仅包含镜像文件部分,容器停止,数据就会丢失。为了实现对进程运行的数据或可变的数据进行永久保存,我们将数据存在数据卷中,Docker提供两种形式数据管理。
- 数据卷(Data Volumes)
- 数据卷容器管理(Data Volumn Containers)也叫容器共享卷
这里我们使用一个nginx 官方镜像,来说明数据卷的使用。
拉取httpd镜像
[root@docker-daemon ~]# docker pull nginx
[root@docker-daemon ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx latest 3f8a4339aadd 4 weeks ago 108.5 MB
数据卷
所谓创建数据卷,就是在使用docker run
命令的时候,使用-v标记来创建一个数据卷并挂在到容器中,这里我们创建一个/data目录,并在里面放一个文件index.html,然后将其挂载到httpd镜像中。
格式
-
-v /data
:将docker中的目录挂载到宿主机上 -
-v host_dir:container_dir
:指定宿主机和容器中的目录
1.创建我们的web页面
[root@docker-daemon ~]# mkdir /data
[root@docker-daemon ~]# echo " Hello Docker
" > /data/index.html
2.将宿主目录挂载到容器的/usr/share/nginx/html
目录
[root@docker-daemon ~]# docker run -d -p 80:80 -v /data:/usr/share/nginx/html --name my_nginx nginx:latest
451fe3283af42029b6ad685accdb204f834fc1e83db1987d16983e4bf17e1b10=
现在我们就可以直接在宿主机上修改容器内web页面了。
我们可以通过inspect命令查看挂载情况
[root@docker-daemon ~]# docker inspect -f "{{.Mounts}}" my_nginx
[{ /data /usr/share/nginx/html true rprivate}]
容器共享卷
所谓容器共享卷就是多个容器使用同一个数据卷在运行时,我们通过--volumes-from
来指定.
示例:此处我们再起一个容器my_nginx2共享容器my_nginx的数据卷
[root@docker-daemon ~]# docker run -d -p 81:80 --volumes-from my_nginx --name my_nginx2 nginx:latest
4885b0012882975ef8f73ace6ba9e037cf0d11da4621667a78175b466b0d4d04
网络
Docker安装完成后默认会创建三个网络,我们可以使用docker network ls
命令查看。
网络类型 | 说明 | 用途 | |
---|---|---|---|
none | 封闭式容器 | 不参与网络通信 ,运行此类容器中的进程仅能访问本地回环接口 | 常用于备份、进程诊断及各种离线任务 |
bridge | 桥接式容器 | 拥有两个接口,回环接口和连接至主机某桥设备的以太网接口 | 默认接口,主要用于与外接进行通信 |
host | 开放式容器 | 与宿主机使用同一个网络栈 | 常用于直接暴露端口给外部机器访问 |
container: WEB | 联盟式容器 | 两个容器使用同一个网络协议栈 | 常用于多个容器使用同一个ipd地址达到高可用的效果 |
创建容器时,可以为docker run命令使用--network
选项知名要加入的网络。
示例:
桥接式容器
# docker run -it --rm --name my_centos_bridge dengyou/centos:net-tools
[root@cb7ed2d16a20 /]# ifconfig |awk '/netmask/{print $2}'
172.17.0.2 //docker0分配的ip地址
127.0.0.1
我们还可以使用--hostname
和--dns
来指定主机名和IP地址
# docker run -it --name my_centos_1 --rm --hostname c1.dengyou.com --dns 8.8.8.8 dengyou/centos:net-tools
[root@c1 /]# hostname
c1.dengyou.com
[root@c1 /]# cat /etc/resolv.conf
nameserver 8.8.8.8
--add-host
:添加主机名解析
# docker run -it --name my_centos_1 --rm --hostname c1.dengyou.com --dns 8.8.8.8 --add-host "www.idx.com:192.168.1.93" dengyou/centos:net-tools
[root@c1 /]# cat /etc/hosts|grep www
192.168.1.93 www.idx.com
封闭时容器
# docker run -it --rm --name my_centos_none --net none dengyou/centos:net-tools
[root@c336560f7106 /]# ifconfig |awk '/netmask/{print $2}'
127.0.0.1 //只有回环地址
开放式容器
[root@docker-daemon ~]# docker run -it --rm --name my_centos_host --net host dengyou/centos:net-tools
[root@docker-daemon /]# ifconfig |awk '/netmask/{print $2}'
172.17.0.1
192.168.1.224
127.0.0.1
联盟时容器
容器centos_one
[root@docker-daemon ~]# docker run -it --name cenot_one --net bridge dengyou/centos:net-tools
[root@054189c3c767 /]# ifconfig |awk '/netmask/{print $2}'
172.17.0.2
127.0.0.1
容器centos_two
[root@docker-daemon ~]# docker run -it --name centos_two --net container:centos_one dengyou/centos:net-tools
[root@41a0e97ee9b9 /]# ifconfig |awk '/netmask/{print $2}'
172.17.0.2
127.0.0.1
从上面可以看出,centos_one和centos_two共享同一个协议栈。
端口映射
使用格式
-
-p
:将指定的容器端口映射至主机的所有地址的一个动态端口 -
- p
:映射指定的主机端口: -
-p
:将容器的指定端口映射到主机指定ip的动态端口:: -
-p:
:将指定的容器端口映射至主机指定ip的端口: -
- P
:动态端口:指堆积端口,具体的映射结果可使用docker port命令查看