Docker

Docker

基本操作

镜像操作

  • 镜像名称

    • 由两部分组成: [repository]:[tag]
    • 在没有指定tag时,默认是latest,代表最新版本的镜像
  • 镜像命令

    • 拉取镜像

      docker pull 镜像名
      eg:docker pull redis,不指定tags的情况下默认拉取最新版本,即latest

    • 查看拉取的镜像

      docker images

    • 将镜像保存为压缩包

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

    • 加载镜像压缩包

      docker load -i 文件名
      eg: docker load -i redis.tar

    • 移除本地镜像

      docker rmi 镜像名
      eg: docker rmi redis:latest

容器操作

  • 创建并运行容器

    • docker run

      • eg: docker run --name containerName -p 80:80 -d nginx

      • 参数解释

        • –name: 设置容器名
        • containerName: 容器名
        • -p: 端口映射,冒号左边是宿主机端口,右边是容器端口
          由于容器为隔离环境,我们无法直接访问其端口,故需要将其端口与宿主机端口做一个映射,通过访问宿主机端口去访问容器端口
        • -d: 使容器后台运行
        • nginx: 镜像名
  • 暂停运行中的容器

    • docker pause 容器名
  • 让暂停的容器恢复运行

    • docker unpause 容器名
  • 停止运行中的容器

    • docker stop 容器名
  • 让停止的容器恢复运行

    • docker start 容器名
  • 暂停与停止的区别

    • 暂停: CPU停止运行,不释放内存
      停止: 回收进程占用的CPU,内存等资源
  • 查看容器执行日志

    • docker logs [-f]

      • -f表示动态查看日志
  • 查看所有容器及状态

    • docker ps [-a]

      • 默认查看的是所有运行中的容器
        -a表示查看包括非运行状态的容器
  • 删除容器

    • docker rm [-f] 容器名

      • 默认只能删除非运行状态的容器
        -f用于强制删除,可删除运行中的容器
  • 进入容器执行命令

    • docker exec

      • eg1: docker exec -it 容器名 bash

      • eg2: docker exec -it myredis redis-cli

      • 参数解释

        • -it: 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
        • bash: 进入容器后执行的命令,bash是一个linux终端交互命令
  • 对于陌生的镜像,建议去dockerhub等docker registry查看其使用命令

数据卷

  • 定义

    • 一个虚拟目录,指向宿主机文件系统的某个目录
  • 作用

    • 将容器与数据解耦合,方便操作容器内的数据,保证数据安全
  • 数据卷操作命令

    • 创建数据卷

      • docker volume create 数据卷名
    • 查看数据卷列表

      • docker volume ls
    • 查看数据卷详细信息

      • docker volume inspect 数据卷名
    • 删除未使用的数据卷

      • docker volume prune
    • 删除指定数据卷

      • docker volume rm 数据卷名
  • 数据卷挂载

    • 命令: -v volumeName:/targetContainerPath
      如果数据卷不存在会被创建
    • eg:创建数据卷html,将其挂载到nginx的html目录中

docker run --name ng -p 80:80 -v html:/usr/share/nginx/html -d nginx
实现挂载之后便可以在数据卷html所在真实目录下修改容器内/usr/share/nginx/html目录内文件

  • 作用:将数据卷挂载到容器目录下,便于在容器外部直接修改容器内数据

  • 目录直接挂载

    • 使用-v命令将宿主机目录/文件直接挂载到容器目录/文件
    • 语法:
      -v [宿主机目录]:[容器内目录]
      -v [宿主机文件]:[容器内文件]
    • eg: 将宿主机目录和文件挂载到mysql容器中

docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234 -v /root/test/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf -v /root/test/mysql/data:/var/lib/mysql -d mysql:5.7.25

  • 数据卷挂载与目录直接挂载对比

    • 数据卷挂载耦合度低, 且目录由docker管理,但目录相对较深,寻找不变
      目录直接挂载耦合度高,目录需要自己管理,但目录位置易寻找

Dockerfile自定义镜像

镜像结构

Dockerfile语法

案例1:基于Ubuntu构建java项目

  • 步骤1:新建一个空文件夹docker-demo
  • 步骤2:将需要制作成镜像的java项目jar包拷贝到该目录下
  • 步骤3:拷贝需要的jdk8压缩包到该目录下
  • 步骤4:编写Dockerfile文件并拷贝到该目录下

Dockerfile文件内容如下

# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local

# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/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 /tmp/app.jar
  • 步骤5: 在该目录下执行命令

docker build -t javaweb:1.0

案例2:基于java8构建项目

虽然我们可以基于Ubuntu基础镜像,添加任意自己需要的安装包,构建镜像,但是却比较麻烦。所以大多数情况下,我们都可以在一些安装了部分软件的基础镜像上做改造。

例如,构建java项目的镜像,可以在已经准备了JDK的基础镜像基础上构建。

需求:基于java:8-alpine镜像,将一个Java项目构建为镜像

  • 步骤一:新建空目录
  • 步骤二:将需要制作成镜像的java项目jar包拷贝到该目录下
  • 步骤三:编写Dockerfile文件并拷贝到该目录下

Dockerfile文件内容如下

FROM java:8-alpine
COPY ./app.jar /tmp/app.jar
EXPOSE 8090
ENTRYPOINT java -jar /tmp/app.jar
  • 步骤四:执行docker build命令构建对象
  • 步骤五:执行docker run命令创建并运行容器

Docker-Compose

Docker-Compose简介

  • 可以根据compose文件快速部署分布式应用,不需要手动一个个创建运行
  • compose文件本质就是一个文本文件,通过指令定义集群中每个容器如何运行,可将其看作是多个docker run命令的集合体,仅语法上存在差异

案例:微服务集群部署

  • 实现步骤

    • 步骤一:创建一个空目录cloud-demo,在其中为每个微服务创建子目录(gateway,userservice,orderservice,mysql)
    • 步骤二: 编写docker-compose文件

    docker-compose文件内容如下:

    version: "3.2"
    
    services:
      nacos:
        image: nacos/nacos-server
        environment:
          MODE: standalone
        ports:
          - "8848:8848"
      mysql:
        image: mysql:5.7.25
        environment:
          MYSQL_ROOT_PASSWORD: 123
        volumes:
          - "$PWD/mysql/data:/var/lib/mysql"
          - "$PWD/mysql/conf:/etc/mysql/conf.d/"
      userservice:
        build: ./user-service
      orderservice:
        build: ./order-service
      gateway:
        build: ./gateway
        ports:
          - "10010:10010"
    
    • 步骤三: 准备数据库数据到mysql目录中,在各子目录中提供将userservice,orderservice,gateway编译成镜像的Dockerfile文件
    • 步骤四: 在项目中将各服务模块的ip地址配置改为服务名,并打包为jar包,存放到cloud-demo对应的子目录中去
    • 步骤五: 将cloud-demo文件夹上传到Linux服务器
    • 步骤六: 进入cloud-demo文件夹,执行命令docker-compose up -d即可

Docker镜像仓库

搭建私有镜像仓库

  • 配置Docker信任地址

    • 这里搭建的私服使用的是http协议,默认不被Docker支持,需要进行如下配置
    # 打开要修改的文件
    vi /etc/docker/daemon.json
    # 添加内容:
    "insecure-registries":["http://192.168.204.128:8080"]
    # 重加载
    systemctl daemon-reload
    # 重启docker
    systemctl restart docker
    
  • 使用docker-compose部署带有图形化界面的DockerRegistry

    • docker-compose文件内容如下
    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
    

拉取/推送镜像

  • 步骤

    • 重新tag本地镜像,以nginx镜像为例,执行如下命令
    docker tag nginx:latest 192.168.204.128:8080/nginx:1.0 
    
    • 推送重新tag后的镜像到私有镜像仓库,执行如下命令
    docker push 192.168.204.128:8080/nginx:1.0 
    
    • 从私有镜像仓库拉取镜像到本地,执行如下命令即可
    docker pull 192.168.204.128:8080/nginx:1.0 
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值