Docker容器超详细讲解(4)

# 映射一个端口 
EXPOSE port1 
# 相应的运行容器使用的命令 
docker run -p port1 image 
 
# 映射多个端口 
EXPOSE port1 port2 port3 
# 相应的运行容器使用的命令 
docker run -p port1 -p port2 -p port3 image 
# 还可以指定需要映射到宿主机器上的某个端口号 
docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image 

端口映射是docker比较重要的一个功能,原因在于我们每次运行容器的时候容器的IP地址不能指定而是在桥接网卡的地址范围内随机生成的。宿主机器的IP地址是固定的,我们可以将容器的端口的映射到宿主机器上的一个端口,免去每次访问容器中的某个服务时都要查看容器的IP的地址。对于一个运行的容器,可以使用docker port加上容器中需要映射的端口和容器的ID来查看该端口号在宿主机器上的映射端口。

ENV(用于设置环境变量)

构建指令,在image中设置一个环境变量。

ENV <key> <value> 

设置了后,后续的RUN命令都可以使用,container启动后,可以通过docker inspect查看这个环境变量,也可以通过在docker run --env key=value时设置或修改环境变量。
假如你安装了Java程序,需要设置JAVA_HOME,那么可以在Dockerfile中这样写:

ENV JAVA_HOME /path/to/java/dirent

ADD(从src复制文件到container的dest路径)

构建指令,所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0;如果是一个目录,那么会将该目录下的所有文件添加到container中,不包括目录;如果文件是可识别的压缩格式,则docker会帮忙解压缩(注意压缩格式);如果<src>是文件且<dest>中不使用斜杠结束,则会将<dest>视为文件,<src>的内容会写入<dest>;如果<src>是文件且<dest>中使用斜杠结束,则会<src>文件拷贝到<dest>目录下。

ADD <src> <dest>

<src> 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件url;
<dest> 是container中的绝对路径

VOLUME(指定挂载点)

设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。我们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令。

FROM base 
VOLUME ["/tmp/data"] 

WORKDIR(切换目录)

设置指令,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效。

# 在 /p1/p2 下执行 vim a.txt 
WORKDIR /p1 WORKDIR p2 RUN vim a.txt 

2.7 镜像导入导出

Docker容器超详细讲解

导出镜像到本地:

Docker容器超详细讲解

docker save -o centos6.5.tar centos6.5 或
docker export f9c99092063c >centos6.5.tar 

从本地将镜像导入:

docker load --input centos6.5.tar 或 
docker load < centos6.5.tar 

Docker容器超详细讲解

docker rm删除已经终止的容器
docker -f rm 可以删除正在运行的容器 

修改已经运行的后台容器:

docker exec -it CONTAINER ID /bin/bash 

Docker容器超详细讲解

三、存储

3.1数据盘

docker的镜像使用一层一层文件组成的,docker的一些存储引擎可以处理怎么样存储这些文件。

docker inspect centos            #查看容器详细信息 

信息下方的Layers,就是centos的文件,这些东西都是只读的不能去修改,我们基于这个镜像去创建的镜像和容器也会共享这些文件层,而docker会在这些层上面去添加一个可读写的文件层。如果需要修改一些文件层里面的东西的话,docker会复制一份到这个可读写的文件层里面,如果删除容器的话,那么也会删除它对应的可读写的文件层的文件。

如果有些数据你想一直保存的话,比如:web服务器上面的日志,数据库管理系统里面的数据,那么我们可以把这些数据放到data volumes数据盘里面。它上面的数据,即使把容器删掉,也还是会永久保留。创建容器的时候,我们可以去指定数据盘。其实就是去指定一个特定的目录。

docker run -i -t -v /mnt  --name nginx docker.io/nginx /bin/bash 

-v:制定挂载到容器内的目录

Docker容器超详细讲解

使用docker inspect 容器ID可以查看挂载目录对应于宿主机的物理文件路径

Docker容器超详细讲解

同样,我们可以使用将制定物理宿主机的目录挂载到容器的制定目录下:

将宿主机目录挂载到容器内:

docker run -d -p 80:80 --name nginx -v /webdata/wordpress:/usr/share/nginx/html docker.io/sergeyzh/centos6-nginx

-d 后台运行

--name 给运行的容器命名

-v  宿主机目录:容器目录  将宿主机目录挂载在容器内

-p  宿主机端口:容器监听端口  将容器内应用监听端口映射到物理宿主机的特定端口上

Docker容器超详细讲解

Docker容器超详细讲解

映射多个物理目录:(多写几个-v即可)

Docker容器超详细讲解


Docker容器超详细讲解


3.2 数据容器:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/12605.html