Docker进阶教程


前言

这篇文章讲解Docker的高级用法,不适合丝毫不懂Docker的小白。如果你对于Docker没有任何了解,请移步至我的另一篇文章 Docker零基础教程 ,待了解了Docker基础,再来学习这篇文章。


一、Dockerfile

Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。Docker images命令查看的所有镜像,本质来说都是Dockerfile生成的,因此我们可以利用Dockerfile来自定义生成我们想要的各种镜像。
另外,我们还可以通过Dockerfile把java项目打成镜像,运行在docker上,提高部署效率。

1、Dockerfile保留字介绍

  1. FROM 基础镜像,当前新镜像是基于那个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from
  2. MAINTAINER 镜像维护者的姓名和邮箱地址
  3. RUN 容器构建时需要执行的命令
  4. EXPOSE 当前容器对外暴露的端口
  5. WORKDIR 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
  6. USER 指定该镜像以什么样的用户去执行,如果都不指定,默认是root
  7. ENV 用来在构建镜像过程中设置环境变量
  8. ADD 将宿主机目录下的文件拷贝进镜像且会自动处理UEL和解压tar压缩包
  9. COPY 类似 ADD ,拷贝文件和目录到镜像中。
  10. VOLUME 容器数据卷,用于数据保存和持久化工作
  11. CMD 指定容器启动后要做的事
  12. ENTRYPOINT 也是用来指定一个容器启动时要运行的命令

2、Java项目打成镜像

现在主流的Java项目一般是SpringBoot搭建的,Springboot内置了tomcat,且开发、部署效率极高,因此本文我们也以Springboot项目为案例来演示。

  1. 新建一个简单的Springboot项目,创建controller并随便写个接口。最后通过maven的install打成jar包,端口号可以随意设置,我这里设置的是1995。
    在这里插入图片描述

  2. 在Linux服务器下新建一个目录,用于存放jar包,把打好的jar包放到该目录下。此处我新建的目录命名为mydockerDemo。
    然后在该目录下新建一个名为Dockerfile的文件。
    在这里插入图片描述

  3. 编写Dockerfile的内容,如下所示

#基础镜像使用java
FROM java:8

#作者
MAINTAINER yangs

#VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp

#将jar包添加到容器中并更名为zzyy_docker.jar
ADD docker_boot-0.0.1-SNAPSHOT.jar zzyy_docker.jar

#运行jar包
RUN bash -c 'touch /zzyy_docker.jar'
ENTRYPOINT ["java","-jar","/zzyy_docker.jar"]

#因为我的springboot项目端口是1995,所以暴露1995端口
EXPOSE 1995
  1. 在mydockerDemo目录下执行docker build -t zzyy_docker:1.6 . 命令。该命令会读取Dockerfile文件,打包成镜像。
[root@hecs-340056 mydockerDemo]# docker build -t zzyy_docker:1.6 .
Sending build context to Docker daemon  17.63MB
Step 1/7 : FROM java:8
8: Pulling from library/java
5040bd298390: Pull complete 
fce5728aad85: Pull complete 
76610ec20bf5: Pull complete 
60170fec2151: Pull complete 
e98f73de8f0d: Pull complete 
11f7af24ed9c: Pull complete 
49e2d6393f32: Pull complete 
bb9cdec9c7f3: Pull complete 
Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
Status: Downloaded newer image for java:8
 ---> d23bdf5b1b1b
Step 2/7 : MAINTAINER yangs
 ---> Running in 744d56dc451a
Removing intermediate container 744d56dc451a
 ---> 8a93fa661918
Step 3/7 : VOLUME /tmp
 ---> Running in 3d97929e362e
Removing intermediate container 3d97929e362e
 ---> 7991201a4028
Step 4/7 : ADD docker_boot-0.0.1-SNAPSHOT.jar zzyy_docker.jar
 ---> dacf65c0fce0
Step 5/7 : RUN bash -c 'touch /zzyy_docker.jar'
 ---> Running in 93e28d836895
Removing intermediate container 93e28d836895
 ---> 488e9b3b2f3f
Step 6/7 : ENTRYPOINT ["java","-jar","/zzyy_docker.jar"]
 ---> Running in 0af60a16f4ff
Removing intermediate container 0af60a16f4ff
 ---> 5fc59b06aacf
Step 7/7 : EXPOSE 1995
 ---> Running in 62f96b8fd04e
Removing intermediate container 62f96b8fd04e
 ---> 93e23aa759bd
Successfully built 93e23aa759bd
Successfully tagged zzyy_docker:1.6
[root@hecs-340056 mydockerDemo]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
zzyy_docker     1.6       93e23aa759bd   7 seconds ago   678MB
java            8         d23bdf5b1b1b   5 years ago     643MB

从上文的docker images命令可以看出,我们的jar包已经打成了zzyy_docker镜像,tag是设置的1.6。至此,我们已经打包镜像成功了。

  1. 通过 docker run 命令运行镜像,并通过ps命令观察效果。
[root@hecs-340056 mydockerDemo]# docker run -d -p 1995:1995  zzyy_docker:1.6 
d257a354daa74ac9fbec0e09f09bb0990636291438d49861423376cdb5c675d2
[root@hecs-340056 mydockerDemo]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS         PORTS                                                                                  NAMES
d257a354daa7   zzyy_docker:1.6       "java -jar /zzyy_doc…"   10 seconds ago   Up 8 seconds   0.0.0.0:1995->1995/tcp, :::1995->1995/tcp                                              eloquent_euler
[root@hecs-340056 mydockerDemo]# 
  1. 这样的话,springboot项目打成镜像并运行成功。从浏览器访问接口验证是否成功。
    我的接口路径是 http://102.113.154.122:1995/test/sayHello?name=yangs 。你们要访问自己的接口。

二、Compose

Compose是Docker公司推出的一个工具软件,可以管理多个Docker容器组成一个应用。你需要定义一个yaml格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器。
比如,你需要在容器中跑redis,mysql,rabbitmq还有其他组件,如果一个一个run岂不是很费劲。借助compose,我们通过配置文件,一键启动所有容器,方便快捷。

1、安装Compose

  1. 使用compose需要先安装,参考 Docker安装Compose官方文档 进行安装,本文也是根据文档指示来安装的。
  2. 在Linux下依次执行以下命令即可。
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v2.7.0/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
docker compose version

2、Compose核心概念

  • 一文件
    docker-compose.yml
  • 两要素
    服务(service):一个个应用容器实例,比如订单微服务、库存微服务、mysql容器、nginx容器等。
    工程(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义。

3、Compose使用步骤

  1. 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
  2. 使用docker-compose.yml定义一个完整业务单元,安排好整体应用中的各个容器服务
  3. 最后,执行 docker-compose up 命令来启动并运行整个应用程序,完成一键部署上线

4、Compose常用命令

  • docker-compose -h 查看帮助
  • docker-compose up 启动所有docker-compose服务
  • docker-compose up -d 启动所有docker-compose服务并后台运行
  • docker-compose down 停止并删除容器、网络、卷、镜像
  • docker-compose exec yml里面的服务id 进入容器实例内部
  • docker-compose ps 展示当前docker-compose编排过的运行的所有容器
  • docker-compose top 展示当前docker-compose编排过的容器进程
  • docker-compose logs yml里面的服务id 查看容器输出日志
  • docker-compose config 检查配置
  • docker-compose config -q 检查配置,有问题才有输出
  • docker-compose restart 重启服务
  • docker-compose start 启动服务
  • docker-compose stop 停止服务

5、Compose启动多个容器

在本文的 一、2 Java项目打成镜像章节 中,我们把一个简单的springboot项目打成jar包,形成镜像,并通过docker run命令跑在docker里面。
这个springboot项目仅仅包含一个最简单的接口,并没有连接数据库和redis,现在做个假设,假如这个springboot项目连接了数据库和redis,我们是不是需要先启动一个mysql,然后再启动一个redis,才能开始启动springboot项目啊。现在我们就以compose的方式去启动mysql、redis和这个springboot项目,要注意启动顺序,需要先运行mysql和redis,才能启动springboot。
接下里我们编写docker-compose.yml文件

#compose的版本
version:"3"

services:
	#自定义的sprinboot名字
    myService: 
    	#上面打包springboot的镜像名字
        image: zzyy_docker:1.6 
        #容器自定义的名称
        container_name: ms01
        ports: 
         -"1995:1995"
        #容器数据卷
        volumes: 
         - /app/microService:/data
   		#这个容器要依赖于redis和mysql先启动
   		network:
   		 - myNet
        depends_on: 
         - redis
         - mysql
	
    redis: 
        image: redis:6.0.8
        ports: 
         - "6379:6379"
        volumes: 
         - /app/redis/redis.conf:/etc/redis/redis.conf
         - /app/redis/data:/data
        network:
   		 - myNet
        command: redsi-server /etc/redis/redis.conf

    mysql: 
        image: mysql:5.7
        environment: 
          MYSQL_ROOT_PASSWORD: '123456'
          MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
          MYSQL_DATABASE: 'db2021'
          MYSQL_USER: 'zzyy'
          MYSQL_PASSWORD: 'zzyy123'
        ports:
       	 - "3306:3306"
       	volumes: 
         - /app/mysql/db:/var/lib/mysql
         - /app/mysql/conf/my.cnf:/etc/my.cnf
         - /app/mysql/init:/docker-entrypoint-initdb.d
        network:
   		 - myNet
        command: --default-authentication-plugin=mysql_native_password #解决外部无法访问

#定义一个网络
networks:
	myNet:

编写好docker-compose.yml后,在linux找个目录放进去,比如放在了 /myCompose目录下,在该目录下执行 docker-compose config -q 命令查看yml文件有没有错误,如果没有错误不会输出任何信息。
最后使用 docker-compose up -d 命令读取yml文件,运行所有的容器。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小Y先生。

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

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

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

打赏作者

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

抵扣说明:

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

余额充值