首页 > 数据库 >【Docker】容器操作 mysql部署 redis部署 nginx部署 迁移与备份 Dockerfile

【Docker】容器操作 mysql部署 redis部署 nginx部署 迁移与备份 Dockerfile

时间:2023-04-13 19:11:24浏览次数:50  
标签:容器 部署 redis vim nginx mysql 镜像 docker

目录

上节回顾

# 1 docker 启动,停止,查看状态命令
	systemctl start docker
    systemctl stop docker
    systemctl status docker
    docker info  # 查看详情
    systemctl enable docker # 开机自启动
    
    
# 2 配置镜像源,拉取镜像时,速度快
	vim /etc/docker/daemon.json
	# 阿里云的:每个账户会分配
    
    
# 3 镜像操作
	-搜索镜像:在网站上搜索
    -拉取镜像  docker pull 镜像名字:标签
    -查看本地镜像  docker images   或者  docker image ls
    -删除镜像  docker rmi 镜像id号
    -一次性删除所有镜像  docker rim `docker images -p`
    
# 4 容器操作
	-查看正在运行的容器  docker ps
    -查看所有容器  docker ps -a
    
    -创建并运行容器
    docker run -id/it  --name=名字 -p 8080:8080 -p 80:80 -v /home/lqz:/lqz 镜像名字:标签
                    
    -在容器上执行命令
    docker exec 容器id 命令
    docker exec -it 容器id /bin/bash  # exit 退出
    

今日内容

image-20230413100845782

容器技术做的是进程隔离。
将mysql进程给包了一下,做了网络隔离,看起来就像是在一个虚拟机中一样(本质上是进程的隔离技术)

1 容器操作

# 启动容器
	docker start 容器id
# 停止容器
	docker stop 容器id

# 文件拷贝
	# 容器的文件copy到宿主机上(不是在容器内执行)
    docker cp 容器名称:容器目录 需要拷贝的文件或目录
    docker cp  20fd8:/home/lqz.txt /home/lqz.txt
    # 宿主机的文件copy到容器中
    docker cp 需要拷贝的文件或目录 容器名称:容器目录
    docker cp ./lqz.txt 20fd894a3f20:/home/lqz.txt

# 查看容器IP地址    
	docker inspect 容器名称  # 查看容器的详细描述,很多
    docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
    
    
    # 在多个容器之间是可以ping通的
    # centos:172.17.0.3
    # mysql:172.17.0.2

    
# 删除容器(删除已停止的容器)
	docker rm 容器id  
    docker rm `docker ps -a -q`
    
    
    
 # 无状态的服务
	-myslq reids
    -uwsgi+django

将宿主机文件复制到容器:
image-20230413102947682

这样会报错,这是因为容器内部没有zz目录:
image-20230413103022687

由于是复制过来的,在宿主机修改不会影响到容器。

将容器文件复制到宿主机:
image-20230413103218969

如果宿主机已经存在同名文件,会怎么样?
会没有提示,直接覆盖。

查看容器IP地址:
image-20230413103450210

环境变量:宿主机和容器里都有环境变量。

image-20230413103555380

docker如何实现网络隔离?本质是基于linux线程做了封装。

容器之间Ping:(在多个容器之间是可以Ping通的)
image-20230413104130197

由于容器尽可能的轻量,所以可能没有ping命令,这时候就需要下载net-tools,net-tools包含ping命令。

ubt系统使用apt-get命令下载net-tools:

image-20230413104324498

2 应用部署

2.1 mysql 部署

docker run -di --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

# 做目录映射:data文件,配置文件
# 创建文件夹
mkdir /home/mysql
mkdir /home/mysql/conf.d
mkdir /home/mysql/data/
vim /home/mysql/my.cnf
[client]
default-character-set=utf8
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000

docker run  -di -v /home/mysql/data/:/var/lib/mysql -v /home/mysql/conf.d:/etc/mysql/conf.d -v /home/mysql/my.cnf:/etc/mysql/my.cnf -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7      
        
     
    
# 创建库,创建表,插入数据

# 关闭容器,删除容器,myslq的容器没了,但是数据在宿主机上放着

# 再运行起一个容器,做好目录映射,数据都回来了

mysql容器底层不是centos(yum) 可能是wubantu(apt-get):

image-20230413105122239

不建议mysql在docker中运行,docker建议运行无状态的服务,向mysql这种会在运行过程中产生数据的,属于有状态的服务:

image-20230413105301541

相当于是容器内部操作外部的文件,容器删了只是删除自己,不是删除容器外部的文件。

水平扩展:

image-20230413105557034

一台机器多个容器(docker-compose)。多台机器容器编排(k8s)。容器的网络是可以配置的。实现多个容器使用一个配置文件。
容器要运行,必须有一个守护进程在前台运行 ,如果是-id命令启动容器, 会一直保持一个守护进程在阻塞。
远程连接数据库 用容器新建个数据库 做目录映射 
做目录映射的作用是:删除容器,数据、配置文件都还在宿主机器,只需要在启动一个容器,数据就又有了,不会随着容器的删除而删除。
为什么起一个mysql镜像 然后做端口映射 就可以从远程访问 这个mysql服务了?

2.2 redis

# 拉取redis镜像
docker pull redis
mkdir /root/data
vim /root/redis.conf

bind 0.0.0.0
daemonize NO
protected-mode no
requirepass 123456


# 运行(推荐)
docker run -id -p 6379:6379 --name redis -v /root/redis.conf:/etc/redis/redis.conf -v /root/data:/data redis  redis-server /etc/redis/redis.conf 

# 这样容器不会一直运行而是直接结束
docker run -id -p 6379:6379 --name redis -v /root/redis.conf:/etc/redis/redis.conf -v /root/data:/data redis  
     
# 创建一个守护进程,使得容器不会自动结束,而是自动运行
docker run -id -p 6379:6379 --name redis -v /root/redis.conf:/etc/redis/redis.conf -v /root/data:/data redis  /bin/bash

# 启动不了可以查看错误日志 排查错误
docker logs redis

    
# 远程链接redis操作

redis配置文件:

bind 0.0.0.0
daemonize NO
protected-mode no
requirepass 123456

后续需要配置redis持久化的路径,也就是说容器内部的redis存储数据不一定会存储在/data目录下

使用redis-cli远程连接:
image-20230413115307557

2.3 nginx

# 拉取nginx镜像
docker pull nginx

# run起容器
# docker run -id --name nginx -p 80:80 nginx
    
# /usr/share/nginx/html
docker run -id --name nginx -p 80:80 -v /root/html:/usr/share/nginx/html nginx
# 以后只需要修改宿主机的/root/html 路径,看到页面就是修改后的

做目录映射:
image-20230413113832144

在宿主机器添加index 做目录映射 让nginx使用这个index。

image-20230413114449647

如何快速让别人运行你的项目?
将所有Mysql redis等依赖,包在一个docker容器中。但是实际上不建议在一个docker容器中运行多个服务,而是一个服务运行在一个容器内。

docker-compose单机容器编排。
centos的系统使用了 python,也就是自带python2.7的环境:
image-20230413120618678

将容器打包成镜像:可以镜像打标签。注册中心就是远程仓库。

3 迁移与备份

# 容器保存为镜像
	-运行一个centos容器
    docker run -id --name centos_vim centos:7
    -在容器中装vim
    docker exec -it a6e240 /bin/bash
	yum install vim -y
    
    -把容器做成镜像(centos+vim)
    docker commit centos_vim centos_vim_image

    -把centos_vim 容器删除
    docker rm centos_vim
    -基于新构建的镜像,运行成容器
    docker run -id --name centos_vim centos_vim_image:latest
    -进入到容器中,查看,软件都在
    docker exec -it id号 /bin/bash

# 镜像备份和恢复
	docker save -o centos_vim_image.tar centos_vim_image
    -删除容器,删除镜像
    -把备份的镜像恢复
    docker load -i centos_vim_image.tar

4 Dockerfile


'''
 ockerfile通过一个文件,根据文件的内容进行构建镜像。dockerfile命名必须得是这个名字。docker run的时候会执行 cmd 加入的命令。也就是容器内部也要执行你CMD设置的命令。
'''# 镜像从哪里来的?
	1 远程仓库拉取的 docker pull
    2 用容器做成的镜像 docker commit 
    3 把备份的恢复 docker load
    4 使用Dockerfile来构建
# 什么是Dockerfile
	Dockerfile是由一系列命令和参数构成的脚本文件,这些命令应用于基础镜像并最终创建一个新的镜像
    
# Dockerfile的命令
	FROM 基础镜像 	       #基于哪个基础镜像来构建
    MAINTAINER lqz 	     # 声明镜像的创建者
    ENV key value 	     # 设置环境变量 (可以写多条)
    RUN command 	     #是Dockerfile的核心部分(可以写多条)
    ADD source_dir/file dest_dir/file 	#将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
    COPY source_dir/file dest_dir/file 	# 和ADD相似,但是如果有压缩文件并不能解压
    WORKDIR lqz 	# 设置工作目录,运行起这个容器,来到的路径就是这个路径
    
    
    
# 构建一个带vim的centos镜像
vim Dockerfile

FROM centos:7
MAINTAINER lqz
ENV name lqz
RUN yum install vim -y
RUN mkdir /lqz
RUN touch /lqz/ss.py
RUN echo 'print(1)' >/lqz/ss.py
COPY /root/redis.conf /lqz/redis.conf
WORKDIR /lqz


# 基于dockerfile构建镜像
docker build -t='centos_lqz_vim' .

# 基于这个镜像运行容器
 docker run -id --name xx centos_lqz_vim
# 进入到容器
docker exec -it xx /bin/bash
# 验证vim,和文件夹,文件是否存在

'''
1.Dockerfile通过一个文件,根据文件的内容进行构建镜像。
2.Dockerfile命名必须得是这个名字。docker run的时候会执行 cmd 加入的命令。
3.也就是容器内部也要执行你CMD设置的命令。
'''

练习

使用Dockerfile构建一个运行django程序的镜像

django 的helloworld  --》压缩包

基于Python3.8 构建一个能够运行你这个程序的镜像
FROM python:3.8
MAINTAINER lqz
RUN pip install django==3.2.2
ADD 压缩包 
WORKDIR /lqz
 
docker run -id -p 8080:8080 --name xx djago python manage.py runserver 0.0.0.0:8080
        
        
        
# 面试题
1 什么是迭代器,生成器,装饰器
2 django的信号用过吗?如何用,干过什么
3 Dockerfile用过吗?常用命令有哪些

标签:容器,部署,redis,vim,nginx,mysql,镜像,docker
From: https://www.cnblogs.com/passion2021/p/17316052.html

相关文章

  • 66、K8S-部署管理-Helm-自定义helm项目
    1、自定义helm项目管理-实践1.1、自定义helm项目1.1.1、创建存放的目录mkdir-p/opt/custom_helm&&cd/opt/custom_helm1.1.2、创建helm项目helmcreatenginx1.2.3、目录的解析custom_helm]#treenginx/nginx/-自动生成的空ch......
  • Redis基础数据结构
    五种基础数据结构:string(字符串)、list(列表)、set(集合)、hash(集合)和set(有序集合)使用命令redis-cli即可连接使用go语言代码连接redis:import( "github.com/go-redis/redis")varc*redis.Clientfuncmain(){ c=redis.NewClient(&redis.Options{ Addr:......
  • redis-4-2,使用docker在同一台服务器配置redis主从复制
    拉取redis镜像dockerpullredis下载redis配置文件https://redis.io/docs/management/config/在这里面找到需要的版本的配置文件使用配置文件的时候可能会出错,从docker拉取下来的最新镜像是6.2.8版本的......
  • springboot学习之三(整个redis)
     springboot整合redis1.依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>2.配置#Redis配置spring.r......
  • uniapp 使用cli模式,利用jenkins远程部署
    1、uniapp必须使用cli模式,如果是hbuliderx创建的,不支持2、jenkins配置需要publishoverssh插件和node插件,自行百度即可现在主要说说配置1)、系统管理-》系统配置中,找到publishoverssh 2          ......
  • MariaDB Galera 多主集群部署
    1、环境服务器名称IP地址备注db-161-13110.32.161.131主db-161-13210.32.161.132主db-161-13310.32.161.133主2、MariaDB安装参考:https://www.cnblogs.com/a120608yby/p/17312862.html3、安装集群程序(如果没有安装MariaDB-Server,这里将关联自动安装......
  • 七天玩转Redis |第二天打卡 学习Redis的基本数据类型
    今天学习的内容是Redis的五种数据类型今天的收获是Redis与我们常用的数据库不同,数据类型只有五种String、Hash、List、Set、ZSet。这五种类型比较陌生的应该是ZSet类型、ZSet类型既有Set类型的值唯一,也有List类型的值有序排列。这五种类型我用的最多的是String、List、Hash......
  • 七天玩转Redis | 打卡第三天 使用Redis的地理位置、基数统计、位图场景
    今天学习的内容今天学习了Redis在地理位置、基数统计、位图场景上的使用今天的收获今天的收获,了解了Redis在另外几个场景下的应用,比如说地理位置长的应用,在以前我只知道用一些特殊的api来计算距离,没想到Redis还提供这样的服务,这样可以省去调用一些api来计算,可以直接将要计......
  • 七天玩转Redis | 打卡第1天 连接Redis基础命令
    今天学习的内容是了解Redis的安装以及简单常用命令今天的收获Redis是一常见的非关系性数据库,入门Redis是比较简单的,因为Redis的基础命令比较简单,比如说setkeyvalue这个命令是往Redis里面插入数据用的,采用的形式是键值对形式,学习过java的小伙伴都应该非常连接这种存值方......
  • 65、K8S-部署管理-Helm基础知识、安装、入门示例
    Kubernetes学习目录1、基础知识1.1、需求在kubernetes平台上,我们在部署各种各样的应用服务的时候,可以基于手工或者自动的方式对各种资源对象实现伸缩操作,尤其是对于有状态的应用,我们可以结合持久性存储机制实现更大场景的伸缩动作。但是,无论我们怎么操作各种资源对象,问......