Docker

1. Ubuntu安装Docker

默认安装位置:/var/lib/docker

该目录下的子目录:

  • containers: 每个运行的容器的元数据和日志
  • image: 镜像相关的数据
  • volumes: 数据卷挂载的持久化数据
  • overlay2: 容器的文件系统
  • network: 网络配置文件
  • tmp: 临时数据
 # 启动docker
 systemctl start docker
 # 停止docker
 systemctl stop docker
 # 重启
 systemctl restart docker
 # 设置开机自启
 systemctl enable docker

2. 快速入门

2.1 Docker部署MySQL

注意:运行下面的命令,需要开梯子

docker run -d \
    --name mysql \
    -p 3307:3306 \
    -e TZ=Asia/Shanghai \
    -e MYSQL_ROOT_PASSWORD=123 \
    mysql

运行完毕之后:

客户端连接mysql测试 

连接成功!!!

  • 镜像image下载一次
  • 容器containers启动多次
  • Docker 中拉取的官方 mysql 镜像:

  • 容器内默认监听的是 3306 端口

  • 如果你想让容器内 MySQL 改监听其他端口(比如 4406)
    👉 你必须 修改容器内的 MySQL 配置文件

  • 镜像仓库:存储和管理镜像的平台,Docker官方维护了一个公共仓库:https://hub.docker.com/

概念对应类比说明
镜像文件/模板类似于软件安装包或操作系统镜像,是静态的。不能直接运行,只是容器的“蓝图”。
容器进程/实例是基于镜像运行起来的“程序”,是动态运行的实例,拥有自己的文件系统、进程空间。

2.2 命令解读 

  •  docker run: 根据镜像创建容器并运行
  • --name mysql: 给容器取一个名字,叫mysql,必须唯一
  • -p 3307:3306: 服务器端口3307映射mysql容器的端口3306
  • -e KEY=VALUE: 设置环境变量
  • mysql: 运行镜像的名字(本地有就直接运行,没有就去Docker Hub搜索下载)

镜像命名规范:[repository]:[tag]

  • 其中repository就是镜像名
  • tag就是镜像的版本
  • 在没有指定tag时,默认就是latest,代表最新版本的镜像。

去DockerHub查看当前的mysql版本

目前最新的是mysql:8.0.42-debian,所以上面下载的也是这个版本。

 3. 常见命令

  • docker rmi: 删除镜像
  • docker rm: 删除镜像创建的容器
  • docker stop: 杀死镜像创建的容器的进程(比如mysql,但是容器并没有关闭)

案例:查看DockerHub,拉取Nginx镜像,创建并运行Nginx容器。

  • 在DockerHub中搜索Nginx镜像,查看镜像的名称
  • 拉取Nginx镜像
  • 查看本地镜像列表
  • 创建并运行Nginx容器
  • 查看容器
  • 停止容器
  • 再次启动容器
  • 进入Nginx容器
  • 删除容器

1. 在DockerHub中搜索Nginx镜像,查看镜像的名称,拉取Nginx镜像

  • docker pull nginx

2. 查看本地镜像列表

  • docker images 

3. 将nginx的镜像打成nginx.tar压缩包

  •  docker save -o nginx.tar nginx:latest

 4. 删除nginx的镜像

  • docker rmi nginx:latest

5.  读取nginx.tar包,变成镜像image

  • docker load -i nginx.tar

6. 创建并运行容器

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

-d表示后台运行,--name nginx表示该容器的名字叫nginx,-p 80:80表示服务器的80端口映射到创建的该容器的80端口,nginx表示根据nginx镜像创建容器,版本号默认最新。

 7. 停止容器

注意:停止容器,该容器还存在,并没有删去

  • docker stop nginx

8. 显示容器

  • docker ps显示运行中的容器
  • docker ps -a显示所有容器(包括停止的容器)

9. 启动容器

  • docker start启动容器

10. 查看日志

  • docker logs nginx

11. 进入容器

  • docker exec -it nginx bash

容器内部有独立的操作系统:

 12. 退出容器

  • exit

4. 默认数据卷挂载

需求:

  • 创建Nginx容器,修改nginx容器内的html目录下的index.html文件,查看变化
  • 将静态资源部署到nginx的html目录

解决办法:

  • 要想知道创建的nginx容器里,静态资源在哪个文件目录开,需要区DockerHub官网查看

4.1 数据卷常用命令 

  • docker volume create: 创建数据卷
  • docker volume ls: 查看所有数据卷
  • docker volume rm: 删除指定数据卷
  • docker volume inspect: 查看某个数据卷详情
  • docker volume prune: 清除数据卷

4.2 数据卷挂载

  • 在执行docker run命令时,使用-v 数据卷:容器内目录可以完成数据卷挂载
    • 注意:必须在容器创建之前执行!如果容器已经创建了,先删除容器
  • 当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷。

1. 删除原有nginx容器

  • docker rm -f nginx

2. 创建nginx容器,同时创建挂载html数据卷到nginx容器

  • docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx

3. 查看所有数据卷

  • docker volume ls

4. 详细查看html数据卷

  • docker volume inspect html

 5. 本地目录挂载

5.1 判断容器有没有挂载

  • docker inspect nginx

5.2 本地目录数据卷挂载

  • 在执行docker run命令时,使用-v 本地目录:容器内目录可以完成本地目录挂载
  • 本地目录必须以"/"或"./"开头,如果直接以名称开头,会被识别为数据卷而非本地目录
    • -v mysql : /var/lib/mysql会被识别为一个数据卷叫mysql
    • -v ./mysql: /var/lib/mysql会被识别为当前目录下的mysql目录
  • mysql容器里面,配置文件、初始化脚本文件的目录在哪,必须要查看官方镜像文档

mysql容器的配置文件目录:/etc/mysql/conf.d

mysql容器的初始化脚本目录:/docker-entrypoint-initdb.d

mysql容器的数据目录: /var/lib/mysql

案例:

(1)当前在 Linux 主机上是以 root 用户挂载了本地路径,但容器里运行的是 mysql 用户,因此需要修改文件权限:

# 给配置目录权限
chmod -R 644 /root/mysql/conf/*.cnf

# 给初始化 SQL 脚本权限
chmod -R 644 /root/mysql/init/*.sql

# 推荐:让整个文件夹都对 mysql 用户可读
chmod -R o+r /root/mysql/

(2)创建mysql容器,同时挂载数据卷

docker run -d \
  --name mysql \
  -p 3307:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  -v /root/mysql/data:/var/lib/mysql \
  -v /root/mysql/init:/docker-entrypoint-initdb.d \
  -v /root/mysql/conf:/etc/mysql/conf.d \
  mysql

(3)挂载时主要要点

  •  如果宿主机目录为空,容器首次启动时,会将容器内默认的数据内容拷贝到宿主机目录中
  • 如果宿主机目录为空,Docker 会把宿主机目录“覆盖”容器对应路径,不会再拷贝容器内部默认数据;容器启动时不会自动把自己默认数据写入宿主机,反而会报错,尤其是像 MySQL 这类期待初始化数据的服务。

 6. Dockerfile语法

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

传统部署一个Java应用的步骤

  • 准备一个Linux服务器
  • 安装JRE并配置环境变量
  • 拷贝jar包
  • 运行jar包

注意:不同操作系统,对应的系统调用不同

功能Linux 调用Windows 调用
打开文件open() (glibc 调用 sys_open)CreateFile() (kernel32.dll)
创建线程pthread_create()CreateThread()
网络通信socket() + bind()WSASocket() + bind()
动态库加载dlopen()LoadLibrary()

相同功能,在 Linux 和 Windows 系统中要用不同的函数。

Dockerfile: 就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像。常见指令如下:

指令

说明

示例
FROM

指定基础镜像

FROM centos:6
ENV设置环境变量,可在后面指令使用ENV key value
COPY拷贝本地文件到镜像的指定目录COPY ./jrell.tar.gz /tmp
RUN执行Linux的shell命令,一般是安装过程的命令RUN tar -zxvf /tmp/jrell.tar.gz && EXPORTS path=/tmp/jrell:$path
EXPOSE指定容器运行时监听的端口,是给镜像使用者看的EXPOSE 8080
ENTRYPOINT镜像中应用的启动命令,容器运行时调用ENTRYPOINT java -jar xx.jar

 7. 自定义镜像

 自定义镜像案例

 其中Dockerfile的内容是:

# 基础镜像
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
# 入口

构建自定义镜像docker-demo

检查镜像docker-demo是否构建成功

 为该镜像创建一个容器并运行

docker run -d --name dd -p 8090:8080 docker-demo

访问试一试

http://192.168.31.20:8090/hello/count

8. 容器网路互连

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

创建一个名字叫gtc的网络:

docker network create gtc

 将容器加入到gtc网络

docker network connect gtc mysql 

9. 项目部署

9.1 后端部署

(1)将后端项目打成jar包

(2)将jar包和Dockerfile放在同一个目录

# 基础镜像
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 hm-service.jar /app.jar
# 入口

(3)构建后端项目的镜像

docker build -t hmall .

(4)通过hmall镜像,启动容器

docker run -d --name hmall -p 8090:8080 --network gtc hmall

docker run -d \
  --name hmall \
  -p 8090:8080 \
  --network gtc \
  hmall

9.2 前端部署

需求:创建一个新的nginx容器,将nginx.conf和html目录与容器挂载

docker run -d \
  --name nginx \
  -p 18080:18080 \
  -p 18081:18081 \
  -v /root/nginx/html:/usr/share/nginx/html \
  -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
  --network gtc \
  nginx

访问:192.168.31.20:18080

注意: 如果报错403,需要给/root/nginx/html加755的权限(chmod -R 755 /root/nginx/html)

10. DockerCompose

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

10.1 传统部署方式

(1)部署MySQL

docker run -d \
  --name mysql \
  -p 3307:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  -v /root/mysql/data:/var/lib/mysql \
  -v /root/mysql/init:/docker-entrypoint-initdb.d \
  -v /root/mysql/conf:/etc/mysql/conf.d \
  mysql

(2)部署后端

docker run -d \
  --name hmall \
  -p 8090:8080 \
  --network gtc \
  hmall

(3)部署前端 

docker run -d \
  --name nginx \
  -p 18080:18080 \
  -p 18081:18081 \
  -v /root/nginx/html:/usr/share/nginx/html \
  -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
  --network gtc \
  nginx

10.2 docker-compose.yml

version: "3.8"

services:
  mysql:
    image: mysql
    container_name: mysql
    ports:
      - "3307:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:
      - hm-net
  hmall:
    build: 
      context: .
      dockerfile: Dockerfile
    container_name: hmall
    ports:
      - "8090:8080"
    networks:
      - hm-net
    depends_on:
      - mysql
  nginx:
    image: nginx
    container_name: nginx
    ports:
      - "18080:18080"
      - "18081:18081"
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
      - "./nginx/html:/usr/share/nginx/html"
    depends_on:
      - hmall
    networks:
      - hm-net
networks:
  hm-net:
    name: hmall

10.3 docker compose的命令格式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值