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