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