赞
踩
这篇文章讲解Docker的高级用法,不适合丝毫不懂Docker的小白。如果你对于Docker没有任何了解,请移步至我的另一篇文章 Docker零基础教程 ,待了解了Docker基础,再来学习这篇文章。
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。Docker images命令查看的所有镜像,本质来说都是Dockerfile生成的,因此我们可以利用Dockerfile来自定义生成我们想要的各种镜像。
另外,我们还可以通过Dockerfile把java项目打成镜像,运行在docker上,提高部署效率。
FROM
基础镜像,当前新镜像是基于那个镜像的,指定一个已经存在的镜像作为模板,第一条必须是fromMAINTAINER
镜像维护者的姓名和邮箱地址RUN
容器构建时需要执行的命令EXPOSE
当前容器对外暴露的端口WORKDIR
指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点USER
指定该镜像以什么样的用户去执行,如果都不指定,默认是rootENV
用来在构建镜像过程中设置环境变量ADD
将宿主机目录下的文件拷贝进镜像且会自动处理UEL和解压tar压缩包COPY
类似 ADD
,拷贝文件和目录到镜像中。VOLUME
容器数据卷,用于数据保存和持久化工作CMD
指定容器启动后要做的事ENTRYPOINT
也是用来指定一个容器启动时要运行的命令现在主流的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
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]#
Compose是Docker公司推出的一个工具软件,可以管理多个Docker容器组成一个应用。你需要定义一个yaml格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器。
比如,你需要在容器中跑redis,mysql,rabbitmq还有其他组件,如果一个一个run岂不是很费劲。借助compose,我们通过配置文件,一键启动所有容器,方便快捷。
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
一文件
两要素
docker-compose up
命令来启动并运行整个应用程序,完成一键部署上线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
停止服务在本文的 一、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文件,运行所有的容器。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。