第七章
端口映射实现容器访问
1. 从外部访问容器应用
在启动容器的时候, 如果不指定对应参数, 在容器外部是无法通过网络来访问容器内的 网络应用和服务的
通过-P或-p参数来指 定端口映射
-P 随机映射一个49000-49900 的端口 到内部容器开放的网络端口:
-p 指定要映射的端口 并且,在一个指定端口上只可以绑定一个容器。
格式:IP:HostPort:ContainerPort | IP::ContainerPort |HostPart:ContainerPort
2. 映射所有接口地址
HostPort:ContainerPort 本地的5000端口映射到容器的5000端口
docker run -d -p 5000:5000 training/webapp python app.py
此时默认会绑定本地所有接口上的所有地址,多次使用-p标记可以绑定多个端口
3. 映射到指定地址的指定端口
IP:HostPort:ContainerPort 使用一个特定的地址
docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
4. 映射到指定地址的任意端口
IP::ContainerPort 绑定localhost的任意端口到容器的5000端口,本地主机会自动分配一个端口:
docker run -d -p 127.0.0.1::5000 training/webapp python app.py
还可以使用udp标记来指定 udp端口:
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
5. 查看端口映射
docker port
互联机制实现便捷互访
1. 自定义容器命名
使用 --name myweb 给容器起一个别名 别名唯一
docker run 的时候 添加 --rm 标记 则容器在终止 后会立刻删除
--rm 和 -d 不能同时使用
2. 容器互联
--link 参数可以让容器质检安全交互
docker run -d --name db training/postgres
docker run -d -P --name web --link db:db training/webapp python app.py
--link name: alias name链接的容器名称,alias是别名
3. 可以使用ping 命令来测试 容器间的连通
第八章
Dockerfile 创建镜像
1. Dockerfile 主体内容分为:基础镜像信息、维护者信息、镜像操作指令、容器启动时指令
首行可以通过注释来指定解析器命令 后续通过注释说明镜像的相关信息
主体部分首先使用 FROM 指令指明所基于的镜像名称
LABEL指令说明维护者信息
然后是镜像操作指令 RUN 指令将对镜像执行跟随的命令
每运行一条RUN指令, 镜像添加新的一层, 并提交。
最后是CMD指令, 来指定运行容器时的操作命令。
2. 指令说明
配置指令和操作指令
FROM:指定所创建的镜像的基础镜像
任何Dockerfile 中第一条指令必须为FROM指令
LABEL:指令可以为生成的镜像添加元数据标签信息
LABEL version="1.0.0-rc3"
EXPOSE:声明镜像内服务监听的端口
EXPOSE 22 80 443 该命令只是起声明作用、并不会自动完成端口映射
ENV:指定环境变量 在镜像生成过程中会被后续RUN指令使用
ENV APP_VERSION=1.0.0
ENV APP_HOME=/user/local/app
ENTRYPOINT:指定镜像的默认入口命令 容器启动时作为跟命令执行
EXNTRYPOINT ["executalbe","param1","param2"] :exec调用执行
EXNTRYPOINT command param1 param2 :shell中执行
每个Dockerfile只能有一个EXNTRYPOINT
VOLUME:创建一个数据卷挂载点
VOLUME ["/data"]
WORKDIR:为后续的RUN、CMD、ENTRYPOINT指令配置工作目录
WORKDIR /path/to/workdir 建议使用绝对路径
STOPSIGNAL:指定所创建镜像启动的容器接收退出的信号值:
STOPSIGNAL signal
HEALTHCHECK:配置所启动容器如何进行健康检查
SHELL: 指定其他命令使用 shell 时的默认 shell 类型
SHELL [”executable”,”parameters”]
默认值为 ["/bin/sh","-c"]
操作指令:
RUN:运行指定命令
RUN <command>或 RUN [ "executable " , ”paraml” , ”param2 ]
前者默认将在 shell 终端中运行命 令,即/bin/sh -c ;
后者则使用 exec 执行,不会启动 shell 环境
RUN ["/bin/bash","-c","echo hello"]
每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像层
当命令较长时 可以使用\来换行
RUN apt-get update \
&& apt-get install -y libsnappy-dev zliblg-dev libbz2-dev \
&& rm -rf /var/cache/apt \
&& rm rf /var/lib/apt/lists/*
CMD:指令用来指定启动容器时默认执行的命令
CMD ["executalbe","param1","param2"]
相当于executalbe param1 param2 推荐使用
CMD command param1 param2 在默认的 Shell 中执行,提供给需要交互的应用;
每个Dockerfile只能有一个CMD命令 如果存在多个则最后一条被执行
ADD:添加内容到镜像
ADD src destination
COPY:复制内容到镜像
COPY src destination 复制本地主机的<src> (为 Dockerfile 所在目录的相对路径,文件或目录)下内容到镜 像中的<dest>
ADD 与COPY 相似 推荐COPY
创建镜像
编写完成Dockerfile后 可以通过docker build 来创建镜像
1. 创建镜像build
docker build PATH | URL
docker build -t myimage/first_image:1.0.0 .
2. 父镜像选择
通过FROM选择指定父镜像
基础镜像和普通镜像
3. 多步骤创建
可以精简最终生成的镜像大小
对于需要编译的应用 C GO JAVA语言等 通常情况下至少需要准备两个环境的docker镜像
编译环境镜像:包括完整的编译引擎、依赖库等往往比较庞大 作用:编译应用为二进制文件
运行环境镜像:利用编译好的二进制文件、运行应用 由于不要编译环境 体积比较小