目录
Docker介绍
什么是Docker
Docker 是一种开源的容器化平台,能够帮助开发人员和系统管理员更方便地构建、打包、发布和运行应用程序。Docker 容器是一种轻量级的、独立的运行环境,通过 Docker,你可以在一个容器中打包应用程序所有的代码、依赖和配置文件,并将它们作为一个整体来进行部署和运行。
为什么要用Docker(好处)
-
轻量级:Docker 容器相对于传统的虚拟化技术如虚拟机来说,更为轻量级,启动时间更快,占用资源更少。
-
隔离性:每个 Docker 容器都是独立的,互不干扰,能保证应用程序之间的隔离性。
-
可移植性:Docker 容器可以在各种操作系统平台上运行,不受限于特定的硬件或操作系统。
-
灵活性:Docker 容器可以很容易地构建、复制、修改、删除和重新部署,同时也支持快速进行扩展和缩小。
-
一致性:由于 Docker 容器的打包方式是基于镜像的,因此可以确保应用程序在任何环境下的运行结果都是一致的。
-
方便性:通过 Docker,你可以快速创建各种开发、测试和生产环境,也能很方便地共享镜像文件和容器状态。
废话不多说,直接开始学习Docker
安装Docker
第一步:安装
注意:本人是在Centos7下安装的
#1、yum 包更新到最新
yum update
# 2、安装需要的软件包, yum-uti1 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的yum instal7 -y yum-utils device-mapper -persistent-data lvm2
#3、设置yum源
yum-config-manager --add-repo https://download.docker,com/1inux/centos/docker-ce.repo
#4、安装docker,出现输入的界面都按 Y
yum insta11 -y docker -ce
# 5、查看docker版本,验证是否验证成功
docker -v
执行Docker -v 出现下图 就说明成功了
第二步:配置镜像加速器
在这里 我们才用阿里的镜像加速器
注意:每个人的是不一样的,须登录阿里云,
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
#这是我自己的,登录阿里云获取
#执行如下命令 便可完成配置
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://kzmms6oz.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker命令
列出均为常用命令,全部命令请去官方文档查看
服务相关命令
systemotl start docker //启动docker服务
systemetl stop docker //停止docker服务
systemctl restart docker //重启docker服务
systemotl status docker //查看docker服务状态
-
镜像相关命令
- 拉取镜像
docker pull [options] NAME[:TAG]
//示例 拉取mysql镜像 docker pull mysql:5.7
name是拉取镜像的名称,:TAG表示是可选的,如果不选表明时latest(最新版本),如果选择表明是指定版本的.options是拉去的一些参数.
- 查看所有镜像
docker images
- 删除镜像
docker rmi 镜像id/镜像名称
容器相关命令
docker run <镜像名>[:<标签>] //基于指定镜像创建并启动一个容器。
docker ps //列出当前正在运行的容器列表。
docker ps -a // 列出所有容器
docker start <容器ID或名称> //启动已停止的容器。
docker restart <容器ID或名称> //重新启动容器。
docker stop <容器ID或名称> //停止正在运行的容器。
docker rm <容器ID或名称> //删除指定的容器
Docker 数据卷
数据卷好处及作用
-
数据持久化:容器在运行过程中产生的数据会保存在数据卷中,即使容器被删除或重新创建,数据仍然存在。这为数据的持久化存储提供了便利,确保数据不会丢失。
-
数据共享:多个容器可以使用同一个数据卷,实现数据共享。这在微服务架构中尤为有用,不同的服务可以共享数据,方便数据的交互和共享状态。
-
数据备份和恢复:通过将数据卷挂载到本地主机上,可以轻松地对数据进行备份,以便日后恢复或迁移。数据卷可以与宿主机上的目录进行映射,方便进行数据的管理和操作。
-
共享配置和日志:通过将配置文件和日志文件挂载到数据卷,可以实现容器之间的配置共享和日志的收集与分析。这样可以方便地集中管理和监控容器的配置和日志信息。
-
跨主机数据传输:使用 Docker 数据卷可以方便地实现容器之间和主机之间的数据传输。数据卷可以通过网络或存储卷插件在不同的 Docker 主机之间进行数据共享和传输。
数据卷的使用
创建容器时,使用-v参数设置数据卷
docker run .... -v 宿主机目录(文件):容器内目录(文件)
注意事项:
- 目录必须是绝对路径
- 如果目录不存在,则会自动创建
- 可以挂载多个数据卷
部署项目
部署Mysql
- 拉去MySQL镜像
docker pull mysql:5.7
2 创建容器,设置端口映射、数据卷挂载
# 在/root目录下创建mysq1目录用于存储mysq1数据信息
mkdir ~/mysql
cd ~/mysql
#启动运行容器
docker run -id \
-p 3307:3306 \
--name=c_mysq7 \
-v $pwd/conf:/etc/mysql/conf.d \
-v $PWd/logs:/logs \
-v $pwd/data: /var/lib/mysql \
-e MYSQL_ROOT_PASSWORD-123456 \
mysql:5.7
命令说明:
- - id:以交互方式运行容器,并将容器设置为后台模式运行。
- - p 3307:3306:将容器的 MySQL 服务端口 3306 映射到主机的端口 3307,允许通过主机的 3307 端口访问容器内的 MySQL 服务。
- - - name=c_mysql:给容器起一个名称为 "c_mysql",方便后续管理和操作。
- -v $pwd/conf:/etc/mysql/conf.d :将主机当前目录下的 "conf" 目录挂载到容器的 "/etc/mysql/conf.d" 目录,用于加载 MySQL 配置文件。
- -v $PWd/logs:/logs:将主机当前目录下的 "logs" 目录挂载到容器的 "/logs" 目录,用于存储 MySQL 日志文件。
- -v $pwd/data: /var/lib/mysql :将主机当前目录下的 "data" 目录挂载到容器的 "/var/lib/mysql" 目录,用于持久化存储 MySQL 数据文件。
- -e MYSQL_ROOT_PASSWORD-123456:设置 MySQL 的 root 用户密码为 "123456"。
- mysql:5.7:从 Docker Hub 下载并运行标签为 "5.7" 的 MySQL 镜像。
至此Mysql容器创建成功
3.进入容器
docker run -it C-mysql /bin/bash
4.登录Mysql
mysql -uroot -p123456
5测试
至此MySQL 部署完成
部署自己的应用
制作自己的镜像
在部署 mysql 的时候 我们拉取的是别人写好的官方镜像,在这里我们部署自己的应用,需要制作自己的镜像
dockerfile 就是一个制作镜像的 纯文本文件
制作镜像前我们先了解下常见命令
关键宁 | 作用 | 备注 |
FROM | 指定父镜像 | 指定dockerfile基于那个image构建 |
MAINTAINER | 作者信息 | 用来标明这个dockerfile谁写的 |
LABEL | 标签 | 用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看 |
RUN | 执行命令 | 执行一段命令默认是/bin/sh 格式: RUN command 或者 RUN["command","param1","param2"] |
CMD | 容器启动命 | 提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMDcommand param1 param2 或老CMD ["command','"param1","param2] |
ENTRYPOINT | 入口 | 般在制作一些执行就关闭的容器中会使用 |
COPY | 复制文件 | build的时候复制文件到image中 |
ADD | 添加文件 | build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务 |
ENV | 环境变星 | 指定build时候的环境变量 可以在启动的容器的时候 通过-e夏盖 格式ENVname=value |
ARG | 构建参数 | 构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数 |
VOLUME | 定义外部可以挂载的数据卷 | 指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定格式 VOLUME[“目录”] |
EXPOSE | 暴露端口 | 定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式EXPOSE 8080 或者EXPOSE 8080/udp |
WORKDIR | 工作目录 | 指定容器内部的工作目录 如果没有创建则自动创建 如果指定/使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径 |
USER | 指定执行用户 | 指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户 |
HEALTHCHECK | 健康检查 | 指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制 |
ONBUILD | 触发器 | 当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大 |
STOPSIGNAL | 发送信号量到宿主机 | 该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出 |
SHELL | 指定执行脚 本的shell | 指定RUN CMD ENTRYPOINT 执行命令的时候使用的shell |
第一步:编辑Dockerfile 文件
#使用 openjdk:8-jdk 作为基础镜像。
FROM openjdk:8-jdk
#在容器内创建 /tmp 目录,并将工作目录设置为 /opt/app
VOLUME /tmp
WORKDIR /opt/app
#复制当前目录下的所有 .jar 文件到容器的 app.jar 文件中,
#并复制 application-prod.yml 文件到容器中。
ARG JAR_FILE=*.jar
COPY ${JAR_FILE} app.jar
COPY application-prod.yml application-prod.yml
#设置环境变量 JAVA_OPTS 为空字符串,声明容器将会监听 8080 端口
ENV JAVA_OPTS=""
EXPOSE 8080
#将java 命令作为容器的入口点,通过执行指定的命令来启动 Java 应用程序。其中,${JAVA_OPTS} 是可选的环境变量,可以在运行容器时指定额外的 JVM 参数。-Djava.security.egd=file:/dev/./urandom 是一个常见的 JVM 参数,用于改善随机数生成性能。
ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /opt/app/app.jar
第二步:构建镜像
docker build -t yshop:app1.0.0 .
部署启动
docker run -d -p 8771:8080 \
--user 1003:root \
--network app -hyshop-app \
-v /opt/docker-data/yshop/files/upload:/app/file \
-v /opt/docker-data/yshop/files/avatar:/app/avatar \
-v /opt/docker-data/yshop/logs:/opt/app/logs \
-e "SPRING_PROFILES_ACTIVE=prod" \
-e TZ="Asia/Shanghai" \
--name yshop-app1.0.0 yshop:app1.0.0
docker logs -f --tail 200 yshop-app1.0.0
致此 项目部署完成
希望对你们有帮助 ,有不足之处希望大家多多指正.谢谢大家