docker全解

docker全解

一、docker的基本概念

  1. 什么是docker?

    • docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

    • docker的英文翻译是“搬运工”的意思,他搬运的东西就是我们常说的集装箱Container,Container里面装的是任意类型的App,我们的开发人员可以通过docker将App变成一种标准化的、可移植的、自管理的组件,我们可以在任何主流的操作系统中开发、调试和运行。

    image-20231202165220883

  2. docker与VMware的比较

    Docker VMware
    虚拟化 轻量级虚拟化(只虚拟出来容器所需要的资源,软件层面) 完全虚拟化(虚拟化硬件)
    启动速度 秒级 分钟级
    运行性能 接近原生 5%左右损失
    磁盘占用 MB GB
    数量 成百上千 一般几十台
    隔离性 进程级别 系统级(更彻底)
    操作系统 主要支持Linux 几乎所有
    封装程度 只打包项目代码和依赖关系,共享宿主机内核 完整的操作系统
  3. docker架构

    docker架构主要由以下几个组件组成:

    • Docker Client(docker客户端):用户使用Docker命令行工具与Docker Daemon交互,发送命令来构建、运行和管理容器。
    • Docker Daemon(docker守护进程):运行在主机上,负责管理容器的生命周期,处理容器的创建、启动、停止等操作。它还负责与Docker Registry交互,从Registry中下载镜像并在本地保存。
    • Docker Registry(docker镜像仓库):用户与存储和分享docker镜像。docker官方提供了公共的Registry,称为Docker Hub,也可以在本地搭建私有的Registry。
    • Docker Image(docker镜像):是容器的基础,包含了运行容器所需的所有文件、配置和依赖。Docker镜像可以通过Dockerfile文件来构建,也可以从Docker Registry中获取。
    • Docker Container(docker容器):是docker镜像的运行实例,可以被创建、启动、停止、删除和暂停。它是轻量级的,可以在几毫秒内启动和停止。

    img

    总之,Docker 架构是一个客户端-服务器架构,客户端通过 Docker 命令行工具与 Docker Daemon 交互,Docker Daemon 负责管理容器的生命周期,Docker Registry 用于存储和分享 Docker 镜像,Docker 镜像是容器的基础,Docker 容器是 Docker 镜像的运行实例。

二、docker的安装

  1. 检查之前是否安装过docker,如果有使用yum remove docker卸载
[root@woniu ~]# yum remove docker \
> docker-client \
> docker-client-latest \
> docker-common \
> docker-latest \
> docker-latest-logrotate \
> docker-logrotate \
> docker-engine
  1. 安装yum工具

    [root@woniu ~]# yum -y install yum-utils
    
  2. 配置阿里云镜像,添加docker引擎的yum源

    [root@woniu ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
  3. 更新CentOS

    [root@woniu ~]# yum update
    
  4. 列出docker源

    [root@woniu ~]# yum list docker-ce —showduplicates | sort -r
    
  5. 安装docker

    [root@woniu ~]# yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
    
  6. 检查docker版本号

    [root@woniu ~]# docker -v
    Docker version 24.0.7, build afdd53b
    
  7. 启动docker,并设置自启

    [root@woniu ~]# systemctl start docker
    [root@woniu ~]# systemctl enable docker
    

三、docker容器配置

  1. 配置本地镜像库

    从默认网络获取docker镜像太慢,为了提高速度,可以配置国内的镜像库,可同时配置多个

    [root@woniu ~]# vim /etc/docker/daemon.json
    
    {
         
            "registry-mirrors":[
                    "https://ung2thfc.mirror.aliyuncs.com",
                    "https://docker.mirrors.ustc.edu.cn",
                    "https://registry.docker-cn.com",
                    "http://hub-mirror.c.163.com",
                    "https://mirror.ccs.tencentyun.com"
            ]
    }
    

    配置完成之后重启docker

    [root@woniu ~]# systemctl restart docker
    
  2. 设置docker的静态ip

    目的:解决docker运行过程中ip的固定。

    docker容器的ip地址在每次启动后启动顺序设置ip地址,为解决ip地址变动的问题,我们有必要设置docker内部ip地址固定。

  3. 创建自定义网络(network)

    docker network create —driver bridge —subnet=自定义网络ip/16 —gateway=网关值 自定义网络名称

    [root@woniu ~]# docker network create --driver bridge --subnet=172.18.12.0/16 --gateway=172.18.1.1 wn_docker_net
    

    查看创建的网络

    [root@woniu ~]# docker network ls
    NETWORK ID     NAME                      DRIVER    SCOPE
    70fe2b91dc9a   bridge                    bridge    local
    dc8dac7cdeb4   host                      host      local
    ab24c1a95ddc   none                      null      local
    88dee123076b   ssc-replication_default   bridge    local
    b948a39c4ea9   test_default              bridge    local
    4bb015285e05   wn_docker_net             bridge    local
    
    [root@woniu ~]# docker inspect wn_docker_net
    [
        {
         
            "Name": "wn_docker_net",
            "Id": "4bb015285e05f57ab4b59e30f2eb9c0b76818c850680a3910aca6201aac9bdaa",
            "Created": "2023-09-25T15:33:43.398740767+08:00",
            "Scope": "local",
            "Driver": "bridge",
            "EnableIPv6": false,
            "IPAM": {
         
                "Driver": "default",
                "Options": {
         },
                "Config": [
                    {
         
                        "Subnet": "172.18.12.0/16",
                        "Gateway": "172.18.1.1"
                    }
                ]
            },
            "Internal": false,
            "Attachable": false,
            "Ingress": false,
            "ConfigFrom": {
         
                "Network": ""
            },
            "ConfigOnly": false,
            "Containers": {
         },
            "Options": {
         },
            "Labels": {
         }
        }
    ]
    
  4. docker常见问题IPv4 forwarding disabled的解决方案

    docker run创建运行容器可能出现警告WARNING: IPv4 forwarding is disabled. Networking will not work.解决方案为开启路由转发功能,方式如下

    [root@woniu ~]# vim /etc/sysctl.conf
    

    在末尾追加net.ipv4.ip_forward=1,保存退出(:wq)

    查看是否修改成功

    [root@woniu ~]# sysctl net.ipv4.ip_forward
    net.ipv4.ip_forward = 1
    

    重启network和docker服务

    [root@woniu ~]# systemctl restart network
    [root@woniu ~]# systemctl restart docker
    

四、docker创建运行容器

以mysql为例,步骤如下

  1. 查询mysql镜像

    [root@woniu ~]# docker search mysql
    

    image-20231203151213940

  2. 拉取mysql镜像

    [root@woniu ~]# docker pull mysql
    
  3. 查看下载好的镜像

    [root@woniu ~]# docker images
    REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
    ...
    mysql                 latest    99afc808f15b   3 months ago    577MB
    
  4. 创建一个简单的运行容器(创建成功会自动启动)

    [root@woniu ~]# docker run -it --name mysql_test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123 -d mysql
    3f315b1897133652129196a2dcb5bb0ef5e107d5f0d3019bc5e520a4c54348bf
    

    参数解释

    • -it: 这个参数表示要分配一个交互式(-i)的终端(-t)(tty),通常用于需要交互的容器,比如运行一个 shell。
    • –name mysql_test: 用来指定容器的名称,这里将容器命名为 mysql_test。
    • -p 3306:3306: 这个参数表示将容器的 3306 端口映射到宿主机的 3306 端口,这样可以通过宿主机的 3306 端口访问到容器中运行的 MySQL 服务。
    • -e MYSQL_ROOT_PASSWORD=123: 通过这个参数可以设置 MySQL 的 root 用户的密码为 123。这是通过环境变量的方式传递给 MySQL 容器的。
    • -d: 这个参数表示以守护进程(后台)模式运行容器,容器启动后会在后台持续运行。
    • mysql: 这是指定要运行的镜像,即在这个容器中运行的应用程序。
  5. 查看运行中的容器

    [root@woniu ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND                   CREATED              STATUS              PORTS                 NAMES
    3f315b189713   mysql     "docker-entrypoint.s…"   About a minute ago   Up About a minute   3306/tcp, 33060/tcp   mysql_test
    
  6. 进入容器内部

    [root@woniu ~]# docker exec -it mysql_test bash
    bash-4.4#
    
  7. 进入mysql

    bash-4.4# mysql -uroot -p123
    
  8. 查看mysql中的数据库

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    4 rows in set (0.00 sec)
    

    这样我们就创建好了一个简单mysql容器了

  9. 使用Navicat连接mysql进行测试

    为了让外界能连docker内部的mysql,我们需要开放防火墙的3306端口或者是直接关闭防火墙(二选一)

    • 开放防火墙的3306端口

      [root@woniu ~]# firewall-cmd --zone=public --add-port=3306/tcp --permanent
      [root@woniu ~]# firewall-cmd --reload
      

      查看已开放的端口

      [root@localhost conf]# firewall-cmd --zone=public --list-ports 
      3306/tcp
      
    • 关闭并禁用防火墙(不会自启了)

      [root@woniu ~]# systemctl stop firewalld
      [root@woniu ~]# systemctl disable firewalld
      

    image-20231203155752619

    这时候我们发现还是连不上,需要做一些处理,进入容器内的mysql,我们发现mysql8.x版使用的是caching_sha2_password 身份验证机制,而客户端不支持这种新的加密方式,需要进行修改

    mysql> select host,user,plugin,authentication_string from mysql.user;
    +-----------+------------------+-----------------------+---------------------------------
    | host      | user             | plugin                | authentication_string
    +-----------+------------------+-----------------------+---------------------------------
    | %         | root             | caching_sha2_password | $A$005$w(nn{
         ]>%Gz;5^u:9wu3vTHopW
    | localhost | mysql.infoschema | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVAL
    | localhost | mysql.session    | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVAL
    | localhost | mysql.sys        | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVAL
    | localhost | root             | caching_sha2_password | $A$005$1,Zq#1:OAK0Y&aSg6C/LCydGb
    +-----------+------------------+-----------------------+---------------------------------
    5 rows in set (0.00 sec)
    

    修改加密规则,更新用户密码并刷新权限

    mysql> ALTER USER 'root'@'%' IDENTIFIED BY '123' PASSWORD EXPIRE NEVER;
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123';
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.01 sec)
    

    退出容器,重启mysql服务

    [root@woniu ~]# docker restart mysql_test
    

    现在的话,就可以连接成功了

    image-20231203160013848

五、docker常用命令及参数

  1. 容器管理:
    • docker run: 创建、运行一个新的容器
      • -d: 以守护进程(后台)模式运行容器
      • -it: 分配一个交互式的终端
      • –name: 指定容器的名称
      • -p: 端口映射
      • –network:指定容器连接的网络。比如指定为我们之前自定义的网络–network wn_docker_net
      • –ip:指定容器内部ip,配合–network使用,如–ip 172.18.12.2
      • -v:用于挂载数据卷,如-v /usr/local/softwares/mysql/3306/conf/my.cnf:/etc/mysql/my.cnf,冒号左边的是外面宿主机的文件路径,冒号右边的是容器内的文件路径,这样我们可以修改外面的文件,容器内部的文件会被自动修改,非常方便
      • -e:用于设置环境变量
      • –restart:设置容器的重启策略。可以使用该参数来指定容器在退出时的重启策略,如 --restart=always 表示容器退出时总是重启。能够使我们在启动docker时,自动启动docker内的各种容器。
      • –rm:容器退出时自动删除。使用该参数可以在容器退出后自动删除容器,适用于临时性任务的容器。
    • docker start: 启动已经停止的容器
    • docker stop: 停止正在运行的容器
    • docker restart: 重启容器
    • docker rm: 删除容器
    • docker ps: 查看正在运行的容器
    • docker ps -a: 查看所有容器(包括已停止的)
    • docker logs: 查看容器的日志,如果在配置文件设置了自定义的日志路径则失效,此时应该把日志挂载到外面查看
  2. 镜像管理:
    • docker pull: 下载镜像
    • docker build: 构建镜像
    • docker push: 推送镜像到仓库
    • docker images: 查看本地的镜像列表
    • docker rmi: 删除镜像
  3. 网络管理:
    • docker network ls: 列出 Docker 网络
    • docker network create: 创建一个新的 Docker 网络
    • docker network connect: 将容器连接到网络
    • docker network disconnect: 将容器从网络断开
  4. 仓库管理:
    • docker login: 登录到 Docker 仓库
    • docker logout: 退出 Docker 仓库
    • docker search: 在 Docker 仓库中搜索镜像
  5. 其他常用命令:
    • docker exec: 在运行的容器中执行命令,一般使用docker exec -it 容器名 bash进入容器内部
    • docker info: 显示 Docker 系统信息
    • docker version: 显示 Docker 版本信息
    • docker-compose: 使用 Docker Compose 来定义和运行多个容器的应用程序
    • docker inspect:用于获取有关 Docker 对象(如容器、镜像、网络等)的详细信息,可以配合管道|grep "x"进行过滤输出结果搜索包含x的指定行

以上是一些常用的 Docker 命令及其参数,当然 Docker 还有更多的命令和选项,具体使用时可以通过docker --help/-h或者 docker [command] --help 来查看详细的帮助信息。

六、Dockerfile

  1. 简介

    Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

  2. 结构

    image-20231010183346123

  3. 常用指令

    • FROM:指定基础镜像
    • MAINTAINER:指定维护者信息
    • ADD:复制文件
    • ENTRYPOINT:入口点
    • EXPOSE:指定暴露出去的端口号
    • VOLUME:指定挂载点
  4. 我的第一个Dockerfile

    • 创建文件hello,编辑内容,:wq保存退出

      [root@woniu abc]# vim hello
      FROM mysql:5.7
      MAINTAINER XZX
      
    • 使用docker build构建镜像(-t给构建的镜像指定标签,-f指定 Dockerfile 的路径,.表示当前目录)

      [root@woniu abc]# docker build -t mysql:5.7 -f hello .
      
    • 查看构建好的镜像

      [root@woniu abc]# docker images
      REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
      ...
      mysql                 5.7       ddb3dd52c6a0   23 months ago   448MB
      

    一般使用Dockerfile是用来构建自己的项目容器的,使用springboot整合Dockerfile文件,具体可以参考我之前写的博客(springboot整合Dockerfile-CSDN博客

    FROM anapsix/alpine-java 
    MAINTAINER xzx 
    EXPOSE 9090 
    ADD target/hello-docker-1.0-SNAPSHOT.jar /app.jar 
    ENTRYPOINT ["java","-jar","/app.jar"]
    

    image-20231010193528319

    • FROM:指定基础镜像为java,也就是jdk,java项目需要jdk(或jre)运行
    • MAINTAINER:指定维护者信息为xzx
    • EXPOSE:指定暴露出去的端口号为9090
    • ADD:复制文件,将jar复制到容器的根目录下,命名为app.jar
    • ENTRYPOINT:入口点,容器一旦创建运行,将会自动执行java -jar命令启动项目

七、docker compose

  1. 简介

    docker compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建、启动和停止。简单来说,它可以帮你一次性同时创建并启动多个docker容器。

    查看源图像

  2. 下载(https://github.com/docker/compose/releases?page=3)

    这里我选择了2.14.2版本

    image-20231203184640416

    下载完成后上传到你的虚拟机里的/usr/local/bin/目录下,放到这个目录下可以全局使用,对它添加可执行权限,修改名字简化使用

    [root@woniu abc]# cd /usr/local/bin
    [root@woniu bin]# chmod u+x docker-compose-linux-x86_64
    [root@woniu bin]# mv docker-compose-linux-x86_64 docker-compose
    

    查看版本

    [root@woniu ~]# docker-compose --version
    Docker Compose version v2.14.2
    
  3. 简单使用

    通过使用命令docker-compose up就可以按照当前目录下docker-compose.yml的配置内容进行构建

    image-20231203190431316

    随便进入一个目录,创建docker-compose.yml文件,编辑里面的内容

    version: '2'
    networks:
      wn_docker_net:
        external: true
    services:
      hello-compose01:
        build: .
        image: redis
        container_name: redis_6399
        ports:
          - "6399:6379"
        networks:
          wn_docker_net:
            ipv4_address: 172.18.12.102
      hello-compose02:
        build: .
        image: mysql
        container_name: mysql_3320
        environment:
          - "MYSQL_ROOT_PASSWORD=123"
        ports:
          - "3320:3306"
        networks:
          wn_docker_net:
            ipv4_address: 172.18.12.101
    

    build: .指的是会在当前目录下找一个Dockerfile文件来构建镜像,这个就和之前docker run配合参数构建运行容器一样,只不过可以一次性构建多个,之后可以配合Dockerfile来构建分布式项目。

    使用docker-compose up执行

    [root@woniu test]# docker-compose up
    [+] Running 2/2
     ⠿ Container mysql_3320  Created                                                    0.1s
     ⠿ Container redis_6399  Created                                                    0.1s
    Attaching to mysql_3320, redis_6399
    mysql_3320  | 2023-12-03 11:14:26+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.1.0-1.el8 started.
    redis_6399  | 1:C 03 Dec 2023 11:14:26.959 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    ...
    

    Ctrl+C终止

    ^CGracefully stopping... (press Ctrl+C again to force)
    [+] Running 2/2
     ⠿ Container mysql_3320  Stopped                                                    1.8s
     ⠿ Container redis_6399  Stopped                                                    0.3s
    canceled
    

    docker-compose restart重新启动,这次是后台启动,可以做其他操作

    [root@woniu test]# docker-compose restart
    [+] Running 2/2
     ⠿ Container redis_6399  Started                                                    0.4s
     ⠿ Container mysql_3320  Started                                                    0.5s
    [root@woniu test]#
    

    docker ps查看已启动的容器

    [root@woniu test]# docker ps
    CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS              PORTS                                                  NAMES
    e0594171516b   mysql     "docker-entrypoint.s…"   4 minutes ago   Up About a minute   33060/tcp, 0.0.0.0:3320->3306/tcp, :::3320->3306/tcp   mysql_3320
    b3d8853bea34   redis     "docker-entrypoint.s…"   4 minutes ago   Up About a minute   0.0.0.0:6399->6379/tcp, :::6399->6379/tcp              redis_6399
    

    docker-compose stop关闭构建的多个容器

    [root@woniu test]# docker-compose stop
    [+] Running 2/2
     ⠿ Container mysql_3320  Stopped                                                    1.4s
     ⠿ Container redis_6399  Stopped                                                    0.2s
    
  4. Spring Boot整合docker compose(还加了Dockerfile配合)

    编写Dockerfile

    image-20231203192429023image-20231203192459454

    编写docker-compose.yml

    image-20231203192542942image-20231203192605403

    点击docker-compose.yml里面services:左边绿色的按钮运行并进行访问测试,测试成功

    image-20231203192840943

    当中可能出现报错,说需要Docker Desktop才能运行,那就去下好了,地址为docker.com/products/docker-desktop/,下载Windows版的(如果你电脑是Windows系统的话)。

相关推荐

  1. Postcat使用

    2023-12-10 04:14:03       25 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-10 04:14:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-10 04:14:03       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-10 04:14:03       82 阅读
  4. Python语言-面向对象

    2023-12-10 04:14:03       91 阅读

热门阅读

  1. ANSYS 有限元分析 后处理 结点解与单元解

    2023-12-10 04:14:03       63 阅读
  2. 数据库基础学习03计算机二级-第三章 数据定义

    2023-12-10 04:14:03       53 阅读
  3. 85. 最大矩形

    2023-12-10 04:14:03       62 阅读
  4. 力扣labuladong一刷day31天二叉树

    2023-12-10 04:14:03       54 阅读
  5. 在Go中使用循环时使用Break和Continue语句

    2023-12-10 04:14:03       58 阅读
  6. 汽车网络安全--ISO\SAE 21434解析(一)

    2023-12-10 04:14:03       59 阅读
  7. Environment Variables Used by GPUDirect Storage

    2023-12-10 04:14:03       59 阅读
  8. 解释 Git 的基本概念和使用方式。

    2023-12-10 04:14:03       38 阅读