59在Linux中加docker中加mysql,tomcat,redis

一、引言


1.1 环境不一致

我本地运行没问题啊:由于环境不一致,导致相同的程序,运行结果却不一致。

1.2 隔离性

哪个哥们又写死循环了,怎么这么卡:在多用户的操作系统下,会因为其他用户的操作失误影响到你自己编些的程序。

1.3 弹性伸缩

淘宝在双11的时候,用户量暴增:需要很多很多的运维人员去增加部署的服务器,运维成本过高的问题。

1.4 学习成本

学习一门技术,得先安装啊:学习每一门技术都要先安装响应的软件,但是还有他所依赖的各种环境,安装软件成本快高过学习成本啦。

二、Docker介绍


2.1 Docker的由来

一帮年轻人创业,创办了一家公司,2010年的专门做PAAS平台。但是到了2013年的时候,像亚马逊,微软,Google都开始做PAAS平台。到了2013年,公司资金链断裂,不得不倒闭,于是将公司内的核心技术对外开源,核心技术就是Docker。由于开源了Docker,到了2014年的时候,得到了C轮的融资 4000W,2015年的时候,得到了D轮的融资9500W。于是公司开始全神贯注的维护Docker。

Docker主要作者-所罗门
Docker的作者已经离开了维护Docker的团队

2.2 Docker的思想

  • 集装箱:会将所有需要的内容放到不同的集装箱中,谁需要这些环境就直接拿到这个集装箱就可以了。

  • 标准化:

    • 运输的标准化:Docker有一个码头,所有上传的集装箱都放在了这个码头上,当谁需要某一个环境,就直接指派大海疼去搬运这个集装箱就可以了。
    • 命令的标准化:Docker提供了一些列的命令,帮助我们去获取集装箱等等操作。
    • 提供了REST的API:衍生出了很多的图形化界面,Rancher。
  • 隔离性:Docker在运行集装箱内的内容时,会在Linux的内核中,单独的开辟一片空间,这片空间不会影响到其他程序。

  • 中央仓库|注册中心:超级码头,上面放的就是集装箱

  • 镜像:就是集装箱

  • 容器:运行起来的镜像

2.3 Docker架构

Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

Docker 容器通过 Docker 镜像来创建。

容器与镜像的关系类似于面向对象编程中的对象与类。

Docker 面向对象
容器 对象
镜像

三、Docker安装

1如果已安装,可以先删除

sh 复制代码
# 列出已安装的docker包
[root@localhost taotie]# yum list installed|grep docker 
# 如果有,就卸载
[root@localhost taotie]# yum -y remove docker-ce

2 安装yum-utils管理yum源

sh 复制代码
[root@localhost taotie]# yum install -y yum-utils

提示: 如果报错,下载yum-utils失败,安装如下操作

sh 复制代码
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

以上路径是从: 阿里巴巴开源镜像站找到的

3 设置docker源

sh 复制代码
# 配置国内镜像速度快
[root@localhost taotie]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4 设置元数据缓存

sh 复制代码
[root@localhost taotie]#  yum makecache fast

5 安装docker

sh 复制代码
# 安装指定版本
yum install --setopt=obsoletes=0 docker-ce-18.03.0.ce-1.el7.centos docker-ce-selinux-18.03.0.ce-1.el7.centos.noarch

# 如果不指定版本,装最新版本
[root@localhost taotie]# yum -y install docker-ce 
# 如果最新版本安装失败,先执行如下两条命令,再安装最新版本
yum update -y nss curl libcurl
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

提示: 安装的过程时间可能较长...

6 启动docker

sh 复制代码
[root@localhost taotie]# systemctl start docker

注意:启动docker前,关闭防火墙 ,否则可能会启动失败

systemctl stop firewalld.service(最好设置成firewall不随机启动)

7 验证

sh 复制代码
[root@localhost taotie]#  docker run hello-world
  • docker run是要运行一个镜像,在本地生成一个容器

  • docker run hello-world,这是在运行一个名字叫做hello-world的镜像

  • 但是,现在刚装docker,本地没有这个hello-world镜像

  • 所以,就会从远程仓库下载

  • 但是可能会失败,因为最近(2024年5月左右docker国外镜像源被禁...)

8 设置镜像

拉取镜像时,需要通过镜像仓库,国外的仓库一般相对较慢,我们一般可以使用国内的镜像市场

国外 (已不能用)

https://hub.docker.com/

DaoCloud 国内(推荐、暂时能用)

https://hub.daocloud.io/

网易 需要注册(待考证)

https://c.163.com/hub#/m/home/


配置镜像:

root@localhost taotie\]# vi /etc/docker/daemon.json ```shell { "registry-mirrors": ["https://docker.m.daocloud.io","https://docker.1panel.live"] } ``` 重启docker: \[root@taotie \~\]# systemctl restart docker ![image-20240730195657237](https://img-blog.csdnimg.cn/img_convert/251b959404eac893fa7481c860638e7e.png) ## 四、Docker命令 ### docker search 可以从https://hub.daocloud.io/查看相关镜像,并拉取 查找镜像 ![img](https://img-blog.csdnimg.cn/img_convert/75cb65c933560fe070a9cd45127c2f76.png) 注意:name表示镜像名称,official表示是否官方镜像 ### docker images 查看已经拉取的镜像文件 ![img](https://img-blog.csdnimg.cn/img_convert/3388c6f86ea7eb9353b3998afcf1236a.png) ### docker pull 语法:docker pull 镜像名称:tag 拉取镜像,如果不指定tag值,拉取最新镜像 ```sh [root@localhost ~]# docker pull daocloud.io/library/tomcat:9.0.0.M21-jre8 ``` ![image.png](https://img-blog.csdnimg.cn/img_convert/e37a6d6e7ec2d5f140fa303c84925524.png) ### docker run #### 创建并运行容器tomcat容器 ```sh docker run -d --name mytomcat -p 8888:8080 -v /root/tomcat/webapps:/usr/local/tomcat/webapps -v /root/tomcat/logs:/usr/local/tomcat/logs daocloud.io/library/tomcat:9.0.0.M21-jre8 ``` 比如上面这个, 创建并启动tomcat容器 * `-d 让容器在后台运行` * -P 将容器内部使用的网络端口随机映射到主机端口 * `-p 指定绑定端口,比如: -p 8888:8080 ,是将容器内的端口8080映射到宿主机的8888端口上` * --name 创建容器时命名 * -v ,比如 :/a/b/c:/x/y/z 表示将宿主机中/a/b/c目录挂载到容器的/x/y/z目录,如果有多个目录需要挂载,指定多个-v -v /root/tomcat/webapps:/usr/local/tomcat/webapps ,表示将宿主机的/root/tomcat/webapps映射到容器的/usr/local/tomcat/webapps目录 -v /root/tomcat/logs:/usr/local/tomcat/logs,表示将宿主机的/root/tomcat/logs映射到容器的/usr/local/tomcat/logs目录 > 提示: tomcat容器启动时,内部tomcat就已经启动了... 测试 将测试网页所在的文件夹(`一定要有文件夹,因为相当于是项目`),放入 /root/tomcat/webapps目录下 ![img](https://img-blog.csdnimg.cn/img_convert/4774465ffb2ae652ea371d042c9a6d92.png) 在宿主机通过 http://ip:8888/项目/ 的地址进行测试 ![img](https://img-blog.csdnimg.cn/img_convert/141c2235d22737803d4fd52974b85db1.png) ### docker ps 查看正在运行的容器 * -a 查看全部容器 * -f 根据条件过滤显示的内容(-f name=mytomcat) * --format 指定返回值的模板文件(docker ps --format "{{.ID}}: {{.Ports}} {{.Image}}--- {{.Status}}----") * -l 显示最近创建的容器 * -n 列出最近创建的n个容器 * -s 显示总的文件大小 ![img](https://img-blog.csdnimg.cn/img_convert/a6dfc12f86ebd8d94b3369de923f5056.png) docker ps --a 查看所有的容器,包括停止的容器 ![img](https://img-blog.csdnimg.cn/img_convert/60ce92fc2c77b1c9f50bc174437caa6a.png) ### docker start 语法:docker start 容器名称/容器id 启动容器 ![img](https://img-blog.csdnimg.cn/img_convert/ef73ccd66ac39241b80fe9b7083ae304.png) ### docker stop 语法:docker stop 容器名称/id 停止容器 ![img](https://img-blog.csdnimg.cn/img_convert/e6c4af0c69f4d5df827318d9e6661bd4.png) ### docker restart 语法:docker restart 容器名称/id 重启容器 ![img](https://img-blog.csdnimg.cn/img_convert/9b733a1aeb68ae00e8b45298f56bdb5b.png) ### docker exec 进入容器 docker exec -it mysql2 /bin/bash 再登录mysql: mysql -uroot -h127.0.0.1 -P3306 -p123456 ![image-20240708152038391](https://img-blog.csdnimg.cn/img_convert/2f8bbbb892322139daf0f6cd671ce964.png) -it表示以交互方式运行容器 ### docker cp 语法: ```sh docker cp 宿主机文件 容器名:容器中目录 # 从宿主机拷贝到容器中 docker cp 容器名:容器中文件 宿主机目录 # 从容器中拷贝到宿主机 ``` 容器与主机之间的数据拷贝,可以将宿主机内容拷贝到容器,也可以将容器中内容拷贝到宿主机 ![img](https://img-blog.csdnimg.cn/img_convert/9e92273b2b0a582697e324ef0e42d913.png) ### docker rmi 语法:docker rmi 镜像名称:tag imgageid 删除镜像,前提必须先删除相关容器 ![img](https://img-blog.csdnimg.cn/img_convert/76443d7684affe9d53ff413986706370.png) ### docker rm 语法:docker rm 容器名 根据容器名称删除容器 ![img](https://img-blog.csdnimg.cn/img_convert/15a20dd7a2e5b55515574e1129071f9f.png) ### docker port 语法:docker port 容器名 查看容器的端口映射情况 ![img](https://img-blog.csdnimg.cn/img_convert/2d9a7fd295b109abf36aaf84a8aca1ad.png) ### docker inspect 语法:docker inspect 容器名 查看docker容器的详细信息 > 重点关注, 容器和宿主机之间挂载的路径和映射的端口信息 ### docker version 查看版本 ## 五、拉取常用镜像并生成容器 项目部署相关的环境,如redis,mysql,nginx等 ### 5.1 redis 拉取redis docker pull daocloud.io/library/redis:5.0.7 ![image-20240708145151888](https://img-blog.csdnimg.cn/img_convert/128ffb6965bec913ad8548e78f2010b1.png) 创建容器并运行 ```shell docker run -p 6379:6379 --name myredis -v /root/redis/conf/redis.conf:/etc/redis/redis.conf -v /root/redis/data:/data -d daocloud.io/library/redis:5.0.7 redis-server /etc/redis/redis.conf ``` 命令说明: --name myredis : 指定容器名称 -p 6379:6379 : 端口映射,默认redis启动的是6379。 -v /root/redis/conf/redis.conf:/etc/redis/redis.conf : 将主机中指定目录下的redis.conf配置文件映射 -v /root/redis/data:/data : 将主机中指定目录下的data挂载到容器的/data --redis-server 在容器执行redis-server启动命令 --appendonly yes :打开redis持久化配置 > 注意:配置文件中,不能配置为后台启动,否则,redis容器无法启动 测试能否连上redis docker exec -it myredis redis-cli ![image-20240708151632862](https://img-blog.csdnimg.cn/img_convert/c6dd0575babe06e1fb9c715f36bff9f0.png) OK ### 5.2 mysql 拉取mysql docker pull daocloud.io/library/mysql:5.7.30 ![image-20240708145204666](https://img-blog.csdnimg.cn/img_convert/f64f5e1a9ce806874c7482b71cb13392.png) 创建容器并运行 ```shell docker run -d -p 3306:3306 -v /root/mysql/conf/my.cnf:/etc/mysql/my.cnf -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql2 daocloud.io/library/mysql:5.7.30 ``` -e:配置信息,此处配置mysql的root用户的登陆密码 -v /root/mysql/conf/my.cnf:/etc/my.cnf:映射配置文件 -v /root/mysql/data:/var/lib/mysql:映射数据目录 > 如果执行上面命令,报错如下 > > ![image-20240708151252226](https://img-blog.csdnimg.cn/img_convert/4034af7af905889fa0677552eefe5df7.png) > > 解决方案: > > 1.检查linux服务器中/root/mysql/conf路径是否有my.cnf文件,`注意是文件,不是文件夹` > > 2.如果是文件夹,删除掉,然后重新新建my.cnf文件 > > 3.并执行chmod -R 777 /root/mysql 将该路径下的所有文件夹和文件设置最大权限 > > 4.docker ps -a查看刚才创建失败的mysql2容器, 找到容器id,执行docker rm \[imageid\]将容器删除掉 > > 5.重新执行命令产生镜像即可 > > *** ** * ** *** > > 也有可能是权限问题,设置宿主机权限为777,命令如下 > > chmod -R 777 /路径 测试能否连接,可以使用linux的命令 先进入容器: docker exec -it mysql2 /bin/bash 再登录mysql: mysql -uroot -h127.0.0.1 -P3306 -p123456 ![image-20240708152038391](https://img-blog.csdnimg.cn/img_convert/9ab78af616688b402d593ba2712b2582.png) OK ### 5.3 nginx 拉取nginx docker pull daocloud.io/library/nginx:latest ![image-20240708145213125](https://img-blog.csdnimg.cn/img_convert/8a54a095ff54121c5359e6e73d881163.png) 创建容器 ```sh docker run -d --name mynginx -p 99:80 -v /root/docker_nginx/conf.d:/etc/nginx/conf.d -v /root/docker_nginx/dist:/usr/share/nginx/html daocloud.io/library/nginx:latest ``` 配置前端页面的挂载目录 -v /root/docker_nginx/dist:/usr/share/nginx/html *** ** * ** *** 在宿主机目录新建配置文件 在本地映射的数据卷的目录/root/docker_nginx/conf.d/下面创建一个新的配置文件default.conf 配置文件的内容如下: ```sh # 这个是 /etc/nginx/conf.d/default.conf server { # server 块是http 块中的 内容 listen 80; # nginx 默认监听的端口号 listen [::]:80; server_name localhost; # ip # location块 # root:将接收到的请求根据/usr/share/nginx/html去查找静态资源 # index: 默认去上述的路径中找到index.html或者index.htm location / { root /usr/share/nginx/html; index index.html index.htm; # proxy_pass http://192.168.17.101:8088; # 设置代理路径,ip是linux系统所分配ip } #50x 错误页面跳转 error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } ``` 重启: docker exec mynginx nginx -s reload 在windows系统中测试:http://ip:80 如果没有页面,可以在宿主机的/root/docker_nginx/dist中创建一个index.html页面,自己编写一个页面 ```html 测试

2024 test nginx

``` 再试一次即可 ## 六、docker-compose\[了解

Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排

6.1 下载 (老版本需要,现在最新版本不用下载)

注意:将docker-compose下载到/user/local/bin目录下

sh 复制代码
curl -L https://get.daocloud.io/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

6.2 设置权限 (老版本需要,现在最新版本不用)

sh 复制代码
chmod 777 /usr/local/bin/docker-compose

6.3 测试docker-compose命令 (老版本需要,现在最新版本不用下载)

在任意目录,运行docker-compose命令

现在新版本的命令是 docker compose,不用中间那个-连字符

6.4 docker-compose的容器编排文件

文件名:docker-compose.yml

yml文件使用key: value方式来指定配置信息 ,key: value 冒号后面必须有个空格

配置信息通过缩进表示层级关系,缩进使用的是两个空格,不是制表符

在docker-compose.yml文件中,不要使用制表符

yaml 复制代码
version: '3.1'
services:
  mysql:           # 服务的名称
    restart: always   # 代表只要docker启动,那么这个容器就跟着一起启动
    image: daocloud.io/library/redis:5.0.7  # 指定镜像路径
    container_name: mysql2  # 指定容器名称
    ports:
      - 3306:3306   #  指定端口号的映射
    environment:
      MYSQL_ROOT_PASSWORD: 123456   # 指定MySQL的ROOT用户登录密码
      TZ: Asia/Shanghai        # 指定时区
    volumes:
     - /root/docker_compose/mysql/data:/var/lib/mysql   # 映射数据卷
  tomcat:
    restart: always
    image: daocloud.io/library/tomcat:9.0.0.M21-jre8
    container_name: mytomcat
    ports:
      - 8888:8080
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /root/docker_compose/tomcat/webapps:/usr/local/tomcat/webapps
      - /root/docker_compose/tomcat/logs:/usr/local/tomcat/logs 
  redis:
    restart: always
    image: daocloud.io/library/redis:5.0.7
    container_name: myredis
    ports:
      - 6379:6379
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /root/docker_compose/redis/conf/redis.conf:/etc/redis/redis.conf
      - /root/docker_compose/redis/data:/data
      

如果以前docker中有这些容器,会报错,建议是将之前的容器删除,再统一使用compose管理

注意:比如docker-compose.yml处于/root目录下,默认会创建一个名字是 root_default的网络,容器默认都会加入这个网络中,不同的容器间,通过服务名+容器的端口号进行通信。

比如,如下数据库的连接url,mysql:3306,其中mysql是在文件中配置的服务名

sh 复制代码
jdbc:mysql://mysql:3306/video2214?serverTimezone=Asia/Shanghai&useSSL=false

注意: 即使使用了compose管理,也可以再单独使用docker命令操作其中某个容器

6.5 相关命令

sh 复制代码
# 基于docker-compose.yml启动被管理的容器(如果没有镜像,会直接拉取镜像并创建容器)
docker compose up -d
sh 复制代码
# 查看由docker-compose管理的容器
docker compose ps
sh 复制代码
# 开启|关闭|重启已经存在的由docker-compose维护的容器
docker compose start|stop|restart
sh 复制代码
 docker compose down 

关闭并删除容器

比如,如下数据库的连接url,mysql:3306,其中mysql是在文件中配置的服务名

sh 复制代码
jdbc:mysql://mysql:3306/video2214?serverTimezone=Asia/Shanghai&useSSL=false

注意: 即使使用了compose管理,也可以再单独使用docker命令操作其中某个容器

6.5 相关命令

sh 复制代码
# 基于docker-compose.yml启动被管理的容器(如果没有镜像,会直接拉取镜像并创建容器)
docker compose up -d
sh 复制代码
# 查看由docker-compose管理的容器
docker compose ps
sh 复制代码
# 开启|关闭|重启已经存在的由docker-compose维护的容器
docker compose start|stop|restart
sh 复制代码
 docker compose down 

关闭并删除容器

相关推荐
wirepuller_king2 小时前
创建Linux虚拟环境并远程连接,finalshell自定义壁纸
linux·运维·服务器
在野靡生.3 小时前
Ansible(1)—— Ansible 概述
linux·运维·ansible
风123456789~3 小时前
【Linux运维】查询指定日期的上月
linux·运维·服务器
zyk_5203 小时前
Docker desktop如何汉化
运维·docker·容器
韭菜盖饭3 小时前
解决Docker端口映射后外网无法访问的问题
运维·docker·容器
jingjingjing11113 小时前
笔记:docker安装(ubuntu 20.04)
笔记·docker·容器
我没想到原来他们都是一堆坏人3 小时前
利用vmware快速安装一个可以使用的centos7系统
linux·虚拟机
x-cmd4 小时前
[250331] Paozhu 发布 1.9.0:C++ Web 框架,比肩脚本语言 | DeaDBeeF 播放器发布 1.10.0
android·linux·开发语言·c++·web·音乐播放器·脚本语言
weitinting4 小时前
Ali linux 通过yum安装redis
linux·redis
myloveasuka4 小时前
[Linux]从硬件到软件理解操作系统
linux·开发语言·c++