Docker

Docker

解决了:

应用部署的环境问题

依赖兼容问题

操作系统环境差异

如何解决:

  • Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像,
  • Docker应用运行在容器中,使用沙箱机制,相互隔离
  • Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行

1.优势

  • 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统
  • 运行时利用沙箱机制形成隔离容器,各个应用互不干扰
  • 启动、移除都可以通过一行命令完成,方便快捷

2.架构

Docker是一个CS架构的程序,由两部分组成

服务端:Docker守护进程,负责处理Docker指令,管理镜像、容器等。

客户端:通过命令或RestApi向Docker服务端发送指令。

image-20221031131453148

Docker中有几个重要的概念:

镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起成的文件包,称为镜像。这个文件包是只读的

容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。因此一个镜像可以启动多次,形成多个容器进程。

服务端:接收命令或远程请求,操作镜像或容器

客户端:发送命令或者请求到Docker服务端

Docker Hub:

一个镜像托管的服务器,类似的还有阿 里云镜像服务,统称为DockerRegistry

3.安装

见centos7安装docker笔记

4.基本命令

镜像命令

docker pull redis 拉取dockerHub的镜像

docker images 查看拉取到的镜像

docker save -o redis.tar redis:latest 保存镜像为tar文件

docker rmi redis:latest 删除镜像文件

docker load -i redis.tar 加载镜像

image-20221031135320715

容器命令

image-20220208151626205

举例:运行nginx容器

docker run --name mynginx -p 80:80 -d nginx

docker run :创建并运行一个容器

--name : 给容器起一个名字,比如叫做mn

-p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口

-d:后台运行容器

nginx:镜像名称,例如nginx-gyb

举例:运行redis,并持久化数据

#运行redis
docker run --name myRedis -p 6379:6379 -d redis redis-server --appendonly yes
#进入redis容器中
docker exec -it myRedis bash

进入容器后启动redis客户端

redis-cli

设置值

set num 1

5.数据卷

数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。

•将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全

image-20220211223926645

基本操作

docker volume [COMMAND]

docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:

  • create 创建一个volume
  • inspect 显示一个或多个volume的信息
  • ls 列出所有的volume
  • prune 删除未使用的volume
  • rm 删除一个或多个指定的volume

举例

创建一个名为html的数据卷

 docker volume create html

展示所有数据卷

 docker volume ls

查看数据卷详细信息卷

 docker volume inspect html

挂载数据卷

在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器目录

image-20220211224500512

挂载目录

运行mysql,并挂载data和conf目录

  1. 将mysql镜像加载
  2. 运行镜像,并配置密码,端口,挂载目录
docker run \
 --name mysql \
 -e MYSQL_ROOT_PASSWORD=gyb20010204 \
 -p 3306:3306 \
 -v /root/temp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
 -v /root/temp/mysql/data:/var/lib/mysql \
 -d \
 mysql:5.7.25

-e :传递环境变量

-p:映射端口

-v:挂载(外部服务器地址:镜像地址)

-d:在后台运行容器

挂载区别

image-20221031200852738

6.自定义镜像

1.镜像结构

•BaseImage层:包含基本的系统函数库、环境变量、文件系统

•Entrypoint:入口,是镜像中应用启动的命令

•其它:在BaseImage基础上添加依赖、安装程序、完成整个应用的安装和配置

image-20220211233350658

2.Dockerfile

指令 说明 示例
FROM 指定基础镜像 FROM centos:6
ENV 设置环境变量,可在后面指令使用 ENV key value
COPY 拷贝本地文件到镜像的指定目录 COPY ./mysql-5.7.rpm /tmp
RUN 执行Linux的shell命令,一般是安装过程的命令 RUN yum install gcc
EXPOSE 指定容器运行时监听的端口,是给镜像使用者看的 EXPOSE 8080
ENTRYPOINT 镜像中应用的启动命令,容器运行时调用 ENTRYPOINT java -jar xx.jar

3.创建举例

3.1.基于Ubuntu镜像构建一个新镜像,运行一个java项目

  1. 新建root/temp/docker-demo文件夹

  2. 拷贝资料中的docker-demo.jar文件到docker-demo这个目录

  3. jdk8.tar.gz文件到docker-demo这个目录

  4. Dockerfile到docker-demo这个目录

    # 指定基础镜像
    FROM ubuntu:16.04
    # 配置环境变量,JDK的安装目录
    ENV JAVA_DIR=/usr/local
    
    # 拷贝jdk和java项目的包
    COPY ./jdk8.tar.gz $JAVA_DIR/
    COPY ./docker-demo.jar /root/temp/app.jar
    
    # 安装JDK
    RUN cd $JAVA_DIR \
     && tar -xf ./jdk8.tar.gz \
     && mv ./jdk1.8.0_144 ./java8
    
    # 配置环境变量
    ENV JAVA_HOME=$JAVA_DIR/java8
    ENV PATH=$PATH:$JAVA_HOME/bin
    
    # 暴露端口
    EXPOSE 8090
    # 入口,java项目的启动命令
    ENTRYPOINT java -jar /root/temp/app.jar
    
  5. 运行命令

#-t 代表--tag指定名称和版本, 最后的点(.)代表DockerFile的所在目录--当前目录
docker build -t javaweb:1.0 .
  1. 开放8090端口

  2. 访问http://116.62.32.68:8090/hello/count

    image-20220212001041650

也可以将基础的命令替换为 基础镜像:java:8-alpine

# 指定基础镜像
FROM java:8-alpine

COPY ./docker-demo.jar /root/temp/app.jar

# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /root/temp/app.jar

7. Docker Compose

  • Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!
  • Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。

3.2运行cloud-domo微服务

1.将各微服务的nacos地址和mysql的ip地址换为服务名,如nacos和mysql

image-20220212154831930

2.将服务打包为app.jar

3.编写各微服务的Dcokerfile文件放在文件夹中

4.编写整体的DockerCompose.yaml文件(nacos的jvm分配调低)

5.将准备好的文件和jar包(cloud-domo文件)传入linux中

6.进入到docker-compose.yml所在文件夹

7.输入命令:

docker-compose up -d

此时会因为nacos启动慢导致其他微服务启动失败,因此需要重新启动其他微服务

 docker-compose restart userservice orderservice mysql gateway

8.最后可以访问网关端口号进行资源路径的访问

image-20220212155247114

7. Docker镜像仓库

带有图形化界面版本

1.创建docker-compose.yml文件内容如下:

version: '3.0'
services:
  registry:
    image: registry
    volumes:
      - ./registry-data:/var/lib/registry
  ui:
    image: joxit/docker-registry-ui:static
    ports:
      - 8080:80
    environment:
      - REGISTRY_TITLE=坚球私有仓库
      - REGISTRY_URL=http://registry:5000
    depends_on:
      - registry

2.配置docker信任地址,并重新加载

# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["116.62.32.68:8080"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker

image-20220212162824671

3.重命名镜像(必须)

docker tag nginx:latest 116.62.32.68/nginx:1.0

4.推送镜像到仓库

docker push 116.62.32.68:8080/nginx:1.0

5.拉取

docker pull 192.168.150.101:8080/nginx:1.0 
posted @ 2022-10-31 21:51  橡皮筋儿  阅读(131)  评论(0编辑  收藏  举报