Dockerfile+docker-compose介绍

本篇介绍了Dockerfile的基础知识,包括FROM、MAINTAINER、RUN等指令的使用,详细讲解了如何构建和使用Dockerfile。此外,还探讨了docker-compose的概念,以及如何安装、使用docker-compose进行多容器应用的部署。最后,提供了设置mysql远程登录的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Dockerfile+docker-compose介绍

| 课程回顾

1、容器的启动命令是什么?

sudo docker start 容器名称/容器ID

2、镜像的删除命令是什么?

sudo docker rmi 镜像名称

| 预习检查

1、Dockerfile中的FROM是什么意思?

FROM 后面是基于什么镜像来构建镜像 

2、Dockerfile中的RUN是什么意思?

RUN 后面紧跟shell要执行的命令

| 章节目标

  1. Dockerfile概念。
  2. Dockerfile的文件命令介绍 。
  3. docker-compose概念。
  4. docker-compose使用介绍。
  5. 设置mysql远程登录

| 章节重点、难点

1)、重点

Dockerfile文件的创建。

2)、难点

Dockerfile的文件介绍。

| 知识点讲解

Dockerfile概念

1、什么是Dockerfile

​ Dockerfile是一个包含用于组合镜像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成镜像。

生成镜像的几种方式

在这里插入图片描述

2、基本结构

​ 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令

Dockerfile的文件介绍

1、FROM 指定基础镜像,必须是第一个指令

格式:

FROM <image> [AS <name>]
FROM <image>:[<tag>] [AS <name>]
FROM <image>[@<digest>] [AS <name>]

示例:

FROM centos:7

# 编译阶段 命名为 centos7
FROM centos:7 as centos7

ARG CODE_VERSION=7
FROM centos:${CODE_VERSION}

注:tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像

2、MAINTAINER 指定作者

格式:

MAINTAINER <name>

示例:

MAINTAINER hary_lei@qq.com
MAINTAINER hary_lei

sudo docker inspect dmw_redis #查看作者信息
3、RUN构建镜像时执行的命令

RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:

shell执行格式:

RUN <command>

exec执行格式:

RUN ["executable", "param1", "param2"]

示例:

RUN rm apache-tomcat-8.5.43.tar.gz      #shell执行
4、ADD将本地文件添加到容器中

ADD将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源。

语法:

ADD <src>... <dest>
ADD ["<src>",... "<dest>"] 用于支持包含空格的路径

示例:

ADD apache-tomcat-8.5.43.tar.gz /usr/local/   
# apache-tomcat-8.5.43.tar.gz添加到 usr/local下 ,可以使用* ?,*表示任意,?表示一个
5、COPY将本地文件添加到容器中

COPY和ADD类似,但不会自动解压,也不能访问网络资源。

6、CMD容器启动时才进行调用

语法:

CMD ["executable","param1","param2"]
CMD command param1 param2

示例:

CMD ["/usr/bin/supervisord"]
CMD /usr/sbin/sshd -D
7、ENTRYPOINT配置容器使其可执行化

语法:

ENTRYPOINT ["executable", "param1", "param2"] 
ENTRYPOINT command param1 param2

示例:

ENTRYPOINT ["java","-server","-Xms64m","-Xmx128m","-jar","dm-base-consumer-1.0-SNAPSHOT.jar"]

注:ENTRYPOINT与CMD非常类似,不同的是通过docker run 命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT

Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令
8、ENV设置环境变量

语法:

ENV <key> <value>
ENV <key>=<value> ... 

示例:

ENV JAVA_HOME=/usr/local/java/jdk1.8.0_212
ENV PATH=$JAVA_HOME/bin:$PATH
9、EXPOSE指定于外界交互的端口

语法:

EXPOSE <port> [<port>...]

示例:

EXPOSE 22
EXPOSE 8080

注:EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口。

10、WORKDIR指定工作目录,类似于cd命令

语法:

WORKDIR /path/to/workdir

示例:

WORKDIR /usr/local/

注:通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。

11、USER指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户

语法:

USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group

示例:

USER elsearch

注:使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。

12、讲解centos、jdk、tomcat的Dockerfile文件

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

13、使用Dockerfile构建镜像

语法:

sudo docker build [OPTIONS] PATH | URL | -

OPTIONS说明:

  • –tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式

示例:

#进入centos7文件的目录下运行
sudo docker build -t yi/centos7-ssh .    #.指的是当前目录下的Dockerfile文件
sudo docker build -t yi/centos7-jdk8u212 .
sudo docker build -t yi/centos7-tomcat8 .
14、docker问题

问题1:

容器中使用:ping www.baidu.com出现如下错误

ping: www.baidu.com: Name or service not known

解决办法:

vi /etc/resolv.conf   #修改DNS
#设置如下值
nameserver 8.8.8.8
nameserver 114.114.114.114

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-idpamBBB-1637312121622)(assets/1575514589964.png)]

问题2:

使用xshell登录不上容器

使用如下命令创建容器

sudo docker run -it -p 8080:8080 -p 23:22 --privileged=true --name tomcat8 web-demo /usr/sbin/init

修改sshd_config文件

vi /etc/ssh/sshd_config  
#Port 22    此处注释去了
#PermitRootLogin yes  此处注释去了

重启ssh服务

systemctl start sshd.service   #启动服务
systemctl restart sshd.service   #重启动服务

docker-compose概念

1、什么是docker-compose

docker-compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器,使用docker-compose不再需要使用shell脚本来启动容器。

docker-compose使用介绍

1、安装docker-compose

ubuntu安装

sudo apt install docker-compose -y 

centos7安装

sudo yum -y install epel-release
sudo yum -y install python-pip   #安装pip

sudo pip install --upgrade pip   #pip进行升级

sudo pip install docker-compose  #安装 如此条不能安装使用下面的
#pip install docker-compose --ignore-installed requests

sudo docker-compose -version  #查看版本


#第二种安装
#创建用户组docker
sudo groupadd docker
sudo gpasswd -a dmw docker
sudo service docker restart

sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

sudo docker-compose --version


2、解析docker-compose.yml文件
version: '2'    #表示该 Docker-Compose 文件使用的是 Version 2 file
services:

  redis:           # 指定服务名称
    build: /home/px2/envdm/Redis/    #指定Dockerfile所在路径
    environment:                     #定义环境变量
      - TZ=Asia/Shanghai             #指定时区
    mem_limit: 300M                 # 指定限制内存大小
    ports:                          # 指定端口映射
     - "6379:6379"
     
  elasticsearch:   # 指定服务名称
    build: /home/px2/envdm/Elasticsearch/    #指定 Dockerfile所在路径
    environment:
      - TZ=Asia/Shanghai
    mem_limit: 300M
    ports:                   # 暴露端口信息 - "宿主机端口:容器暴露端口"
     - "9200:9200"
     - "9300:9300"
     
networks: 
   default:
      external: 
        name: envdm      
        #使用已存在的网络  如果前面没有使用docker network  create envdm网络此处则会报错
3、docker-compose命令使用
#ps
sudo docker-compose ps   #列出所有运行容器

#logs
sudo docker-compose logs   #查看服务日志输出

#build
sudo docker-compose build  #构建或者重新构建服务

#start
sudo docker-compose start envdm_mysql_1  #启动指定服务已存在的容器

#stop
sudo docker-compose stop envdm_mysql_1   #停止已运行的服务的容器

#rm
sudo docker-compose rm envdm_mysql_1   #删除指定服务的容器

#up
sudo docker-compose up envdm_mysql_1   #构建、启动容器envdm_mysql_1
sudo docker-compose up -d #把当前目录下的docker-compose.yml中的所有服务构建镜像、启动容器

#kill
sudo docker-compose kill envdm_mysql_1  #通过发送 SIGKILL 信号来停止指定服务的容器
4、构建基础服务

如下图:

在这里插入图片描述

在linux的此目录下使用如下命令构建基础服务:

sudo docker-compose up -d

可能会出现有些安装包网络连接异常,或者版本不存在问题。docker-compose.yml文件中指定的Dockfile文件路径不对问题也需要注意。

设置mysql远程登录

1、登录容器
sudo docker exec -it envdm_mysql_1 /bin/bash #进入mysql容器
2、登录mysql数据库
mysql -uroot   #登录
3、切换数据库
use mysql
4、修改root密码为123456
update user set password=password('123456') where user='root' and host='localhost';
5、允许远程登录root用户
grant all privileges on *.* to root@'%' identified by '123456' with grant option;

如下图:

在这里插入图片描述

6、设置数据库其它配置
#爱旅行要设置最大连接数
#显示所有连接数  sleep状态是处于连接状态
show processlist;
#查看最大连接数
show variables like 'max_connections';
#修改最大连接数
set global max_connections=3000;
#显示非交互的等待时间
show global variables like 'wait_timeout';
#修改交互等待时间  单位秒
set global wait_timeout = 120;
<think>好的,我现在需要回答用户关于DockerfileDocker Compose的区别及使用场景的问题。首先,我得回忆一下两者的基本定义和用途。根据引用[3]和[4],Dockerfile是用于构建单个容器镜像的,而Docker Compose则是用来编排多个容器的。用户可能想知道在什么情况下应该使用哪一个,以及它们如何协同工作。 接下来,我需要比较它们的核心功能。Dockerfile通过一系列指令来定义镜像的构建过程,比如FROM、RUN、COPY等。而Docker Compose的YAML文件则定义了服务、网络、卷等,适合多容器应用。这里可以引用[3]提到的“单个容器的构建步骤”和“多容器编排”来强调区别。 然后,使用场景方面,用户可能需要具体例子。比如开发单服务应用时用Dockerfile,而微服务架构需要多个容器协作时用Compose。引用[4]提到Compose允许用一个命令启动整个应用,这很重要。还要注意用户可能提到的性能或管理上的考虑,比如是否应该把所有服务放在一个Dockerfile里,根据引用[1],这可能不是最佳实践,应该分开构建。 另外,用户可能对两者的协同使用感兴趣。例如,在Compose文件中引用多个Dockerfile构建的镜像,这样可以保持模块化。需要提到docker-compose up和build命令的区别,参考引用[2]中的内容,说明不同命令如何影响镜像构建和容器启动。 最后,确保回答结构清晰,分点说明区别、使用场景和协同工作方式。避免技术术语过多,用中文通俗解释。同时生成相关问题,帮助用户深入理解,比如如何组织多服务项目,或优化构建流程的问题。</think>### DockerfileDocker Compose的核心区别与使用场景 #### 一、核心定义 1. **Dockerfile** - 是**单个容器镜像的构建蓝图**,通过逐行指令(如 `FROM`, `RUN`, `COPY`)定义镜像的生成过程[^3]。 - 示例:构建一个包含Python环境的镜像 ```dockerfile FROM python:3.8 COPY . /app RUN pip install -r requirements.txt CMD ["python", "app.py"] ``` 2. **Docker Compose** - 是**多容器应用的编排工具**,通过YAML文件(`docker-compose.yml`)定义服务、网络、存储等关联配置[^4]。 - 示例:同时启动Web服务和数据库 ```yaml services: web: build: . ports: ["5000:5000"] db: image: postgres volumes: ["db_data:/var/lib/postgresql/data"] ``` --- #### 二、关键区别对比 | 维度 | Dockerfile | Docker Compose | |--------------|---------------------------------|----------------------------------| | **作用对象** | 单个容器 | 多容器组成的应用系统 | | **核心功能** | 镜像构建 | 服务编排与依赖管理 | | **执行方式** | `docker build -t <镜像名> .` | `docker-compose up` | | **适用场景** | 独立服务或微服务的镜像定制 | 开发/测试环境的多服务联调 | --- #### 三、典型使用场景 1. **优先使用Dockerfile的情况** - 需要定制化基础镜像(如特定软件包安装) - 构建可复用的组件(如公司内部通用Java环境镜像) - 持续集成/交付(CI/CD)中的镜像构建阶段 2. **必须使用Docker Compose的情况** - 多服务依赖(如Web应用+MySQL+Redis) - 需要统一管理网络和存储卷(如容器间共享配置文件) - 快速复现开发环境(团队成员通过`docker-compose up`一键启动) --- #### 四、协同工作模式 在实际项目中,两者通常**结合使用**: 1. 通过Dockerfile为每个服务构建独立镜像 2. 在`docker-compose.yml`中引用这些镜像,并定义服务间的依赖关系 ```yaml services: backend: build: ./backend # 指向包含Dockerfile的目录 depends_on: - db db: image: postgres:13 ``` 3. 使用`docker-compose up --build`同时构建镜像并启动服务[^2] --- #### 五、常见误区 1. **错误实践**:试图用单个Dockerfile构建多个服务 - ❌ 通过多阶段构建(multi-stage)生成多个镜像虽然可行,但会降低可维护性[^1] - ✅ 正确做法:每个服务独立Dockerfile + Compose编排 2. **性能陷阱**:`docker-compose build` vs `docker-compose up --build` - 前者强制重新构建镜像,后者仅在镜像不存在时构建[^2] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值