当前位置: 首页 > news >正文

Docker(02) Docker-Compose、Dockerfile镜像构建、Portainer

 Docker-Compose

1、Docker Desktop

在Windows上安装Docker服务,可以使用Docker Desktop这个应用程序。

下载并安装这样的一个安装包

安装好后:执行命令 

docker --version

从Docker Hub提取hello-world映像并运行一个容器:

docker run hello-world

这行命令会让docker从官方仓库中拉去hello-world的镜像到本地,并且自动将其实例化成容器

标签含义
REPOSITORY镜像所在的仓库名称
TAG镜像标签
IMAGEID镜像ID
CREATED镜像的创建日期(不是获取该镜像的日期)
SIZE镜像大小

Docker Desktop dashboard是docker的UI工具


2、镜像源修改设置

  "registry-mirrors": ["https://8y2y8njn.mirror.aliyuncs.com"]

docker 的镜像源持续更新地址 :

国内能用的Docker镜像源【2025最新持续更新】_docker 镜像-CSDN博客


3、Docker-Compose

Docker-Compose是Docker公司推出的一个工具软件,负责实现对Docker容器集群的快速编排。

Docker Compose和Docker版本对应关系:Compose file version 3 reference | Docker Docs

Docker Compose下载,下载这样的一个文件

docker-compose --version


4、docker-compose.yml

docker-compose.yml

Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。 

Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)

使用docker-compose前提情况,需要创建一个文件名为docker-compose.yml的文件。

version: '3'services:tomcat:restart: alwaysimage: tomcatcontainer_name: tomcatports:- 8080:8080volumes:- d://docker/tomcat/webapps:/usr/local/tomcat/webapps- d://docker/tomcat/logs:/usr/local/tomcat/logsenvironment:TZ: Asia/Shanghai

version:’3’ :表示compose对docker版本的支持,这里是compose版本,并非是docker版本。

services: 表示一个该配置文件的所有容器实例,支持配置多个容器实例。

tomcat:表示是一个多个容器中的其中一个

restart: always:表示该容器实例是随着机器启动而启动。

image: tomcat:表示本容器使用的镜像是tomcat,如需要指定版本号则 image: tomcat:8.0。

container_name: tomcat:表示容器的一个别名。

ports:表示容器端口映射到宿主机端口。

volumes:表示dockers容器的数据卷,将容器实例的目录映射到宿主机上盘符目录。

environment:表示容器环境的设置,我这里配置的是tomcat容器的时区时间为亚洲/上海。

后台启动配置中创建的容器:docker-compose up -d

停止配置中创建的容器:docker-compose stop
删除配置中创建的容器:docker-compose down

docker-compose config -q #检查配置,有问题才有输出

docker-compose logs yml里面的服务id  #查看容器输出日志


Dockerfile构建镜像

1、Dockerfile

之前我们获得镜像,都是从Docker仓库中进行下载,接下来我们自己使用Dockerfile开发一个镜像

Dockerfile其实就是一个文本文件,由一系列命令和参数构成,Docker可以读取Dockerfile文件并根据Dockerfile文件的描述来构建镜像。

1、每个保留关键字(指令)都是必须是大写字母
2、执行从上到下顺序执行
3、#表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交!

举例如下:

#依赖的基础镜像名称和ID
FROM centos:7
#指定镜像创建者信息
MAINTAINER atguigu
#切换工作目录
WORKDIR /usr
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把java添加到容器中
ADD jdk-8u144-linux-i586.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_144
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

镜像分层:好处是可以共享一些基础的层(基础镜像BaseImage)

添加安装包、依赖、配置等,每次操作都形成新的一层


2、Dockerfile构建指令

命令

作用

FROM image_name:tag

定义了使用哪个基础镜像启动构建流程

MAINTAINER user_name

声明镜像的创建者

ENV key value

在容器内部设置环境变量 (可以写多条)

RUN command

执行shell命令、一般是安装过程的命令

ADD source_dir/file dest_dir/file

将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压

COPY source_dir/file dest_dir/file

和ADD相似,但是如果有压缩文件并不能解压

WORKDIR path_dir

设置工作目录

EXPOSE:容器运行时监听的特定网络端口。

VOLUME:为容器创建挂载点或声明卷

ADD:将文件、目录或远程URL复制到镜像中。

ENTRYPOINT:镜像中应用的启动命令,容器运行时调用

Run指令

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:

FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz

以上执行会创建 3 层镜像。可简化为以下格式:

FROM centos
RUN yum -y install wget \&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \&& tar -xvf redis.tar.gz

如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。


上传jar包构建镜像

1、构建思路

半自动化思路:springboot还是打包成普通的jar,然后把这个jar上传到服务器,同时在服务器创建一个Dockerfile文件,执行docker build命令,把这个jar构建成一个docker镜像,然后通过镜像执行。


2、上传jar包和Dockerfile

上传jar包和Dockerfile文件到ubuntu服务器上,我是上传到了myapp/hello-word这个目录

Dockerfile文件内容如下:

# java8环境镜像
FROM java:8
# 将宿主机的文件复制到容器内,可以重命名
ADD helloworld-0.0.1-SNAPSHOT.jar helloworld.jar
# 声明启动端口号
EXPOSE 8089
# 配置容器启动后执行的命令
ENTRYPOINT ["java","-jar","helloworld.jar"]


3、docker build 镜像构建

在Dockerfile所在目录执行命令构建镜像

注意后边的空格和点,不要省略

docker build -t myhelloworld .

-t  是给镜像起名,格式依然是repository:tag的格式,不指定tag时,默认为latest
.   是指定Dockerfile所在目录,如果就在当前目录则指定为"."

查看镜像是否创建完成

docker images


maven插件构建镜像

1、构建思路

半自动化思路:springboot pom.xml中配置maven插件支持,打包时会使用项目里面的dockerfile,如果没配置插件支持会报错找不到dockerfile文件


2、dockerfile-maven-plugin

dockerfile-maven-plugin是一个maven的插件,主要作用是在项目构建的时候生成基于项目的docker镜像文件。

dockerfile-maven-plugin的目标就是将maven的打包过程和docker的build过程结合在一起,当成功打包,既生成了对应的jar,也已生成了对应的docker镜像。


3、第一 步: pom文件引入

第一步:在pom中增加对dockerfile-maven-plugin插件的引用,核心代码如下:

    <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>com.spotify</groupId><artifactId>dockerfile-maven-plugin</artifactId><version>1.4.13</version><configuration><dockerfile>Dockerfile</dockerfile><repository>${project.artifactId}</repository><tag>${project.version}</tag><buildArgs><jarFile>${project.build.finalName}.jar</jarFile></buildArgs></configuration></plugin></plugins></build>

4、第二步:Dockerfile文件

在项目根目录(和pom文件在同一级)新建一个Dokerfile文件,文件内容如下:

# java8环境镜像
FROM java:8
# 将宿主机的文件复制到容器内,可以重命名
ADD target/${JAR_FILE} helloworld.jar
# 声明启动端口号
EXPOSE 8089
# 配置容器启动后执行的命令
ENTRYPOINT ["java","-jar","helloworld.jar"]

说明: Maven 生成的 JAR 文件在 target/ 目录中


5、第三步:DockerDesktop

在使用dockerfile-maven-plugin打包docker镜像的时候,必须启动DockerDesktop。

dockerfile-maven-plugin 本质上是调用本机的 Docker CLI 命令(如 docker build)来构建镜像,而 Docker CLI 需要与 Docker 守护进程(dockerd)通信才能完成镜像构建任务。
Docker Desktop 在 Windows/macOS 上提供了 Docker 守护进程(dockerd)和必要的运行时环境。


6、第四步:dockerfile:build

打开 IDEA 右侧的 Maven 面板。
展开当前项目 → Plugins → dockerfile。
双击 dockerfile:build 目标,等待构建完成。

构建完成后,有2处变化,

第一是在docker desktop中多了镜像

第二是在target目录下多了一个


Docker应用部署举例

1、Portainer

在云服务器上部署 Docker,并安装 Portainer 运维面板以及汉化。

Portainer是一个可视化的Docker操作界面,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型单位对容器管理的全部需求。

1、查询镜像

docker search portainer

2、拉取镜像

docker pull portainer/portainer

3、创建卷

docker volume create portainer_data

4、创建容器

创建之前我们可以先创建个文件夹存放容器的相关数据(做本地映射)

mkdir -p  /home/docker/volume/data/

然后执行容器创建的命令:

docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

访问Portainer系统

浏览器打开:http://portainer_IP:9000

ps:建议使用谷歌、火狐等浏览器打开。
3. 设置管理员


2、部署mysql

企业稳定版,5.5---5.7---8.0。本次 5.7 为准

select version();

1.查看mysql镜像

docker search mysql

2.拉取mysql镜像

docker pull mysql:5.7

3.创建mysql容器

docker run -d -p 3306:3306 --privileged=true -v /zzyyuse/mysql/log:/var/log/mysql -v /zzyyuse/mysql/data:/var/lib/mysql -v /zzyyuse/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456  --name mysql mysql:5.7

大体分为3部分

 -p 代表端口映射,格式为 宿主机映射端口:容器运行端口

--privileged=true 放开权限

-v 挂载容器数据卷
    容器卷:防止docker容器坏了,未雨绸缪
    挂载在linux主机:docker容器之间,进行有效的数据维护和安全保障

-e 代表添加环境变量

MYSQL_ROOT_PASSWORD 是root用户远程登陆密码创建守护式容器 

4.启动mysql容器,在windows上远程登录mysql

登录进去的界面

5.进入mysql容器查看字符编码,密码是设置的123456

docker exec -it 235fc9cb98de bash

show variables like 'character%';      查看字符编码

6.解决一个docker容器mysql实例的中文乱码问题

通过修改linux,可以同步给docker(因为用V设置了目录挂载)

[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

------------------------------------

重新启动mysql容器,进入容器,查看编码

docker restart mysql


3、部署tomcat

1.拉取镜像

docker pull tomcat:7-jre7

2.创建容器

# 创建tomcat容器;并挂载了webapps目录
docker run -di --name=mytomcat -p 9000:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7

3.测试

在映射的宿主机目录/usr/local/webapps下创建如下:

  • mkdir docker
  • touch /docker/index.html

浏览器访问测试


4、部署nginx

1.拉取镜像

docker pull nginx

2. 创建容器        

docker run -di --name=mynginx -p 80:80 nginx

3.测试

在浏览器


5、部署redis

1.拉取镜像

docker pull redis

2.创建容器

docker run -di --name=myredis -p 6379:6379 redis

3.测试

使用redis客户端,连接redis,经测试成功连接上


Docker迁移与备份

这里又有很多命令复制过去不对,但是用手打一遍就好使了,我怀疑是中文空格的原因吧

1、docker commit 将容器保存为镜像

docker commit 容器名称  镜像名称

例如:docker commit mynginx mynginx_i

2、docker save 将镜像备份为tar文件(就可以移动到别的服务器)

# 命令形式:docker save –o tar文件名 镜像名
# 保存镜像为文件 -o:表示output 输出的意思
docker save -o mynginx.tar mynginx_i

3、docker load 根据tar文件恢复为镜像

# 命令形式:docker load -i tar文件名
docker load -i mynginx.tar

注意:直接删除 mynginx_i 镜像 ,发现会报错,因为当前镜像的容器正在运行,需要先停止容器,删除容器 , 在删除镜像。


Docker私有仓库

私有仓库搭建与配置

  • 1.1 拉取私有仓库镜像
docker pull registry
  • 1.2 启动私有仓库容器
docker run -di --name=registry -p 5000:5000 registry
  • 1.3 打开浏览器 输入地址 http://192.168.2.108:5000/v2/_catalog 看到{"repositories":[]} 表示私有仓库搭建成功并且内容为空

  • 1.4 修改daemon.json

vim /etc/docker/daemon.json"insecure-registries":["192.168.2.108:5000"] #改行目的是让容器信任该地址
systemctl restart docker #重启docker服务【这里还必须要重启,光  systemctl daemon-      reload 不行】

镜像上传至私有仓库

2.1标记此镜像为私有仓库的镜像

# 标记镜像为私有仓库的镜像  
# docker tag jdk1.8 宿主机IP:5000/jdk1.8
docker tag jdk1.8 192.168.2.108:5000/jdk1.8

2.2启动私服容器

# 再次启动私有仓库容器  
docker start registry

2.3上传标记的镜像

# 上传标记的镜像  
# docker push 宿主机IP:5000/jdk1.8
docker push 192.168.2.108:5000/jdk1.8

2.4测试

重新刷新,发现jdk 1.8 已经上传到私服


从私有仓库拉取镜像

# 执行拉取镜像命令并查看
docker pull 192.168.2.108:5000/jdk1.8
docker images

http://www.lryc.cn/news/586789.html

相关文章:

  • 快速生成 Android 的 Splash 的 9 Patch 图片
  • Docker 搭建本地Harbor私有镜像仓库
  • SpringBoot单元测试类拿不到bean报空指针异常
  • 从架构到代码:飞算JavaAI电商订单管理系统技术解构
  • 决策树的相关理论学习
  • FusionOne HCI 23 超融合实施手册(超聚变超融合)
  • 【C++】多线程同步三剑客介绍
  • 代码随想录算法训练营第十七天
  • 【C++】第十五节—一文详解 | 继承
  • JVM 垃圾收集算法全面解析
  • DC-DC变换器最基本拓扑 -Buck电路和Boost电路
  • ROS2---NodeOptions
  • MacOS使用Multipass快速搭建轻量级k3s集群
  • mac上BRPC的CMakeLists.txt优化:解决Protobuf路径问题
  • TensorFlow深度学习实战(24)——变分自编码器详解与实现
  • Vue 3 动态ref问题
  • 封装---统一封装处理页面标题
  • C++模版编程:类模版与继承
  • Qt 3D模块加载复杂模型
  • vue应用如何实现在 A 标签页登出,希望 B 标签页也自动感知并退出登录
  • 语音识别的速度革命:从 Whisper 到 Whisper-CTranslate2,我经历了什么?
  • 数据库3.0
  • HarmonyOS-ArkUI Web控件基础铺垫1-HTTP协议-数据包内容
  • EPLAN多项目并行,电气设计许可如何不浪费?
  • (S4)Efficiently Modeling Long Sequences with Structured State Spaces论文精读(逐段解析)
  • ReAct论文解读(1)—什么是ReAct?
  • 基于YOLOv11的无人机目标检测实战(Windows环境)
  • Spring Cloud Gateway 实战指南
  • 力扣经典算法篇-21- 两数之和 II - 输入有序数组(固定一端 + 二分查找法,双指针法)
  • MongoDB性能优化实战指南:原理、实践与案例