文章目录
前言
这篇文章讲解Docker的高级用法,不适合丝毫不懂Docker的小白。如果你对于Docker没有任何了解,请移步至我的另一篇文章 Docker零基础教程 ,待了解了Docker基础,再来学习这篇文章。
一、Dockerfile
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。Docker images命令查看的所有镜像,本质来说都是Dockerfile生成的,因此我们可以利用Dockerfile来自定义生成我们想要的各种镜像。
另外,我们还可以通过Dockerfile把java项目打成镜像,运行在docker上,提高部署效率。
1、Dockerfile保留字介绍
FROM
基础镜像,当前新镜像是基于那个镜像的,指定一个已经存在的镜像作为模板,第一条必须是fromMAINTAINER
镜像维护者的姓名和邮箱地址RUN
容器构建时需要执行的命令EXPOSE
当前容器对外暴露的端口WORKDIR
指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点USER
指定该镜像以什么样的用户去执行,如果都不指定,默认是rootENV
用来在构建镜像过程中设置环境变量ADD
将宿主机目录下的文件拷贝进镜像且会自动处理UEL和解压tar压缩包COPY
类似ADD
,拷贝文件和目录到镜像中。VOLUME
容器数据卷,用于数据保存和持久化工作CMD
指定容器启动后要做的事ENTRYPOINT
也是用来指定一个容器启动时要运行的命令
2、Java项目打成镜像
现在主流的Java项目一般是SpringBoot搭建的,Springboot内置了tomcat,且开发、部署效率极高,因此本文我们也以Springboot项目为案例来演示。
-
新建一个简单的Springboot项目,创建controller并随便写个接口。最后通过maven的install打成jar包,端口号可以随意设置,我这里设置的是1995。
-
在Linux服务器下新建一个目录,用于存放jar包,把打好的jar包放到该目录下。此处我新建的目录命名为mydockerDemo。
然后在该目录下新建一个名为Dockerfile的文件。
-
编写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
- 在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。至此,我们已经打包镜像成功了。
- 通过
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]#
- 这样的话,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
- 使用compose需要先安装,参考 Docker安装Compose官方文档 进行安装,本文也是根据文档指示来安装的。
- 在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使用步骤
- 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
- 使用docker-compose.yml定义一个完整业务单元,安排好整体应用中的各个容器服务
- 最后,执行
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文件,运行所有的容器。