Docker 入门 ------容器互通以及Dockerfile

1. 端口映射以及容器互联

Docker 除了通过网络访问,还提供了两种很方便的功能来满足服务访问的基本需求:

  1. 允许映射容器内应用的服务端口到本地宿主主机
  2. 互联机制实现多个容器间通过容器名来快速访问

1.1 容器映射实现访问容器

1.1.1 从外部访问容器应用

当容器中运行一些网络应用时,可以通过-P或者-p来指定端口映射。-P会使Docker随机取一个端口号。

docker run -d -P training/webapp python app.py

在这里插入图片描述
表示本地主机的32769映射到了容器的5000端口

你也可以使用-p来指定端口绑定一个容器,格式:

HOSTPort:ContainerPort 或者 IP::ContainerPort

1.1.2 映射所有接口端口

docker run -d -p 5000:5000 training/webapp python app.py // 将本地的5000端口映射到容器的5000端口

也可以一次绑定多个端口

docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py // 将本地的5000端口映射到容器的5000端口,且本地3000端口也映射到容器的80端口

1.1.3 映射到指定地址的指定端口

docker -run -d -p127.0.0.1:5000:5000 training/webapp python app.py

此处用的就是ip:HOSTPORT:ContainerPort格式指定映射地址

1.1.4 映射到指定容器的任意端口

docker run -d -p 127.0.0.1::5000 training/webapp python app.py

此处用的就是IP::ContainerPort绑定本地主机任意端口到容器5000端口

docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

还可以使用udp标记来指定udp端口

1.1.5 查看映射端口的配置

docker port ContainerName

在这里插入图片描述
注意:容器有自己的内部网络和IP地址,使用docker inspect + 容器ID 可以获取容器的具体信息

1.2 互联机制实现便捷互访

容器的互联会在源和接受容器之间创建链接关系,接受容器可以通过容器名快速访问到源容器,而不用制定具体的IP地址

1.2.1 自定义容器命名

docker run -d -P --name web training/webapp python app.py

使用--name可以自定义容器名,以上就命名容器为web

docker ps -l 来验证
docker inspect -f “{{ .Name }}” [容器ID]

在这里插入图片描述
容器的名称是唯一的,如果你已经有了一个名为web的容器,你就不能创建一个相同名字的容器了,必须先rm在创建,如果在docker run使用--rm标记,那么会在容器终止后立即删除,注意--rm和-d参数不能同时使用

1.2.2 容器互联

创建容器:

docker run -d --name db training/postgres // 创建一个数据库容器
docker rm -f web // 删除之前的web容器
docker run -d -P --name web --link db:db training/webapp python app.py // 然后创建一个web容器,并且把他连接到db容器

此时。db容器和web容器为互联关系。 --link参数格式为--link name:alias 其中name是链接容器名称,alias是这个链接的别名。

注意: Docker相当于在两个容器之间创建了一个虚拟通道,而不需要再去映射它们的端口到宿主主机上。在启动db容器的时候没有使用-p-P标记,从而避免数据库服务端口暴露到外部网络中。

我们来测试两者之间连通性:

docker run -t -i --rm --link db:db training/webapp /bin/bash // 进入终端
cat /etc/host
ping db

在这里插入图片描述
这里我们可以看到db被解析成了172.18.0.3

2. 使用Dockerfile创建镜像

2.1 基本结构

Dockerfile主要分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令

例子:

FROM ubuntu  // 所创建的基础镜像信息
MAINTAINER docker_user docker_user@email.com // 维护者信息
RUN echo "deb http://archive.ubuntu.com/ubuntu raring main universe" >> /etc/apt/sources.list // 运行命令
RUN yum -y nginx // 运行命令
RUN echo "\ndaemmon off;" >> /etc/nginx/nginx.conf // 运行命令CMD /usr/bin/nginx // 启动容器时的默认指令

2.2 指令说明

2.2.1 FROM

解释: 指定所创建镜像的基础镜像,如果本地不存在,则默认会去Docker Hub下载指定镜像

格式:

FROM[image] | [image]:[tag] | [image]@[digest]

注意:Dockerfile第一条指令必须是FROM指令,如果在同一个Dockerfile中创建多个镜像,可以使用多个FROM指令(每个镜像一次)

2.2.2 MAINTAINER

解释: 指定维护者信息。

格式:

MAINTAINER image_creator@docker.com

生成的镜像会写入镜像的Author属性域中。

2.2.3 RUN

解释: 运行指定命令。

格式:

RUN [command] | [“executable”,“param1”,“param2”]

注意!上面第二种方式会被解析成一个JSON,所以必须使用双引号

RUN可以使用\来进行换行

2.2.4 CMD

解释: 用来指定启动容器时默认执行的命令

格式:

CMD [“executable”,“param1”,“param2”] | command param1 param2 | [“param1”,“param2”]

其中第一种是使用exec执行,是最推荐的方式,第二种是提供给需要交互的应用,第三种是提供给ENTRYPOINT的默认参数

每一个Dockerfile只能有一条CMD命令,如果指定了多条,只有最后一条会执行

如果启动容器的时候手动指定了运行命令(RUN)则会覆盖掉CMD命令

2.2.5 LABEL

解释: 用来指定生成镜像的元数据标签信息。

格式:

LABEL [key]=[value] [key]=[value] …

2.2.6 EXPOSE

解释: 声明镜像内服务监听的端口

格式:

EXPOSE 22 80 8080

注意: 该指令只是起到声明作用,并不会自动完成端口映射。

在启动容器时,需要使用-P,Docker主机会自动分配一个宿主机的临时端口转发到指定端口

使用-p,可以具体声明从宿主机哪个本地端口映射过来

2.2.7 ENV

解释: 指定环境变量,在镜像生成过程中会被后续的RUN指令使用,在镜像启动的容器中也会存在。

格式:

ENV [key][value] | [key] = [value]

指令指定的环境变量在运行时可以被覆盖掉,如: docker run --env [key]=[value] …

2.2.8 ADD

解释: 复制指定的src路径下的内容到容器中的dest路径下

格式:

add [src][dest]

如果是tar文件,会自动解压到dest路径下,dest可以是绝对路径,或者是对于工作目录的相对路径。

2.2.9 COPY

解释: 复制本地主机的src到镜像容器的dest下,注意!和add是有区别的,copy主要复制的是本地主机

格式:

copy [src][dest]

2.2.10 ENTRYPOINT

解释: 指定镜像的默认入口命令,该入口命令会在启动容器时作为根命令执行,所有传入值作为该命令的参数

格式:

ENTRYPOINT [“executable”,“param1”,“param2”]
ENTRYPOINT command param1 param2

前者使用exec调用,后者在shell中执行。使用后CMD指令指定值将作为根命令的参数

每个Dockerfile中只能有一个ENTRYPOINT,当有多个时,只有最后一个有效。

在运行时,可以被 --entrypoint覆盖掉

2.2.11 VOLUME

**解释:**创建一个数据卷挂载点。

格式:

VOLUMe[“/data”]

2.2.12 USER

解释: 指定容器运行时的用户名或ID,后续RUN也会指定用户身份。

格式:

USER daemon

当服务不需要管理员时,也可以通过命令来指定运行用户,并且可以在之前创建所需要的用户。

RUN groupadd -r postgres && useradd -r -g postgres postgres

2.2.13 WORKDIR

解释: 为后续的RUN、CMD和ENTRYPOINT指令配置工作目录

格式:

WORKDIR [path]

2.2.14 ARG

解释: 指定一些镜像内使用的参数

格式:

ARG [name][=[default name]]

2.2.15 ONBUILD

解释: 配置当所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令

ONBUILD [INSTRUCTION]

2.2.16 STOPSIGNAL

解释: 指定所创建镜像启动的容器接受退出的信号值

格式:

STOPSIGNAL [signal]

2.2.17 HEALTHCHECK

**解释: ** 配置所启动容器如何进行健康检查

格式:

HEALTHCHECK [OPTIONS] CMD command; // 根据所执行命令返回值是否为0判断
HEALTHCHECK NONE; // 禁止进行健康检查

OPTIONS选项说明:

指令解释
–interval默认30s,过多久检查一次
–timeout默认30s,每次检查等待结果的超时时间
–retries默认3,检查失败了,重试几次才确定

2.2.18 SHELL

解释: 其他命令使用shell时的默认shell类型

格式:

shell [“command”,“options”]

注意:Dockerfile开头添加#escape=来指定转义信息

2.3 创建镜像

Dockerfile通过docker build来创建镜像。

例如,指定Dockerfile所在路径为 /tmp/docker_builder/,希望生成的标签为build_repo/first_iamge

docker build -t build_repo/first_iamge /tmp/docker_builder/

2.4 使用.dockerignore文件

可以通过.dockerignore来让Docker忽略匹配模式下路径的目录和文件

2.5 最佳实践

遵循一下九条意见:

  1. 精简镜像用途
  2. 选用合适的基础镜像
  3. 提供足够清晰的命令注释和维护者信息
  4. 正确使用版本号
  5. 减少镜像层数
  6. 及时删除临时文件和缓存文件
  7. 提高生成速度
  8. 调整合理的指令顺序
  9. 减少外部源干扰

总结

本章节主要介绍了Docker容器如何进行互通,以及容器互通时需要注意的事项以及细节,然后详细的介绍了Dockerfile各个关键字的含义,以及如何使用,到这里Docker入门的章节就结束了,后面会有一个Docker实战篇。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/317700.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【elfboard linux开发板】4. 文件点灯与创建多进程

ps:提升效率的小tips: 灵活运用vim操作命令,gg快速跳转到文件开头,G跳转到结尾 多行操作 ctrl V shift i 插入修改内容 esc退出编辑 sudo vi /etc/vim/vimrc 在文件中添加如下内容省略重复工作: autocmd BufNewFile …

分布式(8)

目录 36.什么是TCC? 37.分布式系统中常用的缓存方案有哪些? 38.分布式系统缓存的更新模式? 39.分布式缓存的淘汰策略? 40.Java中定时任务有哪些?如何演化的? 36.什么是TCC? TCC&#xff08…

数据库云平台新数科技完成B轮融资,打造全链路智能化数据库云平台

数据库云平台软件厂商「北京新数科技有限公司」(以下简称「新数科技」)已于2023年完成B1轮和B2轮融资,分别由渤海创富和彬复资本投资;义柏资本担任本轮融资独家财务顾问。 新数科技成立于2014年,当前产品矩阵包括数据库…

使用宝塔在Linux面板搭建网站,并实现公网远程访问

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 前言 宝塔面板作为简单好用的服务器运维管理面板,它支持Linux/Windows系统,我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等&…

【MPC学习笔记】01:MPC简介(Lecture 1_1 Unconstrained MPC)

本笔记来自北航诸兵老师的课程 课程地址:模型预测控制(2022春)lecture 1-1 Unconstrained MPC 文章目录 0 MPC 简介0.1 案例引入0.2 系统模型0.3 MPC的优点0.4 MPC的缺点0.5 MPC的未来 1 详细介绍 0 MPC 简介 0.1 案例引入 MPC(…

Linux进程以及计划任务

一.程序和进程以及线程 内核功用:进程管理、内存管理、文件系统、网络功能、驱动程序、安全功能等 对于所有的操作系统,都有基本的功能 1.程序 保存在硬盘、光盘等介质中的可执行代码和数据(硬盘上躺着) 静态保存的代码 执行…

x-cmd-pkg | JavaScript 运行时环境:node

目录 介绍首次用户技术特点竞品进一步阅读 介绍 Node.js 是一个开源、跨平台、异步事件驱动,基于 V8 引擎的 JavaScript 运行时环境,于 2009 年由 Ryan Dahl 创造,目的是为了实现高性能的网络应用开发。 性能表现良好:使用事件驱…

CMake入门教程【核心篇】宏模板(macro)

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「本文的内容」:CMake入门教程 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 1. 定义宏1.1 基本语…

图像分割-漫水填充法 floodFill

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 本文的C#版本请访问:图像分割-漫水填充法 floodFill (C#)-CSDN博客 FloodFill方法是一种图像处理算法&#…

微服务注册到Zookeeper注册中心

jar包&#xff1a; <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zookeeper-discovery</artifactId></dependency>启动类上面加入&#xff1a;EnableDiscoveryClient注解 application.ym…

AI计算,为什么要用GPU?

今天这篇文章&#xff0c;我们继续来聊聊芯片。 在之前的文章里&#xff0c;小枣君说过&#xff0c;行业里通常会把半导体芯片分为数字芯片和模拟芯片。其中&#xff0c;数字芯片的市场规模占比较大&#xff0c;达到70%左右。 数字芯片&#xff0c;还可以进一步细分&#xff0…

2024年报考软考中级时间什么时候?报考软考培训多少钱?

想在2024年报考软控中级的小伙伴一定对报考软考的时间、费用等都有所疑问&#xff0c;下面我就详细为大家说明关于软考报名的相关信息。 一、2024年软考中级考试安排在几月份啊 2024年软考中级考试时间安排暂未公布&#xff0c;参考往年软考考试时间的安排&#xff0c;2024年软…