Docker详解

目录

学习docker遇到的问题

安装mysql(涉及重要的网络配置)

常见命令

数据卷挂载

本地目录挂载(包括mysql容器挂载示例)

自定义镜像

镜像结构

Dockerfile

自定义镜像

网络

项目部署(实战)

1.部署Java应用

2.部署前端

3.DockerCompose

1.定义

2.docker与虚拟机(VM)的区别


学习docker遇到的问题

1.安装docker:

首先配置了阿里云镜像源:已解决centos7 yum报错:cannot find a valid baseurl for repo:base/7/x86_64的解决方案_cannot find a valid baseurl for repo: base-优快云博客

安装完docker以后配置镜像加速:也是配置的阿里云镜像(阿里云镜像后面没有用了)。

用的别人的镜像

指令:

vim /etc/docker/daemon.json

{

"registry-mirrors": [

"https://dockerpull.org",

"https://docker.1ms.run",

"https://registry.docker--cn.com",

"https://mirror.ccs.tencentyun.com",

"https://ung2thfc.mirror.aliyuncs.com",

"https://docker.registry.cyou",

"https://docker-cf.registry.cyou",

"https://dockercf.jsdelivr.fyi",

"https://docker.jsdelivr.fyi",

"https://dockertest.jsdelivr.fyi",

"https://mirror.aliyuncs.com",

"https://dockerproxy.com",

"https://mirror.baidubce.com",

"https://docker.m.daocloud.io",

"https://docker.nju.edu.cn",

"https://docker.mirrors.sjtug.sjtu.edu.cn",

"https://docker.mirrors.ustc.edu.cn",

"https://mirror.iscas.ac.cn",

"https://docker.rainbond.cc"

]

}

修改了之后 执行以下两条命令

sudo systemctl daemon-reload #重载systemd管理守护进程配置文件
sudo systemctl restart docker #重启 Docker 服务

安装mysql(涉及重要的网络配置)

指令: vim /etc/resolv.conf

添加新的 DNS 服务器,在文件中添加新的nameserver条目。你可以将 Google 的公共 DNS 服务器添加到文件中。

配置:

# Generated by NetworkManager

search localdomain

nameserver 192.168.126.2

nameserver 8.8.8.8

nameserver 8.8.4.4

推荐博客:

使用docker环境报错解决#ERROR: Error response from daemon: Get “https://registry-1.docker.io/v2/_unable to find image 'n:latest' locally docker: er-优快云博客

成功后用Navicat远程连接:

Docker结构:

命令解读:

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

常见命令

docker rm -f dd  //强制删除名为 dd 的Docker容器,即使它正在运行。

# Docker开机自启
systemctl enable docker

# Docker容器开机自启
docker update --restart=always [容器名/容器id]

docker ps
docker ps -a
docker start ebf7eef9219d(容器名称或ID)

启动docker里面存在但是停止的容器时(判断方法:使用指令docker ps和指令docker ps -a),

用指令docker start ebf7eef9219d(容器名称或ID)而非指令docker run 。。。

查看容器详细信息:docker inspect nginx(容器名)

举例:

数据卷挂载

容器里的文件以及文件夹操作指令有限(比如ll指令,vi指令都没有),容器里的镜像环境只是让容器里的应用足够运行,所以很多与应用运行无关的指令都没有,所以想要操作更改容器内应用的文件很困难。便需要用到数据卷了:

例子:

总结:

本地目录挂载(包括mysql容器挂载示例)

向像mysql这种时刻会改变目录文件的应用,本来是有默认的挂载的(使用的是匿名数据卷挂载),这种挂载方式与我们普通的数据卷挂载没有差别。

匿名数据卷挂载的缺点:

缺点1:使用匿名数据卷的话,删除再重新用docker拉取应用的话,之前应用的数据没有完成迁移。(当然可以自己去手动拷贝,但是由于目录太深,数据卷名称太长导致会很复杂)

如果删除MYSQL重新拉取的话,后面生成的数据卷名称不同,导致宿主机对应的目录也不同,也就是删除前的mysql的数据没有完成迁移,也就相当于之前的数据都丢失了。

所以我们就要自己实现本地目录挂载(这种挂载方式使得数据存储更为持久)

缺点2:数据卷的目录结构较深,如果我们去操作数据卷目录会不太方便

本地目录挂载这种方式自定义宿主机本地目录,可以避免数据卷挂载的(数据卷的目录结构较深,如果我们去操作数据卷目录会不太方便)这种麻烦。

例子:

步骤:

先删除之前的匿名数据卷挂载的mysql:

在虚拟机(宿主机)中创建好目录:

把准备好的配置文件和脚本放到对应目录。

docker ps -a:检查之前的mysql容器有没有被删除。

执行指令:

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

成功把mysql容器内目录挂载到本地目录

自定义镜像

镜像结构

镜像是分层的。

自定义镜像时,基础镜像可以复用之前安装过的一些应用的(公共镜像),这样可以大大减小镜像的体积。

举例:

Dockerfile

自定义镜像

没有跟着黑马课程自定义一个java项目(一个demo)的镜像。。。

网络

看黑马对应课程的在线笔记:Docs

首先,我们查看下MySQL容器的详细信息,重点关注其中的网络IP地址:

# 1.用基本命令,寻找Networks.bridge.IPAddress属性
docker inspect mysql
# 也可以使用format过滤结果
docker inspect --format='{{range .NetworkSettings.Networks}}{{println .IPAddress}}{{end}}' mysql
# 得到IP地址如下:
172.17.0.2

# 2.然后通过命令进入dd容器(dd容器里运行的是java项目)
docker exec -it dd bash

# 3.在容器内,通过ping命令测试网络
ping 172.17.0.2
# 结果
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.053 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.059 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.058 ms

发现可以互联,没有问题。

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

所以,我们必须借助于docker的网络功能来解决这个问题,官方文档:

docker network | Docker Docs

常见命令有:

docker network  ls

自定义网络:

加入自定义网络的容器才可以通过容器名互相访问

# 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.dd容器,也就是我们的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

现在无需记住IP地址也可以实现容器互联了。

总结

  • 在自定义网络中,可以给容器起多个别名,默认的别名是容器名本身
  • 在同一个自定义网络中的容器,可以通过别名互相访问

项目部署(实战)

1.部署Java应用

1.打包java项目成jar包

2.准备好了Dockerfile文件

3.把jar包和Dockerfile文件放到root目录下

4.输入指令(构建镜像的指令)

docker  build  -t  hmall .
# 2.查看镜像
docker images

5.输入指令(创建并运行容器的指令)

# 创建并运行容器
并通过--network将其加入hmall网络,
这样才能通过容器名访问mysql。
docker run -d --name hmall --network hmall -p 8080:8080 hmall

docker logs  -f hmall    //查看项目运行日志

测试,通过浏览器访问:http://你的虚拟机地址:8080/search/list

注:重启过虚拟机的,要启动mysql容器。

2.部署前端

需求:

1.拉取Nginx镜像

docker pull nginx

2.创建并运行nginx容器

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 hmall \
  nginx

测试,通过浏览器访问:http://你的虚拟机ip:18080

3.DockerCompose

大家可以看到,我们部署一个简单的java项目,其中包含3个容器:

  • MySQL
  • Nginx
  • Java项目

而稍微复杂的项目,其中还会有各种各样的其它中间件,需要部署的东西远不止3个。如果还像之前那样手动的逐一部署,就太麻烦了。

而Docker Compose就可以帮助我们实现多个相互关联的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"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:
      - hm-net
  hmall:
    build: 
      context: .
      dockerfile: Dockerfile
    container_name: hmall
    ports:
      - "8080: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

基础命令:

docker compose [OPTIONS] [COMMAND]

黑马商城项目演示步骤:(DockerCompose演示步骤)

1.删除之前创建的容器以及自定义镜像hmall,清空mysql数据等等

# 1.进入root目录
cd /root

2.删除旧容器
docker rm -f nginx hmall mysql/

3.删除之前自定义的hmall镜像
docker rmi hmall

4.清空MySQL数据
rm -rf mysql/data

5.删除自定义网络
  docker network rm hmall

2.启动所有, -d 参数是后台启动

docker compose up -d

打开浏览器,访问:http://198.168.126.131:8080

3.停止并移除所有容器,网络

1.定义

解决了跨系统应用的问题。

2.docker与虚拟机(VM)的区别

docker:

Docker会把运行程序及其所需要的依赖、函数库、操作系统函数库一起打包,从而与操作系统内核交互。

虚拟机:

虚拟机是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在Windows系统里面运行Ubuntu系统,这样就可以运行任意的Ubuntu应用了。
虚拟机

docker和虚拟机的差异:

docker是一个系统进程;虚拟机是在操作系统中的操作系统。

docker体积小,启动速度快,性能好;虚拟机体积大,启动速
度慢,性能一般。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值