三天入门 Docker - 第二天:Dockerfile 基本介绍与使用

前言

在日常工作中,大家应该都或多或少的使用过很多镜像,但是不知道大家在使用的时候,有没有想过我们使用的镜像,是如何生成的,以及镜像里面的环境信息等。其实啊,不管是在哪拉取的镜像,这些镜像都是由 Dockerfile 提前构建好的,并且镜像里面的一些环境信息都是由镜像作者自己配置的。所以说在有些情况下,我们自己使用 Dockerfile 来构建的镜像,效果可能更好。

一、Dockerfile 介绍

Dockerfile 是由一组指令组成的文件,其中每条指令对应 Linux 中的一条命令,并且支持以 # 开头的注释行;一般来说,Dockerfile 结构大致分为四个部分:基础镜像、维护者信息、镜像操作指令和容器启动时的运行命令。 Dockerfile 官方介绍

我们前面说的 Docker 是由一系列的层组成,这里的层,就是我们 Dockerfile 文件中运行的指令,每条指令相当于说都是一个层,并且会进行累加,也就是说,当我们运行的指令过多时,生成出来的镜像便会很大。


Dockerfile 常见的操作指令:

指令作用
FROM用来指定基础镜像(即,我们使用什么镜像来制作新的镜像)
MAINTAINER说明制作镜像的作者信息
RUN我们在要基础镜像上运行的命令
EXPORT给我们制作的镜像开放需要的端口
ADD可以将宿主机中的 文件/目录 传送到镜像中(当传送的为 tar 包时,会自动进行解压)
COPY可以将宿主机中的 文件/目录 传送到镜像中(文件/目录 需要和 Dockerfile 位于相同目录)
WORKDIR指定工作目录
ENV给容器配置环境变量
VOLUME给容器创建一个挂载点
USER可以指定容器的运行用户
CMD容器启动时要运行的命令或脚本(当有多条 CMD 命令时,最后一条生效)

二、使用 Dockerfile 实现自建镜像

准备工作:

主机名操作系统IP 地址
DockerCentOS 7.x192.168.1.4
  • 这里博主直接使用的是前面文章中的 Docker 环境:传送门

1.自建 Nginx 镜像

1)编写 Dockerfile 文件

[root@Docker ~]# mkdir nginx
[root@Docker ~]# cd nginx/
[root@Docker nginx]# wget http://nginx.org/download/nginx-1.18.0.tar.gz
[root@Docker nginx]# vim Dockerfile
# 配置基础镜像
FROM dadoha/centos7.4.1708
# 配置作者信息
MAINTAINER [河北彭于晏]
# 安装相关软件包
RUN yum clean all && yum -y install proc-devel net-tools gcc zlib zlib-devel make openssl-devel wget
#  Nginx 软件包传到容器中
ADD nginx-1.18.0.tar.gz /usr/src/
# 配置工作目录
WORKDIR /usr/src/nginx-1.18.0/
# 进行编译安装
RUN ./configure --prefix=/usr/local/nginx && make && make install
# 开启端口
EXPOSE 80 443
# 修改 Nginx 配置文件. 以非 Daemon(后台) 方式启动
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
# 复制启动脚本
COPY run.sh /
RUN chmod 755 /run.sh
# 运行启动脚本
CMD ["/run.sh"]

2)配置启动脚本

[root@Docker nginx]# cat <<END > run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
END

3)生成镜像

[root@Docker nginx]# docker build -t nginx:1.18 .

4)启动容器并验证

[root@Docker nginx]# docker images | grep 1.18
[root@Docker nginx]# docker run -d --name Nginx -p 31888:80 nginx:1.18

在这里插入图片描述

2.自建 Tomcat 镜像

1)下载相关软件包

[root@Docker ~]# mkdir tomcat
[root@Docker ~]# cd tomcat
[root@Docker tomcat]# ls
apache-tomcat-8.5.32.tar.gz  jdk-8u181-linux-x64.tar.gz

2)编写 Dockerfile 文件

[root@Docker tomcat]# vim Dockerfile
FROM dadoha/centos7.4.1708
MAINTAINER [河北彭于晏]
ADD jdk-8u181-linux-x64.tar.gz /usr/local/
ENV JAVA_HOME /usr/local/jdk1.8.0_181
ENV PATH $PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
ENV CLASSPATH $JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
ADD apache-tomcat-8.5.32.tar.gz /usr/local/
EXPOSE 8080
ADD run.sh /
RUN chmod 755 /run.sh
CMD ["/run.sh"]

3)配置启动脚本

[root@Docker tomcat]# cat <<END > run.sh
#!/bin/bash
/usr/local/apache-tomcat-8.5.32/bin/startup.sh
tailf /run
END

4)生成镜像

[root@Docker tomcat]# docker build -t tomcat:8.5.32 .

5)启动容器并验证

[root@Docker tomcat]# docker run -d --name tomcat -p 8888:8080 tomcat:8.5.32

在这里插入图片描述

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
我想将frontend 也是用volumes,将其映射到/app/frontend目录,在/app/frontend下install以及build,如何实现 docker-compose.yml文件: version: '3' services: frontend: build: context: ./frontend dockerfile: Dockerfile ports: - 8010:80 restart: always backend: build: context: ./backend dockerfile: Dockerfile volumes: - /app/backend:/app environment: - CELERY_BROKER_URL=redis://redis:6379/0 command: python manage.py runserver 0.0.0.0:8000 ports: - 8011:8000 restart: always celery-worker: build: context: ./backend dockerfile: Dockerfile volumes: - /app/backend:/app environment: - CELERY_BROKER_URL=redis://redis:6379/0 command: celery -A server worker -l info --pool=solo --concurrency=1 depends_on: - redis - backend restart: always celery-beat: build: context: ./backend dockerfile: Dockerfile volumes: - /app/backend:/app environment: - CELERY_BROKER_URL=redis://redis:6379/0 command: celery -A server beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler depends_on: - redis - backend restart: always redis: image: redis:latest ports: - 6379:6379 restart: always mysql: image: mysql:latest environment: - MYSQL_ROOT_PASSWORD=sacfxSql258147@ ports: - 8016:3306 volumes: - ./mysql:/var/lib/mysql restart: always frontend:dockerfile文件 FROM node:16.18.1 WORKDIR /app/frontend COPY package*.json ./ RUN npm install COPY . . RUN npm run build:prod FROM nginx:latest COPY --from=0 /app/frontend/dist/ /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
07-14
要将前端的代码映射到容器内的`/app/frontend`目录,并在容器内进行安装和构建,可以通过在`docker-compose.yml`文件中为`frontend`服务添加一个卷来实现。更新后的`docker-compose.yml`文件如下所示: ```yaml version: '3' services: frontend: build: context: ./frontend dockerfile: Dockerfile ports: - 8010:80 volumes: - ./frontend:/app/frontend restart: always backend: build: context: ./backend dockerfile: Dockerfile volumes: - /app/backend:/app environment: - CELERY_BROKER_URL=redis://redis:6379/0 command: python manage.py runserver 0.0.0.0:8000 ports: - 8011:8000 restart: always celery-worker: build: context: ./backend dockerfile: Dockerfile volumes: - /app/backend:/app environment: - CELERY_BROKER_URL=redis://redis:6379/0 command: celery -A server worker -l info --pool=solo --concurrency=1 depends_on: - redis - backend restart: always celery-beat: build: context: ./backend dockerfile: Dockerfile volumes: - /app/backend:/app environment: - CELERY_BROKER_URL=redis://redis:6379/0 command: celery -A server beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler depends_on: - redis - backend restart: always redis: image: redis:latest ports: - 6379:6379 restart: always mysql: image: mysql:latest environment: - MYSQL_ROOT_PASSWORD=sacfxSql258147@ ports: - 8016:3306 volumes: - ./mysql:/var/lib/mysql restart: always ``` 这样,将会把本地的`./frontend`目录映射到容器内的`/app/frontend`目录。然后,在容器内部构建过程中,使用`/app/frontend`目录中的代码进行安装和构建。 请注意,这里假设`docker-compose.yml`文件和`frontend`目录在同一级目录下。如果不是,请相应调整`volumes`中的路径。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愿许浪尽天涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值