准备
# 下载Nginx镜像
docker pull nginx:1.12.2
# 重新打一个标签,为了后面push到自己的仓库
docker tag 4037a5562b03 adminnhubo/nginx:v-1.12.2
映射端口(-p)
docker run -p{容器对外包路的端口}:容器内的端口
docker run --rm --name myNginx -d -p81:80 adminhubo/nginx:v-1.12.2
# 启动后程序会在后台运行,因为nginx在运行,所有不会退出。通过stop停止容器是就会被删除。
很多情况下都需要将容器中的服务暴露给外部访问,比如web项目,docker run -p命令可以将容器内建通的端口映射到宿主机的一个端口上,这样通过宿主机的端口就可以访问到容器内部的服务。
# 在宿主机上查看81端口:
netstat -luntp | grep 81
# 如果出现 netstat: command not found 没有 netstat 命令,安装
yum install net-tools
# 可以curl一下地址测试一下,会有一个html文本内存返回到终端
通过浏览器访问宿主机的81端口:
可以一次暴漏多个端口,可以参考官网的暴露端口说明:
挂载数据卷(-v)
docker run -v{容器外文件目录}:{容器内文件目录}
数据卷挂载,将容器内的文件系统和宿主机的文件系统管理起来,相当于扩展容器。
# 在宿主机上创建一个新的demo-html目录用来挂载,并在目录中用 wget 获取官网的index.html
mkdir demo-html
cd demo-html
wget https://docs.docker.com/ -O index.html
# 如果 wget: command not found 安装:yum -y install wget
# 挂载到容器
# docker run -v{容器外挂载目录源}:{容器内挂载目录}
docker run --rm -d --name nginx_volume -p82:80 -v/root/demo-html:/usr/share/nginx/html adminhubo/nginx:v-1.12.2
上一小节启动的 myNginx 容器中的nginx监听的80端口映射到宿主机的81端口
这条命令重新运行一个的 nginx_volume 容器,映射到宿主机端口的82端口(如果之前的 myNginx 没有stop,并且也使用81端口,会出现端口冲突),通过 -v 指令将宿主机的 /root/demo-html 目录挂载到容器中:/usr/share/nginx/html目录,这样nginx容器的代理地址就会变成挂载目录,访问访问宿主机的82端口:
传递环境变量(-e)
docker run -e {环境变量Key}={环境变量Value}
# docker run -e 环境变量键=值
docker run --rm -e E_A=abc adminhubo/alpine:latest printenv
通过这个命令可以向容器传递很多信息,可以控制容器的运行环境。
容器内安装软件(工具)
可以直在启动命令后面添加安装命令,也可以到容器控制台中安装。根据具体的Linux发现版本不同安装命令可能会不一样,比如centos、redhat系列的可以用yum命令,ubuntu可以用ap-get命令,alpine可以用apt命令。为容器安装完软件后可以将它commit,固化到镜像中,然后push到仓库保留,这样以后使用可以直接拉取。
在myNginx容器中安装一个curl的包,然后推到仓库保存起来:
# 跟新apt源
apt-get update
# 使用apt源安装cutl
apt-get install curl -y
# 如果按照很慢,可以配置apt源
测试一下,退出:
固化到镜像:
docker commit -p myNginx adminhubo/nginx:v-1.12.2-curl
推送到dockerhub
docker push adminhubo/nginx:v-1.12.2-curl