• Docker容器


    初识Docker

    Docker产生的原因

    我们写代码会接触的环境:

    1、开发环境–程序员
    代码打成war包–部署到测试服务器上
    2、测试环境–测试人员 (测试通过)
    代码打到war包–给运维人员–运维人员部署到生产环境服务器中
    3、生产环境–运维人员
    部署再测试,就可以发版了

    当我们把开发环境打包的war包发给测试环境的时候会产生代码“”水土不服“的现象”----环境不同(如图,开发环境jdk8而生产环境是jdk7,会报错)

    在这里插入图片描述
    为了解决这种代码水土不服的现象,docker就出现了。
    将环境和代码一起发给你,用docker容器装环境和代码,那么测试人员就不用用测试环境的配置,只需要在docker容器中测试,使用开发环境的配置,这样就避免了水土不服。
    综上,解决软件跨环境迁移的问题的这个容器就是docker在这里插入图片描述

    docker的概念

    docker诞生于2013年初,基于Go语言实现,他完全使用沙箱机制,相互隔离。
    在这里插入图片描述

    Docker的安装

    基于centos7

    # 1、yum 包更新到最新 
    yum update
    # 2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 
    yum install -y yum-utils device-mapper-persistent-data lvm2
    # 3、 设置yum源
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    # 4、 安装docker,出现输入的界面都按 y 
    yum install -y docker-ce
    # 5、 查看docker版本,验证是否验证成功
    docker -v
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    Docker架构

    仓库--------镜像(静态,文件系统)–容器(镜像运行时的实体) 通过镜像创建容器
    包-----------类–对象 通过类创建镜像
    镜像来自仓库(中央仓库,私服)
    操作docker的命令,就是操作我们的客户端docker发动命令

    在这里插入图片描述

    配置Docker镜像加速器

    安装了docker客户端,要从中央仓库中去下载镜像,国外的太慢,我们一般会配置一个镜像加速器。

    登录阿里云官网–搜索容器镜像–点击容器镜像服务–点击镜像中心–点击镜像服务–看到专属自己的加速器地址–粘贴到自己的xshell中即可–接下来可以cat一下这个文件
    阿里云官网

    在这里插入图片描述
    在这里插入图片描述

    Docker命令

    docker命令大全–菜鸟教程

    Docker服务启动关闭、开机自启命令

    启动docker服务
    systemctl start docker
    停止docker服务
    systemctl stop docker
    重启docker服务
    systemctl restart docker
    查看docker服务状态
    systemctl status docker
    设置开机启动docker服务
    systemctl enable docker
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    进入容器内部命令

     sudo docker ps  
     sudo docker exec -it 容器id  /bin/bash  
    
    • 1
    • 2

    Docker镜像相关命令

    镜像名称(软件名称)–镜像就是软件和软件所需要的环境打包到这个镜像文件中,将来通过镜像文件创建出容器

    TAG(版本号)
    IMAGE_ID(镜像ID,标识符)
    CREATE(创建时间)
    SIZE(大小)

    在这里插入图片描述

    删除镜像

    docker rmi 镜像名+版本号,不写版本号默认是最新版本

    拉取镜像、更新版本

    docker pull 镜像名

    Docker容器相关命令

    查看容器(正在运行的、所有容器)

    docker ps # 查看正在运行的容器 
    docker ps –a # 查看所有容器
    
    • 1
    • 2

    创建并启动容器(docker run -it/-id)

    docker run 参数
    
    • 1

    参数说明:
    -i:保持容器运行。通常与 -t 同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出(exit)容器后,容器自动关闭。
    -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用。
    -d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容器不会关闭。
    -it 创建的容器一般称为交互式容器,-id 创建的容器一般称为守护式容器
    –name:为创建的容器命名。

    命令1:创建并且运行容器,进入容器后退出,容器关闭

    docker run -it --name=c1 redis:5.0 /bin/bash  
    解释:创建并启动容器,进入容器内,--name给容器取名字,容器是通过redis5.0版本的镜像创建的。
    exit
    解释:在容器内执行exit命令,退出容器,容器关闭了。
    
    • 1
    • 2
    • 3
    • 4

    命令2:以后台方式创建且运行容器,并进入容器后退出,容器没有关闭

    docker run -id --name=c2 redis:5.0 /bin/bash  
    解释:创建并启动容器,并没有进入容器内,--name给容器取名字,容器是通过redis5.0版本的镜像创建的。
    docker exec -it c2 /bin/bash 
    解释:进入c2容器内
    exit
    解释:在容器内执行exit命令,是退出容器,但是容器并没有关闭了。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    停止容器

    docker stop 容器名称
    
    • 1

    启动容器

    docker start 容器名称
    
    • 1

    设置容器自启

    docker update mysql --restart=always
    
    • 1

    删除容器

    如果容器是运行状态则删除失败,需要停止容器才能删除

    docker rm 容器名称
    查看容器信息
    docker inspect 容器名称
    
    • 1
    • 2
    • 3

    展示出的信息里面有

    在这里插入图片描述HostConfig–Binds:[ /root/data是宿主机的目录,也就是数据:/root/data_container是容器内绑定的目录]
    在这里插入图片描述Mounts–和上面的HostConfig对应

    Docker容器的数据卷

    数据卷的作用:

    容器数据持久化 外部机器和容器间接通信 容器之间数据交换

    什么是数据卷?数据卷和容器的关系?

    数据卷是宿主机中的一个目录或者是文件
    当容器目录和数据卷目录绑定后,对方的修改会立即同步
    一个数据卷可以被多个容器同时挂载
    一个容器也可以同时挂载多个数据卷

    配置数据卷

    docker run -it或者-id --name=容器名称 –v  宿主机目录(文件):容器内目录(文件)  镜像名称
    
    • 1
    docker run -it --name=c3 -v /root/data:/root/data_container centos /bin/bash
    
    • 1

    注意事项:

    目录必须是绝对路径
    如果目录不存在,则自动创建
    可以挂载多个数据卷

    应用场景:

    1、当容器挂掉的时候,容器中的数据会删除,但是数据卷中的数据不会被删除,在宿主机中仍然保留着挂掉容器的数据,因此当容器恢复的时候可以通过数据卷恢复
    2、window系统相当于是一个外部机器,宿主机就是我们的centos虚拟机,容器就是在宿主机内部创建开启的一个容器。
    windows系统能不能和容器直接交换文件,因为外部机器和容器不互通,但是外部机器应该是和宿主机相通的。
    容器之间数据交互?->数据卷
    数据卷是宿主机中的一个目录或文件,容器中也有一个目录,现在是将宿主机和容器中的目录挂载起来,连接起来,那么此时,宿主机中的目录就是数据卷,他们可以相互同步。
    容器数据的持久化。
    3、容器和容器的通信,也是通过数据卷挂载到同一个宿主机之间进行通信。

    一个容器内同步多个数据卷

    docker run -it --name=c2 -v  ~/data2:/root/data2  -v  ~/data3:/root/data3 centos
    
    • 1

    解释:这是一个运行Docker容器的命令,它将在CentOS镜像中创建一个名为c2的容器。其中,-it选项指定了交互式终端,并且–name选项指定了容器的名称为c2。
    -v选项用于挂载主机上的目录到容器内的目录。在这个命令中,/data2目录被挂载到容器内的/root/data2目录,/data3目录被挂载到容器内的/root/data3目录。这样可以实现主机和容器之间的文件共享。

    ~代表/root,只能在宿主机中应用,容器里面不能用~代表/root

    数据卷容器

    以上让宿主机的目录挂载到容器目录实现文件共享会产生一个问题:麻烦,要写很多个-v 宿主机绝对路径:容器绝对路径,因此我们选择使用一个数据卷容器Data Container去挂载一个数据卷,让其他的容器挂载这个数据卷容器,这就相当于c1,c2挂载到了数据卷中,相当于c1,c2,c3挂载到了数据卷中,他们可以相互通信,即使C3挂了,c1,c2也是挂载在数据卷上的。
    在这里插入图片描述注意!!!!!!!!!
    当我们
    命令1:

    创建启动c3数据卷容器,使用 –v 绝对路径 c3镜像名称 /bin/bash
    docker run –it --name=c3 –v /volume centos:7 /bin/bash
    这个/volume是不设置左边宿主机的目录,那么系统会自动给我们分配宿主机目录
    
    • 1
    • 2
    • 3

    命令2:

    
    创建启动 c1 c2 容器,使用 --volumes-from 数据卷容器名 c1镜像名称 /bin/bash
    docker run –it --name=c1 --volumes-from c3 centos:7 /bin/bash 
    docker run –it --name=c2 --volumes-from c3 centos:7 /bin/bash
    
    • 1
    • 2
    • 3
    • 4

    小结

    在这里插入图片描述

    Docker应用部署

    MsSQL部署

    在这里插入图片描述

    搜索mysql镜像

    docker search mysql
    
    • 1

    拉取mysql镜像 (8.0.34)

    docker pull mysql:8.0.34
    
    • 1

    创建容器,设置端口映射、目录映射

    在/root目录下创建mysql目录用于存储mysql数据信息

    docker run -p 13306:3306 --name mysql --restart=always --privileged=true \
    -v /mydata/mysql/log:/var/log/mysql \
    -v /mydata/mysql/data:/var/lib/mysql \
    -v /mydata/mysql/conf:/etc/mysql/conf.d \
    -v /etc/localtime:/etc/localtime:ro \
    -e MYSQL_ROOT_PASSWORD=abc123 -d mysql:8.0.30
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    参数说明:

    -p 3307:3306:将容器的 3306 端口映射到宿主机的 3307 端口。
    -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。配置目录
    -v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。日志目录
    -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。数据目录
    -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。

    成功后,可以在外部机器上面也就是mysql客户端上面去链接docker容器中的mysql,注意这里是需要mysql客户端连接宿主机被docker容器内的mysql映射的那个端口上。主机ip地址是宿主机的ip地址,端口号是被映射的3307。
    在这里测试连接的时候,可能会出现提示错误---------- Client does not support authentication protocol requested by server,点击链接看解决办法。
    在这里可能也会出现安装了mysql,但是显示找不到目录的情况,启动容器启动不起来,docker ps,不存在,但是docker ps -a可以看到容器。

    配置文件

    vim /mydata/mysql/conf/my.cnf

    将下面的内容写入 vim my.cnf这个文件
    [client]
    default-character-set=utf8mb4
    [mysql]
    default-character-set=utf8mb4
    [mysqld]
    # 设置东八区时区
    default-time_zone = '+8:00'
    # 设置密码验证规则,default_authentication_plugin参数已被废弃
    # 改为authentication_policy
    #default_authentication_plugin=mysql_native_password
    authentication_policy=mysql_native_password
    
    #secure_file_priv=/var/lib/mysql
    secure_file_priv=
    init_connect='SET collation_connection = utf8mb4_0900_ai_ci'
    init_connect='SET NAMES utf8mb4'
    character-set-server=utf8mb4
    collation-server=utf8mb4_0900_ai_ci
    skip-character-set-client-handshake
    skip-name-resolve
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    第五步,重启配置文件生效

    
    
    # 设置docker启动时启动mysql
    docker update mysql --restart=always
    
    # 重启mysql容器
    docker restart mysql
    
    # 进入mysql容器内部
    docker exec -it mysql /bin/bash
    
    #输入密码,连接mysql
    mysql -uroot -p
    
    # 退出mysql容器
    exit
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    Tomcat部署

    搜索tomcat镜像

    docker search tomcat
    
    • 1

    拉取tomcat镜像

    docker pull tomcat
    
    • 1

    创建容器,设置端口映射、目录映射

    在/root目录下创建tomcat目录用于存储tomcat数据信息

    mkdir ~/tomcat
    cd ~/tomcat
    docker run -id --name=c_tomcat \
    -p 8080:8080 \
    -v $PWD:/usr/local/tomcat/webapps \
    tomcat 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    参数说明:

    -p 8080:8080:将容器的8080端口映射到主机的8080端口

    -v $PWD:/usr/local/tomcat/webapps:将主机中当前目录挂载到容器的webapps

    接下来要在这个tomcat中加点访问页面,然后我们可以访问宿主机的80端口来借此访问容器中的80端口的这个服务的index.html

    在这里插入图片描述

    "echo"是一个在计算机编程中常用的命令,用于在终端或命令行下打印(输出)文本。它可以将指定的文本或变量的值显示在屏幕上。在不同的编程语言和操作系统中,使用方式可能会有所不同,但基本功能相同。

    访问localhost:80/index.html

    redis部署

    # 1、创建配置文件
    mkdir -p /mydata/redis/conf
    touch /mydata/redis/conf/redis.conf
    
    # 2、下载镜像
    docker pull redis
    
    # 3、启动容器
    # 云服务器一定要修改端口或配置密码,否则会被拉去挖矿
    docker run -p 6124:6379 --name redis \
    -v /mydata/redis/data:/data  \
    -v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
    -d redis redis-server /etc/redis/redis.conf
    
    # 查看redis容器是否启动
    docker ps
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    修改redis配置文件

    vim /mydata/redis/conf/redis.conf
    
    # 插入下面内容
    appendonly yes   
    requirepass abc123 
    
    # 保存
    docker restart redis
    
    # 进入redis客户端
    docker exec -it redis redis-cli
    auth 密码
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    开机自启动

    docker update redis --restart=always
    
    
    • 1
    • 2

    打包

    在打包环境下执行以下操作

     1007  docker images   //查看镜像
     1009  docker pull docker.das-security.cn/dipper-app:3.6-release    //更新镜像
     1010  docker images docker
     1011  docker save  docker.das-security.cn/dipper-app:3.6-release > dipper-app.release.3.6.0719.tar     //打包镜像为一个tar包 >表示文件是什么样子的,0719是日期
    
    • 1
    • 2
    • 3
    • 4

    接下来用xftp传输这个tar包到外部机器,然后再连接其他服务器,从外部机器中传递这个包到该服务器。
    将镜像save之后要把它load读取出来,

    docker load < dipper-app.release.3.6.0719.tar
    
    • 1

    查看镜像

    docker images
    
    • 1

    然后重启docker服务
    注意,这里的重启必须要在正确的目录下重启,比如说我的项目下是在/home目录中,那么我应该是在/home下的dipper目录下进行重启服务

    docker-compose up -d
    
    • 1

    等个几分钟,让服务彻底跑起来。

    更新主平台

    //进入有docker-compose的目录

    cd /dipper-data/dipper/dipper-deploy/
    
    • 1

    //拉取镜像,重启服务

    docker-compose pull && docker-compose up -d
    
    • 1

    停止服务,启动服务(重启平台)

    docker-compose down
    docker-compose up -d

    单独重启docker-compose的其中一个容器

    docker-compose restart worker

  • 相关阅读:
    教你轻松开发一个Andriod版即时通讯
    spring-boot---validation,参数校验,分组,嵌套,各种类型
    爬虫(六)
    Python进阶:上下文管理器
    学node 之前你要知道这些
    编译libkml-1.3.0报错:minizip/crypt.h:没有那个文件或目录
    Java中浅拷贝和深拷贝
    Visual Studio Code 自动编译 TypeScript
    Git常用命令
    Pikachu靶场——PHP反序列化漏洞
  • 原文地址:https://blog.csdn.net/Wolf__king/article/details/131749969