Dockerfile中Run指令运行命令时找不到命令
Run cmd 是在/bin/sh环境中执行命令。
Run [“cmd”] 是直接使用系统调用exec执行。
找不到命令时将/bin/sh替换成/bin/bash, 在Dockerfile中添加:
RUN rm /bin/sh && ln -s /bin/bash /bin/shUbuntu安装命令 RUN apt-get install -y apache2
- CMD命令用来设置启动容器时默认运行的命令,命令结束容器就退出了。设置容器启动执行命令并进入 shell,
CMD sh -c “source /etc/profile && /bin/bash”
添加文件内容
RUN echo “export JRE_HOME=${JAVA_HOME}/jre” >> /etc/profile
Ubuntu系统修改sources.list后,apt出现Unable to locate package, 执行apt-get update。
不要在Dockerfile中启动后台程序,要把后台程序改成前台程序,或者写一个启动脚本,在脚本中启动后台进程。
端口映射
-p localport:containerport
查看容器配置信息
docker inspect containerID
最近运行容器的ID
docker ps -l -q
删除所有的容器
docker rm $(docker ps -a -q)
数据卷
数据卷一旦声明,它的生命周期和声明它的容器就无关了。一个容器引用一个数据卷容器时,并不要求数据卷容器是运行的。数据卷容器可以级联引用。此外,容器的停止和删除都不会导致数据卷本身删除。如果要删除数据卷,需要删除所有依赖它的容器,并且在删除最后一个依赖容器时加入-v标志,
docker rm -v container
可以通过两种方式创建数据卷。
在Dockerfile中,
VOLUME /var/lib/data
但是Dockerfile不支持挂载本地目录到数据卷。
或者在命令行中使用docker run, -v 参数来创建数据卷并将其挂载到容器中。
若只创建数据卷没有挂载相应的目录 -v /data,docker会在/var/lib/docker/vfs/dir下分配一个具有唯一名字的目录对应该数据卷。
指定宿主主机上的某个目录作为数据卷, -v 宿主目录:数据卷:权限, 宿主目录的路径必须是绝对路径。使用宿主当前目录
-v `pwd` : /data
通过挂载本地目录到容器的数据卷,宿主主机对目录的改变会同步反映到容器中,反过来也一样。如果容器内部已经存在相应的数据卷路径,那么挂载宿主目录后,它的内容会被覆盖。
docker也可以将宿主上的单个文件作为容器的数据卷。 -v /docker/file.txt:/file.txt。
容器连接
容器连接包括源容器和目标容器,源容器提供服务。容器连接依赖于容器名,这种容器间的连接比暴露端口的方式更加安全。
docker run –name containerName ,命名容器。
docker run –link containerName:alias ,containerName为源容器名字,alias为这个连接的别名。这种方式只能处理一个宿主上的容器连接。
代理连接
通过代理连接可以解耦两个原本直接相连的容器的耦合性,并且可以跨主机连接。