day02 -- docker

1.docker的介绍

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低

Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付 ,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
镜像 :将应用所需的函数库、依赖、配置等与应用一起打包得到的就是镜像(模板)
容器 :为每个镜像的应用进程创建的隔离运行环境就是容器(实例)
镜像仓库:存储和管理镜像的地方就是镜像仓库,DockerHub是目前最大的镜像仓库,其中包含各种常见的应用镜像

2.docker的安装

2.1 卸载旧版本

bash 复制代码
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

2.2 设置Docker仓库

yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2

bash 复制代码
sudo yum install -y yum-utils

截图如下:

官方docker仓库

bash 复制代码
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

华为源

bash 复制代码
sudo yum-config-manager --add-repo https://mirrors.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

阿里docker仓库

bash 复制代码
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

清华docker仓库

bash 复制代码
sudo yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

腾讯源

bash 复制代码
yum-config-manager --add-repo=https://mirrors.cloud.tencent.com/docker-ce/linux/centos/docker-ce.repo

建议使用国内源等

2.3 安装 Docker Engine-Community

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

2.4 配置docker hub加速器(国内源)

bash 复制代码
sudo vi /etc/docker/daemon.json

修改内容如下:

bash 复制代码
{  
  "registry-mirrors": [  
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://hub.geekery.cn",
    "https://dockerpull.com",
    "https://docker.m.daocloud.io",
    "https://docker.mirrors.ustc.edu.cn"
  ]  
}

加载配置,启动Docker服务,查看镜像是否配置成功

bash 复制代码
sudo systemctl daemon-reload  
sudo systemctl start docker
sudo docker info

在输出信息中,你应该能看到Registry Mirrors部分,并且列出了你添加的镜像源地址

2.5 设置docker开机自启

bash 复制代码
systemctl enable docker

也有停止(stop),重启(restart),检查状态(status)命令

2.6 创建mysql容器

bash 复制代码
docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=12345678 mysql


3.docker的常见命令

所有命令都可以通过--help进行查看

3.1 命令解读

bash 复制代码
docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=12345678 mysql

命令解释

bash 复制代码
docker run :创建并运行一个容器
-d 是让容器在后台运行
--name mysql :给容器起个名字,必须唯一
-p 3306:3306 :设置端口映射
-e KEY=VALUE :是设置环境变量
mysql :指定运行的镜像名称

镜像命名规范

镜像名称一般分两部分组成:[repository]:[tag]

其中repository就是镜像名,tag是镜像的版本

在没有指定tag时,默认是latest,代表最新版本的镜像
常见命令图

详见官方文档

3.2 镜像命令

可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址

3.2.1 查看镜像 -- docker images
handlebars 复制代码
docker images
3.2.2 仓库拉取镜像 -- docker pull
bash 复制代码
docker pull 镜像名称

例:拉取nginx

bash 复制代码
docker pull nginx
3.2.3 保存镜像文件 -- docker save
bash 复制代码
docker save -o 文件名.tar 镜像名称

例:将nginx镜像保存到本地

bash 复制代码
docker save -o nginx.tar nginx:latest
3.2.4 加载镜像文件 -- docker load
bash 复制代码
docker load -i 镜像文件

注:镜像文件中的镜像在docker中没有拉取才能成功加载进去,否则需要删除镜像后,再把外部的镜像加载进去

bash 复制代码
docker load -i nginx.tar
3.2.5 构建镜像 --docker build

需要自己编写Dockerfile文件,实例参照自定义镜像

bash 复制代码
docker build -t 镜像名 Dockerfile目录
3.2.6 删除镜像 --docker rmi
bash 复制代码
docker rmi 镜像名称

例:删除nginx

bash 复制代码
docker rmi nginx

3.3 容器命令

3.3.1 查看容器状态

默认只查看运行中的容器状态,可加-a查看所有容器的状态

bash 复制代码
docker ps
3.3.2 格式输出
bash 复制代码
docker ps --format "table {{.Names}}\t{{.ID}}\t{{.Ports}}\t{{.Status}}\t{{.Image}}"
3.3.3 查看容器运行日志

默认后台运行,可加-f实现前台运行,ctrl+C退出

bash 复制代码
docker logs 容器名
3.3.4 进入容器
bash 复制代码
docker exec -it 容器名 bash

例:进入mysql容器,退出exit

bash 复制代码
 docker exec -it mysql bash

进入数据库

bash 复制代码
mysql -uroot -p

输入密码,即可进入数据库

3.3.5 停止容器
bash 复制代码
docker stop 容器名
3.3.6 启动容器
bash 复制代码
docker start 容器名
3.3.7 删除容器
bash 复制代码
docker rm 容器名

3.4 别名

实际上就是相当于设置快捷键

bash 复制代码
 vi ~/.bashrc

第一次打开会有默认的配置

也可以自己加进去

bash 复制代码
alias dps='docker ps --format "table {{.Names}}\t{{.ID}}\t{{.Ports}}\t{{.Status}}\t{{.Image}}"'

重新加载

bash 复制代码
source ~/.bashrc

4.docker数据卷与本地目录的挂载

4.1 数据卷挂载

数据卷 是一个虚拟目录,它将宿主机目录映射到容器内目录,方便我们操作容器内文件,或者方便迁移容器产生的数据
挂载数据卷

在创建容器时,利用 -v 数据卷名:容器内目录完成挂载

容器创建时,如果发现挂载的数据卷不存在时,会自动创建
常见命令

bash 复制代码
# 查看数据卷
docker volume ls
# 删除数据卷
docker volume rm
# 查看数据卷详情
docker volume inspect
# 删除未使用的数据卷
docker volume prune

例:利用Nginx容器部署静态资源

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

注:在执行docker run命令时,使用 -v 数据卷:容器内目录 可以完成数据卷挂载;当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
1.将静态资源上传

2.创建容器

handlebars 复制代码
docker run -d \
--name nginx \
-p 80:80  \
-v html:/usr/share/nginx/html \
nginx


3.查看卷

handlebars 复制代码
docker volume ls
docker volume inspect html

只要本地文件系统的挂载文件变化对应的容器里的文件也会发送变化

4.2 本地目录挂载

与挂载数据卷类似,
挂载本地目录

在创建容器时,利用 -v 本地目录:容器内目录完成挂载

例如:

mysql容器的数据挂载

查看mysql容器,判断是否有数据卷挂载

基于宿主机目录实现MySQL数据目录、配置文件、初始化脚本的挂载(查阅官方镜像文档)

  1. 挂载/root/mysql/data到容器内的/var/lib/mysql目录
  2. 挂载/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录,携带课前资料准备的SQL脚本
  3. 挂载/root/mysql/conf到容器内的/etc/mysql/conf.d目录,携带课前资料准备的配置文件

注:

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

  • -v mysql : /var/lib/mysql 会被识别为一个数据卷叫mysql
  • -v ./mysql : /var/lib/mysql 会被识别为当前目录下的mysql目录
  1. 上传资源
  2. 创建容器
handlebars 复制代码
docker run -d --name mysql -p 3306:3306  -v /root/mysql/data:/var/lib/mysql -v /root/mysql/init:/docker-entrypoint-initdb.d -v /root/mysql/conf:/etc/mysql/conf.d --network heima -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123456 mysql

3.连接数据库查看

5.自定义镜像

5.1 镜像结构

5.2 Dockerfile


handlebars 复制代码
# 基础镜像
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
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

例:

Java项目先打包(maven中package),在把打包后的jar包和Dockerfile上传到同一个目录下,在这个目录下再进镜像构建,创建容器

1. 上传资源

2. 构建镜像

handlebars 复制代码
docker build -t hmall .

3. 创建容器

handlebars 复制代码
docker run --name hmall --network heima -p 8080:8080 -d  hmall



参考博客:docker快速入门

6.容器网络互连

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

6.1 相关命令

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

加入自定义网络的容器才可以通过容器名互相访问,默认网络下容器间不能相互访问

6.2 案例

例:创建自定义网络,创建容器加入此网络

handlebars 复制代码
 docker network create cat
handlebars 复制代码
 docker network ls
handlebars 复制代码
docker run --name hmall -p 8080:8080 -d --network cat  hmall

注:容器名不能与现有的容器名重复

7.项目部署

部署前请先清空容器与镜像,防止创建时冲突

例:黑马商城

7.1 自定义网络

handlebars 复制代码
 docker network create catgod007

7.2 数据库容器部署

1.上传资源


2.创建容器

handlebars 复制代码
docker run -d --name mysql -p 3306:3306  -v /root/mysql/data:/var/lib/mysql -v /root/mysql/init:/docker-entrypoint-initdb.d -v /root/mysql/conf:/etc/mysql/conf.d --network catgod007 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123456 mysql

也可以用数据库可视化工具查看数据库表是否都在

7.3 后端项目容器部署

1.资源上传

把hmall项目用idea打开,用maven中的package进行打包(会在与src同级的target目录中出现);把dockerfile和jar包 上传

2.构建镜像

handlebars 复制代码
docker build -t hmall .

3.创建容器

handlebars 复制代码
docker run --name hmall --network catgod007 -p 8080:8080 -d  hmall

7.4 前端项目容器部署

1.上传资源

将资料提供的nginx.conf、html目录与容器挂载(nginx整个文件夹上传)

nginx的配置文件(nginx.conf)中的8080前域名 要与后端部署的容器名 保持一致(默认hmall)
2.创建容器

handlebars 复制代码
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 catgod007 \
nginx

7.5 最终展示

浏览器输入ip地址:18080

8.docker compose 部署容器

8.1 Docker Compose介绍

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

上面的项目部署可以改成通过docker-compose.yml一键部署

handlebars 复制代码
version: "3"

services:
  mysql:
    image: mysql
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:
      - cat-net
  hmall:
    build: 
      context: .
      dockerfile: Dockerfile
    container_name: hmall
    ports:
      - "8080:8080"
    networks:
      - cat-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:
      - cat-net
networks:
  cat-net:
    name: catgod007

注:

  • docker-compose.yml主要分为项目(Project)与服务(Services)
  • 服务相关参数与docker构建容器差不多,部分如下:
    • depends_on ;依赖,及前端依赖后端,后端依赖数据库

8.2 案例:一键部署项目

1.上传docker-compose.yml到/root

2.清空容器和镜像

3.通过docker-compose.yml部署容器

handlebars 复制代码
docker compose up -f ./docker-compose.yml -p catgod007 -d

docker-compose.yml在当前目录下,可省略-f ./docker-compose.yml
-p catgod007指定名字,不指定默认root
-d后台运行

handlebars 复制代码
docker compose up -d


4.通过浏览器进行访问

浏览器输入ip地址:18080

感谢大家的支持,关注,评论,点赞!

相关推荐
朝九晚五ฺ7 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
Kkooe8 小时前
GitLab|数据迁移
运维·服务器·git
wuxingge8 小时前
k8s1.30.0高可用集群部署
云原生·容器·kubernetes
久醉不在酒8 小时前
MySQL数据库运维及集群搭建
运维·数据库·mysql
志凌海纳SmartX9 小时前
趋势洞察|AI 能否带动裸金属 K8s 强势崛起?
云原生·容器·kubernetes
锅总9 小时前
nacos与k8s service健康检查详解
云原生·容器·kubernetes
BUG弄潮儿9 小时前
k8s 集群安装
云原生·容器·kubernetes
意疏9 小时前
【Linux 篇】Docker 的容器之海与镜像之岛:于 Linux 系统内探索容器化的奇妙航行
linux·docker
虚拟网络工程师10 小时前
【网络系统管理】Centos7——配置主从mariadb服务器案例(下半部分)
运维·服务器·网络·数据库·mariadb
墨鸦_Cormorant10 小时前
使用docker快速部署Nginx、Redis、MySQL、Tomcat以及制作镜像
redis·nginx·docker