Docker学习

文章目录

  • [1. 快速入门](#1. 快速入门)
    • [1.1 配置Docker的yum库](#1.1 配置Docker的yum库)
    • [1.2 安装docker](#1.2 安装docker)
    • [1.3 启动和校验](#1.3 启动和校验)
    • [1.4 安装MySQL](#1.4 安装MySQL)
    • [1.5 常用命令](#1.5 常用命令)
  • [2. Docker基础](#2. Docker基础)
    • [2.1 常见命令](#2.1 常见命令)
    • [2.2 数据卷](#2.2 数据卷)
    • [2.3 本地目录挂载](#2.3 本地目录挂载)
    • [2.4 自定义镜像](#2.4 自定义镜像)
      • [2.4.1 镜像结构](#2.4.1 镜像结构)
      • [2.4.2 Dockerfile](#2.4.2 Dockerfile)
      • [2.4.3 构建镜像](#2.4.3 构建镜像)
    • [2.5 网络](#2.5 网络)
  • [3. 项目部署](#3. 项目部署)
    • [3.1 DockerCompose](#3.1 DockerCompose)
      • [3.1.2 基本语法](#3.1.2 基本语法)
      • [3.1.2 基本命令](#3.1.2 基本命令)

参考文档链接: https://b11et3un53m.feishu.cn/wiki/Rfocw7ctXij2RBkShcucLZbrn2d

1. 快速入门

当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像(image) 。镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器(container)
镜像仓库 :存储和管理镜像的平台,Docker官方维护了一个公共仓库:DockerHub

1.1 配置Docker的yum库

  • 安装yum工具

    bash 复制代码
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  • 使用阿里云更新yum源

    bash 复制代码
    curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  • 清除yum

    bash 复制代码
    yum clean all
  • 更新缓存

    bash 复制代码
    yum makecache

1.2 安装docker

bash 复制代码
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

1.3 启动和校验

bash 复制代码
# 启动Docker
systemctl start docker

# 停止Docker

systemctl stop docker

# 重启
systemctl restart docker

# 设置开机自启
systemctl enable docker

# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps

1.4 安装MySQL

  • 使用下面的命令来安装MySQL:

    bash 复制代码
     docker run -d \
    	--name mysql-test \
    	-p 3306:3306 \
    	-e TZ=Asia/Shanghai \
    	-e MYSQL_ROOT_PASSWORD=123 \
    	mysql:8.0.36
    • docker run:创建并运行一个容器,-d 是让容器在后台运行
    • --name mysql:给容器起个名字,必须唯一
    • -p 3306:3306:设置端口映射 宿主机端口:容器端口
    • -e KEY=VALUE:设置环境变量
    • mysql:指定运行的镜像的名字 [repository]:[tag] 镜像名:镜像版本
  • 此时,通过命令查看mysql容器:

    bash 复制代码
    docker ps

1.5 常用命令

运行已创建的容器

bash 复制代码
docker start mysql

停止正在运行的容器

bash 复制代码
docker stop mysql

删除容器

bash 复制代码
docker rm mysql

查看所有容器(包括已经停止的容器)

bash 复制代码
docker ps -a

2. Docker基础

2.1 常见命令

Docker最常见的命令就是操作镜像、容器的命令,详见官方文档:https://docs.docker.com/

bash 复制代码
# 第1步,去DockerHub查看nginx镜像仓库及相关信息

# 第2步,拉取Nginx镜像
docker pull nginx

# 第3步,查看镜像
docker images
# 结果如下:
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        latest    605c77e624dd   16 months ago   141MB
mysql        latest    3218b38490ce   17 months ago   516MB

# 第4步,创建并允许Nginx容器
docker run -d --name nginx -p 80:80 nginx

# 第5步,查看运行中容器
docker ps
# 也可以加格式化方式访问,格式会更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"

# 第6步,访问网页,地址:http://虚拟机地址

# 第7步,停止容器
docker stop nginx

# 第8步,查看所有容器
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"

# 第9步,再次启动nginx容器
docker start nginx

# 第10步,再次查看容器
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"

# 查看日志 -f持续跟踪
docker logs -f nginx 

# 第11步,查看容器详细信息
docker inspect nginx

# 第12步,进入容器,查看容器内目录
docker exec -it nginx bash
# 或者,可以进入MySQL
docker exec -it mysql mysql -uroot -p

# 第13步,删除容器
docker rm nginx
# 发现无法删除,因为容器运行中,强制删除容器
docker rm -f nginx

2.2 数据卷

数据卷(volume)是一个虚拟目录,是容器内目录宿主机目录 之间映射的桥梁

命令 说明
docker volume create 创建数据卷
docker volume ls 查看所有数据卷
docker volume rm 删除指定数据卷
docker volume inspect 查看某个数据卷的详情
docker volume prune 清除数据卷

在执行docker run命令时,使用 -v数据卷:容器内目录 可以完成数据卷挂载当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷

  • 创建数据卷

    bash 复制代码
    docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
    bash 复制代码
     docker volume ls
  • 查看数据卷详情

    bash 复制代码
    docker volume inspect html

2.3 本地目录挂载

  • 查看容器信息

    bash 复制代码
    docker inspect mysql-test
  • 在执行docker run命令时,使用**-v 本地目录:容器内目录** 可以完成本地目录挂载

  • 本地目录必须以"/"或"./"开头,如果直接以名称开头,会被识别为数据卷而非本地目录

    • -v mysql:/var/lib/mysql 会被识别为一个数据卷叫mysql
    • -v ./mysql:/var/lib/mysql会被识别为当前目录下的mysql目录

参考过程:https://b11et3un53m.feishu.cn/wiki/R4Sdwvo8Si4kilkSKfscgQX0niB

2.4 自定义镜像

镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。

2.4.1 镜像结构


2.4.2 Dockerfile

由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可
Dockerfile 就是一个文本文件,其中包含一个个的指令(Instruction) ,用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像。常见指令如下:

其对应的语法可以参考官方文档:https://docs.docker.com/engine/reference/builder/

例如,要基于Ubuntu镜像来构建一个Java应用,其Dockerfile内容如下:

bash 复制代码
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
ENV TZ=Asia/Shanghai
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 设定时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 安装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 8080
# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]

有人提供了基础的系统加JDK环境,我们在此基础上制作java镜像,就可以省去JDK的配置了:

bash 复制代码
# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

2.4.3 构建镜像

当编写好了Dockerfile,可以利用下面命令来构建镜像:

bash 复制代码
docker build -t docker-demo:1.0 .
  • docker build : 就是构建一个docker镜像
  • -t docker-demo:1.0 :-t参数是指定镜像的名称(repository和tag)
  • . : 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.代表当前目录,也可以直接指定Dockerfile目录:

2.5 网络

默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上:

容器的网络IP其实是一个虚拟的IP,其值并不固定与某一个容器绑定,如果我们在开发时写死某个IP,而在部署时很可能MySQL容器的IP会发生变化,连接会失败。

通过自定义网络会建立新的网桥,加入自定义网络的容器才可以通过容器名互相访问

Docker的网络操作命令如下:

官方文档:
https://docs.docker.com/engine/reference/commandline/network/

命令 说明
docker network create 创建一个网络
docker network ls 查看所有网络
docker network rm 删除指定网络
docker network prune 清除未使用的网络
docker network connect 使指定容器连接加入某网络
docker network disconnect 使指定容器连接离开某网络
docker network inspect 查看网络详细信息
  • 自定义网络

    bash 复制代码
    # 1.首先通过命令创建一个网络
    docker network create hmall
    
    # 2.然后查看网络
    docker network ls
    # 结果:
    NETWORK ID     NAME      DRIVER    SCOPE
    639bc44d0a87   bridge    bridge    local
    403f16ec62a2   hmall     bridge    local
    0dc0f72a0fbb   host      host      local
    cd8d3e8df47b   none      null      local
    # 其中,除了hmall以外,其它都是默认的网络
    
    # 3.让dd和mysql都加入该网络,注意,在加入网络时可以通过--alias给容器起别名
    # 这样该网络内的其它容器可以用别名互相访问!
    # 3.1.mysql容器,指定别名为db,另外每一个容器都有一个别名是容器名
    docker network connect hmall mysql --alias db
    # 3.2.db容器,也就是我们的java项目
    docker network connect hmall dd
    
    # 4.进入dd容器,尝试利用别名访问db
    # 4.1.进入容器
    docker exec -it dd bash
    # 4.2.用db别名访问
    ping db
    # 结果
    PING db (172.18.0.2) 56(84) bytes of data.
    64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.070 ms
    64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.056 ms
    # 4.3.用容器名访问
    ping mysql
    # 结果:
    PING mysql (172.18.0.2) 56(84) bytes of data.
    64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.044 ms
    64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.054 ms

3. 项目部署

3.1 DockerCompose

3.1.2 基本语法

Docker Compose通过一个单独的docker-compose.yml 模板文件(YAML格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署

如果用docker-compose.yml文件来定义,就是这样:

yaml 复制代码
version: "3.8"

services:
  mysql:
    image: mysql
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
    networks:
      - new
networks:
  new:
    name: hmall

3.1.2 基本命令

基本语法如下:

bash 复制代码
docker compose [OPTIONS] [COMMAND]

其中,OPTIONS和COMMAND都是可选参数,比较常见的有:

相关推荐
福大大架构师每日一题15 分钟前
16.3 k8s容器cpu内存告警指标与资源request和limit
容器·贪心算法·kubernetes·prometheus
国中之林20 分钟前
【C++ Primer Plus习题】17.5
开发语言·c++·学习·刷题
Chambor_mak30 分钟前
stm32单片机个人学习笔记6(EXTI外部中断)
stm32·单片机·学习
CrazyZ12637 分钟前
c++primer 第八章函数编程答案
开发语言·c++·笔记·学习·算法
Kixuan2142 小时前
ES学习笔记
java·笔记·学习·elasticsearch·搜索引擎
18你磊哥2 小时前
java重点学习-设计模式
java·学习·设计模式
阳光九叶草LXGZXJ2 小时前
南大通用数仓-GCDW-学习-03-用户管理
linux·运维·数据库·学习
天蓝蓝235282 小时前
机器学习-监督学习:朴素贝叶斯分类器
人工智能·学习·机器学习
小狗爱吃黄桃罐头2 小时前
江协科技STM32学习- P15 TIM输出比较
科技·stm32·学习
彤银浦2 小时前
Python学习过程记录1
python·学习