一,搭建2048小游戏:
[root@foundation92 Desktop]# docker load -i game2048.tar #导入镜像
[root@foundation92 Desktop]# docker run -d -p 8000:80 --name game game2048 #运行小游戏,并将容器的80端口映射到本机的8090端库执行
在本机浏览器执行:
docker inspect game2048 #此命令用来查看镜像信息
二,搭建nginx服务器:
[root@foundation92 Desktop]# docker load -i nginx.tar #导入镜像
d8bd0657b25f: Loading layer 130.9 MB/130.9 MB
a582cd499e0f: Loading layer 1.024 kB/1.024 kB
f5a1ef78853b: Loading layer 1.024 kB/1.024 kB
605083c53cc5: Loading layer 1.024 kB/1.024 kB
c95d1af3960d: Loading layer 67.97 MB/67.97 MB
0a410ba58143: Loading layer 3.584 kB/3.584 kB
fb6fc13654c9: Loading layer 1.024 kB/1.024 kB
36b0adefb2f3: Loading layer 1.024 kB/1.024 kB
[root@foundation92 Desktop]# docker images #查看镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
game2048 latest 19299002fdbe 14 months ago 55.5 MB
nginx latest af4b3d7d5401 23 months ago 190.5 MB
#了解nginx容器的配置:
[root@foundation92 Desktop]# docker run -it nginx bash
root@25bb2e970049:/# find / -name nginx
/etc/default/nginx
/etc/init.d/nginx
/etc/logrotate.d/nginx
/etc/nginx
/usr/lib/nginx
/usr/sbin/nginx
/usr/share/doc/nginx
/usr/share/nginx
/var/cache/nginx
/var/log/nginx
root@25bb2e970049:/# cd /etc/nginx/conf.d/ #查寻nginx的配置文件
root@25bb2e970049:/etc/nginx/conf.d# ls
default.conf
root@25bb2e970049:/etc/nginx/conf.d# vim default.conf
bash: vim: command not found
root@25bb2e970049:/etc/nginx/conf.d# cat default.conf #查看nginx的配置文件
[root@foundation92 Desktop]# docker run -d --name nginxserver nginx #y运行nginx容器并起名为nginxserver
febb8ba07e84110d291b205479872755badd4d4263c2df0a355a50d83bacd509
在浏览器测试容器:
创建nginx的首页:
cd /tmp/docker/web
vim index.html
hello,nginx
[root@foundation92 web]# docker run -d --name web -p 8080:80 -v /tmp/docker/web/:/usr/share/nginx/html nginx #将nginx镜像命名为web容器,并以后台模式运行容器web,将容器的80端口映射到主机的8080端口,容器的nginx默认发布目录映射到本机的/tmp/docker/web/
c9eed588a91dba719ea2a1693536212eb0c96c2bcf39100465b3d26a7942dd6c
在浏览器测试:
可以成功查看到为web容器定制的nginx首页。
创建nginx虚拟主机:
cd /tmp/docker
[root@foundation92 docker]# cat vhost.conf #创建nginx虚拟主机
server {
listen 80;
server_name www.westos.com;
charset utf-8;
location / {
root /website;
}
}
[root@foundation92 web]# docker run -d --name vmserver -p 80:80 -v /tmp/docker/web/:/website -v /tmp/docker/vhost.conf:/etc/nginx/conf.d/vhost.conf nginx #创建容器,取名vmserver,将容器的80端口映射到本机的80端口,容器的/website(location)映射到本机的/tmp/docker/web/目录,容器的/etc/nginx/conf.d/vhost.conf(虚拟主机配置文件)映射到本机的/tmp/docker/vhost.conf文件。
ad733ddaafd4bc0d2cf71c94a3ae74630fb38dcf674d2515b912e55a59147407
本地添加域名解析:
vim /etc/hosts
172.25.254.92 www.westos.com
浏览器测试:
成功创建虚拟主机。
注意:每创建一个docker容器,就会生成一个虚拟的网卡,并桥接到docker0上:
[root@foundation92 web]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.f0761cf34bcf no enp2s0
vnet0
docker0 8000.02423371ed38 no vethc6fc3b2
vethf14845d
virbr0 8000.5254003a28a3 yes virbr0-nic
virbr1 8000.525400cf9b32 yes virbr1-nic
[root@foundation92 web]# ip addr | grep veth
44: vethf14845d@if43: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
48: vethc6fc3b2@if47: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
三,Docker数据卷管理:
Docker的文件系统是如何工作的.Docker镜像是由多个文件系统(只读层)叠加而成.当我们启动一个容器的时候,Docker会加载镜像层并在其上添加一个读写层.如果运行中的容器修改了现有的一个已存在的文件,那该文件将会从读写层下的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏.当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失.在Docker中,只读层以及在顶部的读写层的组合被称为Union FIle System(联合文件系统).
为了能够保存(持久)数据以及共享容器间的数据,Docker提出了Volumes的概念。
-v 目录 :它存在于联合文件系统外部并可以在主机上直接访问。任何在该镜像/data路径的文件将被复制到volume。我们可以使用docker inspect命令找出Volume在主机存储的地方,Dockerfile中通过使用VOLUME指令来达到相同的效果。
Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume)。数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享。
数据卷呈现给Docker容器的形式就是一个目录,支持多个容器间共享,修改也不会影响镜像。使用Docker的数据卷,类似在系统中使用 mount 挂载一个文件系统。
1,创建数据卷
[root@foundation92 Desktop]# mkdir /tmp/data1 /tmp/data2
[root@foundation92 Desktop]# ls /tmp/
data1 data2 docker
[root@foundation92 Desktop]# docker run -t -i --name test -v /tmp/data1:/voldata1 -v /tmp/data2:/voldata2 ubuntu /bin/bash #使用ubuntu镜像构建test容器,-v的作用是将宿主机的一个目录作为容器的数据卷挂载到容器中,使宿主机和容器之间可以共享一个目录,如果本地路径不存在,Docker也会自动创建。-v参数可以使用多次,并挂在多个数据卷到容器中。后面的参数信息中冒号前面是宿主机的本地目录,冒号后面是容器中的挂载目录。
root@12892af26651:/# ls
bin dev home lib64 mnt proc run srv tmp var voldata2
boot etc lib media opt root sbin sys usr voldata1
root@12892af26651:/# cd voldata1/ #进入容器中的挂载数据卷中,创建文件
root@12892af26651:/voldata1# touch testdata1
root@12892af26651:/voldata1# cd ..
root@12892af26651:/# cd voldata2/
root@12892af26651:/voldata2# touch testdata2
root@12892af26651:/voldata2# exit #退出容器
exit
[root@foundation92 Desktop]# ls /tmp/data1/ #在真实主机的目录下也可以看见在容器挂载目录下创建的文件
testdata1
[root@foundation92 Desktop]# ls /tmp/data2/
testdata2
2,挂载宿主主机上的文件:
在宿主主机上创建文件:
[root@foundation92 docker]# vim /tmp/docker/share
share file
在容器中创建挂载宿主主机文件挂载点(此处创建和宿主主机通名的文件,也可以创建不同名的文件)
[root@foundation92 docker]# docker run -it --name test2 ubuntu bash
root@2b9981f52566:/# mkdir /tmp/docker
root@2b9981f52566:/# cd /tmp/docker/
root@2b9981f52566:/tmp/docker# ls
root@2b9981f52566:/tmp/docker# touch share
root@2b9981f52566:/tmp/docker# exit
将宿主主机的文件挂载到容器中:
[root@foundation92 docker]# docker run -it --name test3 -v /tmp/docker/share:/tmp/docker/share:ro ubuntu #以只读权限挂载容器
root@79185602ed9c:/# cat /tmp/docker/share #可也看见容器成功挂载宿主主机的文件
share file
root@79185602ed9c:/# eixt
即容器可以共享宿主主机的指定文件。
3,数据卷容器:
如果需要在多个容器间共享数据,并希望永久保存这些数据,最好的方式是使用数据卷容器,类似于一个提供网络文件共享服务的NFS服务器。
数据卷容器创建方法跟普通容器一样,只需要指定宿主机的一个文件夹作为数据卷即可,使用docker create命令创建但不启动数据卷容器:
4,备份数据卷:
备份方法:a,创建一个新的容器 b,挂载数据卷容器 c,挂载宿主主机本地目录作为数据卷 d,将数据卷容器的内容备份到宿主主机本地木路
docker create --name sharedata -v /tmp/docker/data1/:/data1 -v /tmp/docker/data2:/data2 ubuntu #创建数据卷容器,但不启动
mkdir /tmp/docker/data1
mkdir /tmp/docker/data2
[root@foundation92 docker]# docker run -it --name web2 --volumes-from sharedata ubuntu #连接到数据卷并创建新的容器
root@78f4b083f4cf:/# ls
bin data1 dev home lib64 mnt proc run srv tmp var
boot data2 etc lib media opt root sbin sys usr
#备份数=数据卷:
docker run --rm --volumes-from data -v /tmp/backup:/backup rhel7 tar cf /backup/test.tar