【Docker系列】Dockerfile基础命令、运行指令和容器间的通信

Dockerfile基础命令

  • FROM - 基于基准镜像
    • FROM centos #制作基准镜像(基于centos:lastest)
      FROM scratch #不依赖任何基准镜像base image
      FROM tomcat: 9.0.22-jdk8-openjdk
      尽量使用官方提供的Base Image
  • LABEL & MAINTAINER - 说明信息
    • MAINTAINER mashibing.com
      LABEL version = “1.0”
      LABEL description = “马士兵教育”
  • WORKDIR - 设置工作目录
    • WORKDIR /usr/local
      WORKDIR /usr/local/newdir #自动创建
      尽量使用绝对路径
  • ADD & COPY - 复制文件
    • ADD hello / #复制到根路径
      ADD test.tar.gz / #添加根目录并解压
      ADD 除了复制,还具备添加远程文件功能
  • ENV - 设置环境常量
    • ENV JAVA_HOME /usr/local/openjdk8
      RUN ${JAVA_HOME}/bin/java -jar test.jar
      尽量使用环境常量,可提高程序维护性
  • 暴露容器端口
    • EXPOSE
    • docker run -p 8000:8080 tomcat

Dockerfile运行指令

  • RUN & CMD & ENTRYPOINT

    • RUN : 在Build构建时执行命令
      ENTRYPOINT : 容器启动时执行的命令
      CMD : 容器启动后执行默认的命令或参数
      在这里插入图片描述
    • RUN-构建时运行
      • RUN yum install -y vim #Shell 命令格式
        • 使用Shell执行时,当前shell是父进程,生成一个子shell进程
          在子shell中执行脚本。脚本执行完毕,退出子shell,回到当前shell。
      • RUN [“yum”,“install”,"-y",“vim”] #Exec命令格式
        • 使用Exec方式,会用Exec进程替换当前进程,并且保持PID不变
          执行完毕,直接退出,并不会退回之前的进程环境
    • ENTRYPOINT启动命令
      • ENTRYPOINT(入口点)用于在容器启动时执行命令
        Dockerfile中只有最后一个ENTRYPOINT会被执行
        ENTRYPOINT [“ps”] #推荐使用Exec格式
    • CMD默认命令
      • CMD用于设置默认执行的命令
        如Dockerfile中出现多个CMD,则只有最后一个被执行
        如容器启动时附加指令,则CMD被忽略
        CMD [“ps” , “-ef”] #推荐使用Exec格式
  • 实验

    • FROM centos
      RUN ["echo", "image building!!!"]
      CMD ["echo", "container starting..."]
      
      [root@mac_linux docker_run]# docker build -t zdc.com/docker_run .
      Sending build context to Docker daemon  2.048kB
      Step 1/3 : FROM centos
       ---> 831691599b88
      Step 2/3 : RUN ["echo", "image building!!!"]
       ---> Running in efb2ba63586d
      image building!!!          #镜像构造时会运行
      Removing intermediate container efb2ba63586d
       ---> a3149dd07315
      Step 3/3 : CMD ["echo", "container starting..."]    
       ---> Running in 5494ecc5183d
      Removing intermediate container 5494ecc5183d
       ---> ac3fed96c1eb
      Successfully built ac3fed96c1eb
      Successfully tagged zdc.com/docker_run:latest
      [root@mac_linux docker_run]# docker run zdc.com/docker_run
      container starting...     #容器启动时会运行
      [root@mac_linux docker_run]# docker run zdc.com/docker_run  ls   #如果启动容器时指定了ls这个指令  cmd会被忽略
      bin
      dev
      etc
      home
      lib
      lib64
      lost+found
      
      #修改Dockerfile文件
      FROM centos
      RUN ["echo", "image building!!!"]
      ENTRYPOINT ["echo", "container starting..."]
      
      
      [root@mac_linux docker_run]# docker build -t zdc.com/docker_run .
      Sending build context to Docker daemon  2.048kB
      Step 1/3 : FROM centos
       ---> 831691599b88
      Step 2/3 : RUN ["echo", "image building!!!"]
       ---> Using cache
       ---> a3149dd07315
      Step 3/3 : ENTRYPOINT ["echo", "container starting..."]
       ---> Running in af85e6d896db
      Removing intermediate container af85e6d896db
       ---> 5f1824830fab
      Successfully built 5f1824830fab
      Successfully tagged zdc.com/docker_run:latest
      [root@mac_linux docker_run]# docker run zdc.com/docker_run
      container starting...    #此时与cmd的区别
      
      #再修改Dockerfile文件
      FROM centos
      RUN ["echo", "image building!!!"]
      ENTRYPOINT ["ps"]
      CMD ["ef"]
      
      [root@mac_linux docker_run]# docker build -t zdc.com/docker_run .
      Sending build context to Docker daemon  2.048kB
      Step 1/4 : FROM centos
       ---> 831691599b88
      Step 2/4 : RUN ["echo", "image building!!!"]
       ---> Using cache
       ---> a3149dd07315
      Step 3/4 : ENTRYPOINT ["ps"]
       ---> Running in 4e9f64968cff
      Removing intermediate container 4e9f64968cff
       ---> 2bc580ec7098
      Step 4/4 : CMD ["ef"]
       ---> Running in 501245cc9132
      Removing intermediate container 501245cc9132
       ---> eec1f9cc691a
      Successfully built eec1f9cc691a
      Successfully tagged zdc.com/docker_run:latest
      [root@mac_linux docker_run]# docker run zdc.com/docker_run
        PID TTY      STAT   TIME COMMAND    #ENTRYPOINT ["ps"]  CMD ["ef"]联合使用
        
      [root@mac_linux docker_run]# docker run zdc.com/docker_run -aux   #如果给了aux参数  会代替cmd命令
      USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
      root         1  0.0  0.0  47496  1796 ?        Rs   13:30   0:00 ps -aux 
      
      

      ENTRYPOINT一定会被执行,如果有多个 只有最后一个执行。

      运行时如果指定了参数CMD会被忽略

      如果ENTRYPOINT和CMD同时存在,会结合,而且如果指定了参数,CMD会被忽略。

REDIS的镜像构建

在这里插入图片描述

  • FROM centos
    RUN ["yum" , "install" , "-y" ,"gcc","gcc-c++","net-tools","make"]
    WORKDIR /usr/local
    ADD redis-4.0.14.tar.gz .            #.代表工作目录
    WORKDIR /usr/local/redis-4.0.14/src
    RUN make && make install
    WORKDIR /usr/local/redis-4.0.14
    ADD redis-7000.conf .      #放置配置文件
    EXPOSE 7000         #对外暴露7000端口号
    CMD ["redis-server","redis-7000.conf"]
    
    
    docker built -t zdc.com/docker-redis .
    docker run -d -p 7000:7000 zdc.com/docker-redis
    
    
  • reids在docker hub中已经存在

清空docker images

  • 1.进入root权限
    
    sudo su
    
    2.停止所有的container,这样才能够删除其中的images:
    
    docker stop $(docker ps -a -q)
    
    如果想要删除所有container的话再加一个指令:
    
    docker rm $(docker ps -a -q)
    
    3.查看当前有些什么images
    
    docker images
    
    4.删除images,通过image的id来指定删除谁
    
    docker rmi <image id>
    
    想要删除untagged images,也就是那些id为<None>的image的话可以用
    
    docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
    
    要删除全部image的话
    
    docker rmi $(docker images -q)
    
    

容器间的单向访问

在这里插入图片描述

  • 容器内部有一个虚拟IP,但docker每创建出一个container,IP地址都会发生改变。所以容器间进行通信时不建议使用IP。

  • 给每个容器起一个名字,通信时使用名字。 –name指定名字 inspect 查看容器原始配置信息 看一看虚拟IP。–link containerName

    • docker run -d --name web tomcat
      docker run -d --name database -it centos /bin/bash
      
      docker inspect id  //查看ip  
      #两个容器间的ip是互通的
      docker run -d --name web --link database tomcat  #tomcat内部可以ping database  通过名字可以ping通
      
      

在这里插入图片描述

在这里插入图片描述

Bridge网桥双向通信

  • <img src=“docker.assets/image-20200718233118747.png” alt=“image-20200718233118747” styl在这里插入图片描述
    =“zoom:50%;” />

    • docker network ls docker network create -d bridge my-bridge docker network connect my-bridge xxx
    [root@mac_linux docker-redis]# docker run -d --name web tomcat
    1859441a12746353a824f4af9a7626279be62f39da1beefbfa933ed4eba6329f
    [root@mac_linux docker-redis]# docker run -d --name database -it centos /bin/bash
    dadb1b4f5e13ac1272d1894178e72cd7f2468d5e811472f3f96cc75192d19f0a
    [root@mac_linux docker-redis]# docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    c354ebcdf1d7        bridge              bridge              local    #默认网桥  与
    da545125e8f9        host                host                local
    09bbd93c6126        none                null                local
    [root@mac_linux docker-redis]# docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    c354ebcdf1d7        bridge              bridge              local
    da545125e8f9        host                host                local
    4ba7cd11b3d4        my-bridge           bridge              local
    09bbd93c6126        none                null                local
    [root@mac_linux docker-redis]# docker network connect my-bridge web   #两个容器都绑定到该网桥 这样就可以互通了
    [root@mac_linux docker-redis]# docker network connect my-bridge database
    
    

在这里插入图片描述

  • 通过虚拟网卡做地址转换通过物理网卡到外部 外部到容器反之。

Volume容器间共享数据

在这里插入图片描述

在这里插入图片描述

宿主机的文件共享到其他容器。

  • 方法

    • 通过设置-v挂载宿主机目录 -v

      • 格式:
        docker run --name 容器名  -v 宿主机路径:容器内挂载路径 镜像名
        实例:
        docker run --name t1 -v /usr/webapps:/usr/local/tomcat/webapps tomcat   //路径不存在 宿主机和容器都会创建
        
        
    • 通过–volumes-from 共享容器内挂载点 **创建一个容器,让它作为共享容器 修改挂载路径,只需修改这个即可 **

      –volumes-from

      • docker create --name webpage 
                       -v /usr/webapps:/usr/local/tomcat/webapps tomcat /bin/true
                       
        docker run --volumes-from webpage --name t1 -d tomcat
        
        

Docker-compose

在这里插入图片描述

  • Docker Compose

    • Docker Compose 单机多容器部署工具
    • 通过yml文件定义多容器如何部署
    • WIN/MAC默认提供Docker Compose,Linux需安装
  • 安装docker compose

  • 实验

    • For example, if you named your directory my_wordpress:

      cd my_wordpress/
      
      

      Create a docker-compose.yml file that starts your WordPress blog and a separate MySQL instance with a volume mount for data persistence:

      version: '3.3'
      
      services:
         db:
           image: mysql:5.7
           volumes:
             - db_data:/var/lib/mysql
           restart: always
           environment:
             MYSQL_ROOT_PASSWORD: somewordpress
             MYSQL_DATABASE: wordpress
             MYSQL_USER: wordpress
             MYSQL_PASSWORD: wordpress
      
         wordpress:
           depends_on:
             - db
           image: wordpress:latest
           ports:
             - "8000:80"
           restart: always
           environment:
             WORDPRESS_DB_HOST: db:3306
             WORDPRESS_DB_USER: wordpress
             WORDPRESS_DB_PASSWORD: wordpress
             WORDPRESS_DB_NAME: wordpress
      volumes:
          db_data: {}
      
      

      run docker-compose up -d from your project directory.

部署实例

在这里插入图片描述

zhangdacheng@zhangdachengdeMacBook-Pro bsbdj % tree
.
├── bsbdj-app
│   ├── Dockerfile
│   ├── application-dev.yml
│   ├── application.yml
│   └── bsbdj.jar
├── bsbdj-db
│   ├── Dockerfile
│   └── init-db.sql
└── docker-compose.yml

FROM openjdk:8u222-jre
WORKDIR /usr/local/bsbdj
ADD bsbdj.jar .
ADD application.yml .
ADD application-dev.yml .
EXPOSE 80
CMD ["java","-jar","bsbdj.jar"]

FROM mysql:5.7
WORKDIR /docker-entrypoint-initdb.d
ADD init-db.sql .

version: '3.3'     #
services:
  db:              #为创建的容器起名字   也是通信的主机名
    build: ./bsbdj-db/        
    restart: always   #容器down掉后,会重新启动新容器进行替换
    environment:      #启动容器时 会执行这个命令
      MYSQL_ROOT_PASSWORD: root  
  app:
    build: ./bsbdj-app/
    depends_on:      #设置依赖,  容器的依赖,设置网络上的互通
      - db
    ports:
      - "80:80"     #端口映射
    restart: always

  • 命令

docker-compose up -d

docker-compose logs ' #查看日志

docker-compose down 删除容器

  • mysql

    • 容器启动时设置密码

      • docker run -d  -e MYSQL_ROOT_PASSWORD=root  mysql
        
        
    • 初始化数据库 把sql文件放入docker-entrypoint-initdb.d目录即可

      • WORKDIR /docker-entrypoint-initdb.d
        ADD init-db.sql .
        
        

在这里插入图片描述

将spring boot项目成jar包,并把配置文件等放在jar包外部 https://blog.csdn.net/pei19890521/article/details/80984707

上传到dockerhub上

在dockerhub上创建swagger:

docker tag calix-swagger:latest zdcsmart/calix-swaggerdocker push zdcsmart/calix-swagger

docker push zdcsmart/calix-swagger

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小夕Coding

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

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

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

打赏作者

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

抵扣说明:

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

余额充值