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: always

    image: tomcat

    container_name: tomcat

    ports:

      - 8080:8080

    volumes:

      - d://docker/tomcat/webapps:/usr/local/tomcat/webapps

      - d://docker/tomcat/logs:/usr/local/tomcat/logs

    environment:

      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、每一个指令都会创建提交一个新的镜像层,并提交!

举例如下:

bash 复制代码
#依赖的基础镜像名称和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文件内容如下:

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

3、docker build 镜像构建

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

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

bash 复制代码
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插件的引用,核心代码如下:

XML 复制代码
    <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文件,文件内容如下:

bash 复制代码
# 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:建议使用谷歌、火狐等浏览器打开。

  1. 设置管理员

2、部署mysql

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

sql 复制代码
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

  1. 创建容器

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