使用docker run命令启动容器

    1. docker run -p 80:80 --name 7even -v /home/7even/html/tools:/usr/share/nginx/html -v -d nginx
    • -d让容器在后台运行,可添加容器ID或者容器名

    • -p端口映射—宿主机端口:容器内监听端口

    • -v:映射容器目录/usr/share/nginx/html到宿主机目录/home/7even/html/tools

    查看docker进程,发现为Exited
    docker存储卷 - 图1
    docker logs [ID或者名字] 查看容器内部的标准输出。发现报错nginx.conf和index.html文件不存在。
    docker存储卷 - 图2
    Tips

    docker logs -f [ID或者名字] 类似于 tail -f 的效果

    进入容器查看,/usr/share/nginx/html/tools/conf目录下确实没有nginx.conf配置文件。再细查看-v参数的用法,是将当前工作的目录挂载到容器内,如果要映射的目录在宿主机上不存在,那么docker在启动前会自动创建此目录。

    但需要注意的是挂载容器启动依赖的配置文件到宿主机,但事先并没有在宿主机上拷贝或者创建依赖的配置文件,会导致容器启动失败。

    例如nginx.conf,在容器中存在,但在宿主机的映射目录/home/7even/html/tools下并没有nginx.conf,容器在启动时会找宿主机上的nginx.conf启动,没找到nginx.conf,Nginx就停止运行,意外退出了。

    总结:当映射容器启动依赖的配置文件到宿主机时,宿主机上必须要存在该配置文件,否则容器会启动失败并退出运行。类似于Linux系统启动需要的initrd文件。内核模块放置在/lib/modules/$(uname -r)/kernel中,这些模块必须要在/目录被挂载时才能被读取。但内核本身不具备磁盘驱动程序时,无法加载/目录,也就无法获得驱动程序。但如果Linux是安装在IDE接口的磁盘上而非需要加载对应驱动程序的USB,SATA,SCSI等磁盘设置上,并且使用默认的ext2/ext3文件系统,那么不需要initrd也能够顺利启动。

    重新梳理需要映射到宿主机的目录,进行配置。

    1. docker run -p 80:80 --name nginx7even -v /home/7even/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/7even/conf/conf.d:/home/7even/conf/conf.d -v /home/7even/html/tools:/usr/share/nginx/html -v /home/7even/logs:/var/log/nginx -d nginx

    docker存储卷 - 图3
    docker inspect [container id]可以查看到宿主机和容器目录的挂载情况
    docker存储卷 - 图4