Docker容器

本文介绍了Docker的产生背景,如何解决代码环境迁移问题,详细讲解了Docker的概念、安装过程、常用命令,以及数据卷和容器数据持久化的应用。还涉及了Docker镜像管理、容器部署和docker-compose的使用。
摘要由CSDN通过智能技术生成

初识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

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

进入容器内部命令

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

Docker镜像相关命令

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

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

在这里插入图片描述

删除镜像

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

拉取镜像、更新版本

docker pull 镜像名

Docker容器相关命令

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

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

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

docker run 参数

参数说明:
-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命令,退出容器,容器关闭了。

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

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

停止容器

docker stop 容器名称

启动容器

docker start 容器名称

设置容器自启

docker update mysql --restart=always

删除容器

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

docker rm 容器名称
查看容器信息
docker inspect 容器名称

展示出的信息里面有

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

Docker容器的数据卷

数据卷的作用:

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

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

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

配置数据卷

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

注意事项:

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

应用场景:

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

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

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

解释:这是一个运行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是不设置左边宿主机的目录,那么系统会自动给我们分配宿主机目录

命令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

小结

在这里插入图片描述

Docker应用部署

MsSQL部署

在这里插入图片描述

搜索mysql镜像

docker search mysql

拉取mysql镜像 (8.0.34)

docker pull mysql:8.0.34

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

在/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

参数说明:

-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

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



# 设置docker启动时启动mysql
docker update mysql --restart=always

# 重启mysql容器
docker restart mysql

# 进入mysql容器内部
docker exec -it mysql /bin/bash

#输入密码,连接mysql
mysql -uroot -p

# 退出mysql容器
exit

Tomcat部署

搜索tomcat镜像

docker search tomcat

拉取tomcat镜像

docker pull tomcat

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

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

mkdir ~/tomcat
cd ~/tomcat
docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat 

参数说明:

-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

修改redis配置文件

vim /mydata/redis/conf/redis.conf

# 插入下面内容
appendonly yes   
requirepass abc123 

# 保存
docker restart redis

# 进入redis客户端
docker exec -it redis redis-cli
auth 密码

开机自启动

docker update redis --restart=always

打包

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

 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是日期

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

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

查看镜像

docker images

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

docker-compose up -d

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

更新主平台

//进入有docker-compose的目录

cd /dipper-data/dipper/dipper-deploy/

//拉取镜像,重启服务

docker-compose pull && docker-compose up -d

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

docker-compose down
docker-compose up -d

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

docker-compose restart worker

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值