docker run --rm -it -p 5000:80 -v /host:/local #image_id /bin/bash
--rm
:退出之后自动删除这个 container。-it
:把 container 连接到 terminal。-p 5000:80
:把 container 的 80 端口 map 到 host 的 5000 端口。-v /host:/local
:把 host 的路径/host
map 到 container 的 /local
。/bin/bash
:开启 container 之后运行这个命令。docker exec -it #container_id /bin/bash
docker tag ba90d13a384b updated_ubuntu:20170803
CMD echo $HOME
,另一种是 exec 格式RUN ["sh", "-c", "echo $HOME"]
。每一个 RUN 行为都会 commit,也就是创建一层新的镜像。但是 Union FS 是有最大层数限制的,目前是不超过 127 层,因此,尽量把所有的 RUN 放到一条命令里面,用 &&
把命令串起来。记得每次 RUN 最后要加 apt-get purge -y --auto-remove
清除不必要的中间文件。./
而不能是../
或绝对路径/
,COPY 不是真的 copy 文件,而是相当于把这个文件挂载到 docker 里,让 docker 能读取这些文件。ADD 除了 COPY 本身的命令之外,还有解压缩和下载 URL 调整权限的功能,功能比较复杂,但 Docker 官方的最佳实践提示:用 COPY 尽量不用 ADD.<key> = <val>
:设置环境变量,在其他命令当中可以使用。<key>[=<deafult val>]
:设置环境变量名,可以在 docker run 命令中通过 --build-arg
来传进去。-p <宿主端口>:<容器端口>
开的。/app
下面找到 world.txt
的。
RUN cd /app RUN echo "hello" > world.txt
WORKDIR
才能真的切换路径。docker run
的时候用-v /host:/local
来指定。不然 volume 定义的路径会生成一个随机的 host 宿主地址去存储。实际 mount 的地址可以通过docker container inspect --format {{.Mounts}} 07c3fe7802df
命令来获得。修改对应 mount 在 host 地址内的文件夹,能直接影响 container 里面访问的文件夹内容。screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
在里面可以访问 inspect 到的地址。>$python -m SimpleHTTPServer 8000
--net=host
之后就可以用 localhost
访问 Host 主机了,然而:
>$curl 127.0.0.1:8000 curl: (7) Failed to connect to 127.0.0.1 port 8000: Connection refused
--net=host
一样可以通过 192.168.65.1:8000
访问到host 主机了。不过用ip route|awk '/default/ {print $3}'
这个命令获得不到这个 IP。--net=host
会导致 port mapping 失效,因此如果需要从 host 用 localhost 访问 docker 内部暴露的端口,一方面要在 Dockerfile 里加入 Expose,另一方面不能使用--net=host
,所以在需要 container 和 host 双向沟通的地方,还是使用局域网 ip 吧。