Dockor 应用部署

我们写的代码会接触到好几个环境: 开发环境,测试环境以及生产环境:

1.Docker是什么?

Docker是基于Go语言实现的云开源项目。 Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。

Linux容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。 

2.安装Docker

Docker可以运行在MAC、Windows、CentOS、UBUNTU等操作系统上,本课程基于CentOS7安装Docker。官网: Docker: Accelerated Container Application Development

# 1、yum包更新到最新--更新centos7系统
yum update
#2、安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、设置yum源--指定docker下载路径
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#4、安装docker ,出现输入的界面都按y。 ce:社区版【】   ee:企业版【收费】
yum install -y docker-ce
# 5、查看docker版本,验证是否验证成功
docker -v

如果安装yum update中途网络断开导致安装一半失败,再次安装可能会造成(旧的冲突版本)

解决:

卸载冲突的软件包: 首先,卸载与现有软件包冲突的软件包。你可以使用以下命令来卸载软件包。请注意,如果有其他软件包依赖于这些软件包,卸载可能会导致其他问题。

yum remove kmod-14-9.el7.x86_64
yum remove dracut-033-161.el7.x86_64
yum remove initscripts-9.49.17-1.el7.x86_64

清理依赖问题: 运行以下命令来清理依赖问题和冲突:

yum clean all

重新安装软件包: 现在,你可以尝试重新安装需要更新的软件包。运行以下命令:

yum install NetworkManager NetworkManager-glib NetworkManager-tui alsa-firmware alsa-tools-firmware audit authconfig avahi systemd trousers ipset-libs
  • 这将尝试安装所有需要更新的软件包以及它们的依赖项。

  • 更新系统: 最后,运行以下命令以确保系统的所有软件包都是最新的:

yum update

然后重新执行上面操作

3.Docker架构

  • Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。

  • 容器(Container) :Docker 利用容器(Container)独立运行的一个或一组应用。就像是Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台

  • 仓库(Repository)是集中存放镜像文件的场所。

类似于

Maven仓库,存放各种jar包的地方;

github仓库,存放各种git项目的地方;

Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

最大的公开仓库是 Docker Hub(https://hub.docker.com/),

存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等

3.配置Docker镜像加速器

默认情况下,将来从docker hub (https://hub.docker.com/)上下载docker镜像,太慢。一般都会配置镜像加速器:

USTC:中科大镜像加速器(https://docker.mirrors.ustc.edu.cn)

==阿里云== 网易云

腾讯云

4.Docker常用命令

4.1Docker服务常用命令

  1. 启动docker服务: systemctl start docker

  2. 关闭docker服务: systemctl stop docker

  3. 重启docker服务: systemctl restart docker

  4. 开启启用docker: systemctl enable docker

  5. 查看docker状态: systemctl status docker

  6. docker的帮助命令: docker 命令 --help

4.2Docker镜像相关的命令

docker images --查看本地有哪些镜像

docker search 镜像名 --查看远程仓库的镜像

docker pull 镜像名:版本号 --拉取镜像到本地  ---如果没写版本号默认为新版latest

docker rmi  镜像名:版本号  --删除本地镜像

docker rmi  镜像的id号  --删除本地镜像

docker --help --帮助

4.3Docker容器相关命令:

运行容器:docker run -it --name=c1 centos:7 /bin/bash

-i 保持容器一直运行,因为容器没有客户端连接会自动关闭

-t 给容器分配伪终端接收命令

--name 给容器起名字

centos:7镜像+版本号

/bin/bash 进入容器的初始化指令 这里相当于是打开一个shell窗口

exit:退出容器--关闭当前容器

快捷键:ctrl+q+p 退出容器---不会关闭当前容器

docker ps : 查看当前运行容器

docker ps -a :查看当前所有容器

docker exec -it 容器id|容器名  /bin/bash : 进入容器

exit:此时退出不会关闭容器

docker start 容器id|容器名  :启动一个容器

docker stop 容器id|容器名:关闭一个容器

docker rm 容器id|容器名:删除一个未运行的容器

docker rm -f 容器id|容器名:强制删除一个容器

docker logs 容器id|容器名 : 查看容器的日志

5.容器的数据卷

5.1数据卷作用

docker容器删除后,容器中产生的数据也没有了。使用数据卷可以解决数据的持久化的问题,当容器中的数据和数据卷目录进行绑定后,对方的修改会立即同步,在容器被删除时不会删除挂载的数据卷

Docker容器和外部机器不可以直接交换文件,但可用数据卷,让外部机器来交换宿主机,而宿主机可以和容器来进行数据的交换

作用:

1.解决数据持久化问题

2.解决外部机器和容器的间接通讯问题

3.解决容器之间的数据交换

5.2配置数据卷

docker run -it --name=名字 -v宿主机目录:容器内目录 /bin/bash

6.Docker应用部署

6.1安装mysql

从远程仓库拉取mysql镜像: docker pull mysql:5.7

运行mqsql容器: docker run -id --name=容器名 -p 宿主机端口:容器的端口 -e MYSQL_ROOT_PASSWORD=密码 镜像名:版本号

-i 保持容器一直运行

-d 后台运行

-p 映射宿主机与容器的端口

-e 配置环境 这里配置root的密码

外界使用navicat连接mysql容器

如果删除容器后,容器内部的数据还存在。必须使用数据卷。

docker run -id -p 3307:3306  -v /app/mysql/log:/var/log/mysql -v /app/mysql/data:/var/lib/mysql -v /app/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456  --name=mysql70  mysql:5.7

6.2安装tomcat

docker pull tomcat:9  从远程仓库拉取tomcat镜像

docker run -id --name=tom03 -p 8091:8080 tomcat:9  运行tomcat容器

访问8091端口

这是因为如果安装9版本或以上,需要把webapps.dist覆盖webapps

进入容器:docker exec -it tom03 /bin/bash

删除webapps:rm -rf webapps

把webapps.dist重命名为webapps:mv webapps.dist/ webapps

重新访问8091端口:成功!

6.3安装redis

docker pull redis:7  从远程仓库拉取redis镜像

docker run -id --name=redis7 -p 6380:6379 redis:7  运行redis容器

使用mybatisplus测试连接:成功

现在如果redis存储了数据,但容器重启了,数据就丢失了。如果想修改redis配置文件也没办法。

所以需要将配置文件和持久化文件放在数据卷中。

1.创建一个目录/app/redis 并把redis.conf放入到该目录中,因为我们下载的是redis7版本的,所以配置文件也要为对应的,找到之前的redis.conf文件,放入/app/redis下。

2.创建一个目录/app/redis/data 用来存放redis持久化数据。

步骤:

1.创建一个目录/app/redis

mkdir /app/redis

2.把redis7的redis.conf文件拖到/app/redis下

注意这个配置文件需要修改一些配置(注意注意注意)

 bind * -::*   #允许远程连接

protected-mode no  #保护模式关掉,不然得输入密码

appendonly yes  #持久化

3.创建一个目录/app/redis/data

mkdir  /app/redis/data

启动

docker run -id --name=redis7 -v /app/redis/redis.conf:/usr/redis/redis.conf  -v /app/redis/data:/app/redis/data -p 6380:6379 redis:7 redis-server /usr/redis/redis.conf

-i:保持一直运行

-d: 后台运行

--name:设置容器名为redis7

-v /app/redis/redis.conf:/usr/redis/redis.conf  :把redis.conf的配置显示在宿主机

-v /app/redis/data:/app/redis/data :把持久化文件映射到宿主机,做数据卷,用来备份

-p 6380:6379 把容器内的6379端口映射到宿主机6380端口

redis-server /usr/redis/redis.conf  :(重要)这个是让redis按照redis.conf配置启动,默认就是无配置启动

6.4安装nginx

docker pull nginx  从远程仓库拉取nginx镜像  这里没写版本拉取的则是最新版

docker run -id --name=ng01 -p 89:80 nginx:latest   运行nginx容器

访问端口:

跟redis一样,需要配置为根据自己的配置文件启动

创建挂载目录

mkdir -p /app/nginx/conf   存放配置文件
mkdir -p /app/nginx/log     存放日志文件
mkdir -p /app/nginx/html   存放默认网页

这里直接将容器的配置文件复制到宿主机  注意我上面启动了一个容器叫ng01,这里复制ng01的文件到宿主机

docker cp ng01:/etc/nginx/nginx.conf /app/nginx/conf/nginx.conf
docker cp ng01:/etc/nginx/conf.d /app/nginx/conf/conf.d
docker cp ng01:/usr/share/nginx/html /app/nginx/

删除ng01容器:

 docker rm -f ng01

运行nginx容器:

docker run -id --name nginx -p 89:80 -v /app/nginx/conf/:/etc/nginx/conf/nginx.conf  -v /app/nginx/log:/var/log/nginx  -v /app/nginx/html:/usr/share/nginx/html nginx:latest  

6.5安装rabbitMQ

docker pull rabbitmq:management   从远程仓库拉取rabbit镜像 

docker run -id --name=rabbit -p 15672:15672 -p 5672:5672 rabbitmq:management   运行rabbit容器

7.自定义镜像

上面我们讲解的镜像都是现成---别人制作的镜像---下载下来的。

7.1dockerfile的概念

-Dockerfile是一个文本---任意一个镜像都是通过dockerfile来制作

-文件包含了一条条的指令

-每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像

-对于开发人员:可以为开发团队提供一个完全一致的开发环境

-对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了

-对于运维人员:在部署时,可以实现应用的无缝跨平台移植

7.2案例一:

创建目录: mkdir /root/qy168

创建centos7_dockerfile文件  touch  centos7_dockerfile

编写centos7_dockerfile

 #基于centos7制作
FROM centos:7
 #作者
MAINTAINER gjc
#这里我一直安装不上vim怀疑是镜像源的问题 所以指定了
RUN sed -i 's|^mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/CentOS-Base.repo && \
    sed -i 's|^#baseurl=http://mirror.centos.org/centos|baseurl=http://mirrors.aliyun.com/centos|g' /etc/yum.repos.d/CentOS-Base.repo && \
    yum makecache
#安装vim 
RUN yum install -y vim
#默认登录进来的目录,落脚点
WORKDIR /usr
 #最后容器启动后执行
CMD ["/bin/bash"]

镜像源:

  • 阿里云镜像源:http://mirrors.aliyun.com/centos/7/os/x86_64/
  • 华为云镜像源:http://mirrors.myhuaweicloud.com/centos/7/os/x86_64/
  • 清华大学镜像源:https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/

启动镜像:

docker run -it --name=zdycentos zdycentos:01

就可以使用vim命令了

7.3案例二:

把jar和dockerfile都放在/root/qy168中

编写dockerfile:

FROM java:8
MAINTAINER gjc
ADD qy168-nginx01-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
CMD java -jar app.jar

制作镜像:

 docker build -f ./springboot_dockerfile -t app .

启动镜像:

docker run -id -p 8080:8080 app

7.4案例三

需求: Centos7镜像具备vim+ifconfig+jdk8

要求: 落脚点: /usr/local 使用vim 并且还能用ifconfig 并且配置好jdk环境变量

在/root/qy168创建dockerfile文件

touch contos7plus_dockerfile

把jdk拉取到当前目录

编写dockerfile

FROM centos:7
MAINTAINER gjc
WORKDIR /usr/local
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#创建目录
RUN mkdir -p /usr/local/java
#ADD 把宿主机中的压缩文件放入到/usr/local/java 并会自动解压 
ADD jdk-8u161-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk8
ENV PATH $JAVA_HOME/bin:$PATH
CMD /bin/bash

7.5将自己的镜像文件上传到远程仓库

作为开发: 我们需要把自己的项目----通过dockerfile 变成一个镜像----上传到远程仓库【hub.docker或者阿里云镜像仓库】

作为测试:

作为运维: 从远程仓库下载镜像---通过镜像运行容器。部署项目。

采用:阿里云镜像仓库

教程:

8.Docker Compose 安装使用

安装Docker Compose

# Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我 们以编译好的二进制包方式安装在Linux系统中。
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 设置文件可执行权限
chmod +x /usr/local/bin/docker-compose
# 查看版本信息
docker-compose -version

案例:使用docker compose编排springboot+redis+mysql项目

编写docker-comppse.yml (名字必须叫docker-comppse.yml)

docker-comppse.yml:

version: "2.3"
services:
  micro_service:
    container_name: ms01
    build:
      context: ./
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    volumes:
      - /app/microService:/data
    networks:
      - aaa_net
    depends_on:
      - tm_redis
      - tm_mysql
  tm_redis:
    image: redis:6.0.20
    ports:
      - "6379:6379"
    volumes:
      - /app/redis/redis.conf:/etc/redis/redis.conf  # 必须在宿主机中存在my.cnf文件
      - /app/redis/data:/data
    networks:
      - aaa_net
    command: redis-server /etc/redis/redis.conf
  tm_mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: 'root'
      MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
      MYSQL_DATABASE: 'qy168'
    ports:
      - "3306:3306"
    volumes:
      - /app/mysql/db:/var/lib/mysql
      - /app/mysql/conf/my.cnf:/etc/my.cnf # 必须在宿主机中存在my.cnf文件
      - /app/mysql/init:/docker-entrypoint-initdb.d
    networks:
      - aaa_net
    command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
networks:
  aaa_net:

编写启动jar包的dockerfile文件 因为dockerfile: Dockerfile绑定的Dockerfile,这里名字也得一致为Dockerfile:

# 基础镜像使用java
FROM openjdk:8
# 作者
MAINTAINER gjc
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为 docker.jar
ADD qy168-springboot-redis-02-0.0.1-SNAPSHOT.jar docker.jar
# 运行jar包
CMD java -jar docker.jar
#暴露8080端口作为微服务
EXPOSE 8080

项目打包的名:qy168-springboot-redis-02-0.0.1-SNAPSHOT.jar

my.cnf:

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

redis.conf:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值