docker-day3——docker应用部署docker迁移与备份Dockerfile

Posted zhihuanzzh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker-day3——docker应用部署docker迁移与备份Dockerfile相关的知识,希望对你有一定的参考价值。


一、应用部署

补充知识点:

容器之间互相是可以ping通的

但是当我们在mysql创建的容器中想要执行命令的时候,我们会发现他内部没有(基本都没得),这时候我们要用命令去安装他那些操作命令

他的一些基础功能安装命令:

apt-get update

apt-get install net-tools

安装成功后就可以使用ping命令了

原因:老刘说因为mysql为了减小镜像的大小,使用的是ubuntu或debian系列的操作系统,因此使用的命令也不一样

1.1 mysql 部署

(1)拉取mysql镜像

docker pull centos/mysql-57-centos7

(2)创建容器

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

-p 代表端口映射,格式为 宿主机映射端口:容器运行端口

-e 代表添加环境变量 MYSQL_ROOT_PASSWORD 是root用户的登陆密码

(3)远程登录mysql

连接宿主机的IP ,指定端口为33306

拓展:使用映射部署

参考博客:MySQL主从搭建(基于docker)

上面是直接创建容器的命令,但是在实际的使用过程中,为了保证数据,我们会使用目录映射,把数据库、配置文件在本地也映射一份

步骤一

在home目录下创建mysql文件夹,下面创建data和conf.d文件夹

mkdir /home/mysql
mkdir /home/mysql/conf.d
mkdir /home/mysql/data/

步骤二

在/home/mysql创建my.cnf配置文件,并写入配置信息

touch /home/mysql/my.cnf

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

ps:我们可以发现他跟windows上的mysql的配置文件(my.ini)内容相似

步骤三

创建容器

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

/var/lib/mysql是数据库文件夹

/etc/mysql/conf.d是配置文件目录

/etc/mysql/my.cnf是配置文件

步骤四

接下去就是使用mysql:创建库,创建表,插入数据

如果这时候我们关闭容器,删除容器,myslq的容器没了,但是数据在宿主机上放着

然后我们再运行起一个容器,做好目录映射,数据都回来了(在这个容器中也能一样用)

1.2 nginx

(1)拉取nginx镜像

docker pull nginx

(2)创建Nginx容器

我们在部署nginx的时候,可对网页的静态资源做一个映射,这样我们就可以在宿主机修改网页的相关文件(容器内没有vi等编辑命令,不好操作)

接着还可以对端口也做映射,让我们在访问宿主机的时候,就返回nginx的页面

docker run -id --name nginx -p 80:80 -v /root/html:/usr/share/nginx/html nginx

容器中的静态文件目录:

/usr/share/nginx/html

1.3 redis

(1)拉取镜像

docker pull redis

(2)创建映射的目录以及配置文件

mkdir /root/data

vim /root/redis.conf

\'配置文件内容如下:\'
bind 0.0.0.0
daemonize NO
protected-mode no
requirepass 123456

这里的配置文件最好再配置一个持久化文件存储路径

(3)创建并运行容器

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

这里命令需要分成两部分解读,首先是到redis为止的命令,他们是在创建容器并让容器保持运行状态。而后面的redis-server则是说,容器已启动就执行redis-server命令并且以/etc/redis/redis.conf 作为配置文件启动

接着我们就可以远程链接redis操作了

1.4 部署项目的一些讲解

我们使用docker部署项目会非常的快,因为一些依赖类型的东西就不需要安装了,然后也不需要编译了

安装的时候不推荐在一个容器中安装多个服务,而应该在多个容器中运行多个服务

这里我们可以参考学长的django-vue-admin项目:https://gitee.com/liqianglog/django-vue-admin

在他的说明中就有提到如何使用docker安装,

当我们安装好了所有的服务和项目,我们还可以把他们做成镜像,这样下次部署的时候,就可以直接用这个镜像操作了,而这样的镜像我们叫他docker-compose(使用Dockerfile模板文件创建)

二、迁移与备份

1 容器保存为镜像

我们可以通过以下命令将容器保存为镜像

docker commit mynginx mynginx_i
mynginx:容器名称
mynginx_i:保存的镜像名称

举例:

# 容器保存为镜像
	-运行一个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

2 镜像备份

我们可以通过以下命令将镜像保存为tar 文件

docker  save -o mynginx.tar mynginx_i
例:
docker save -o centos_vim_image.tar centos_vim_image

3 镜像恢复与迁移

首先我们先删除掉mynginx_img镜像 然后执行此命令进行恢复

docker load -i mynginx.tar
例:
docker load -i centos_vim_image.tar

-i 输入的文件

执行后再次查看镜像,可以看到镜像已经恢复

三、Dockerfile

镜像从哪里来的?

1、远程仓库拉取的 docker pull

2、用容器做成的镜像 docker commit

3、把备份的恢复 docker load

4、使用Dockerfile来构建

什么是Dockerfile?

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。

优点:

1、对于开发人员:可以为开发团队提供一个完全一致的开发环境;
2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;
3、对于运维人员:在部署时,可以实现应用的无缝移植。

常用命令

命令 作用
FROM image_name:tag 定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name 声明镜像的创建者
ENV key value 设置环境变量 (可以写多条)
RUN command 是Dockerfile的核心部分(可以写多条)
ADD source_dir/file dest_dir/file 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
source_dir/file dest_dir/file 和ADD相似,但是如果有压缩文件并不能解压
WORKDIR path_dir 设置工作目录,运行起这个容器,来到的路径就是这个路径

使用脚本创建镜像

步骤:

(1)创建目录

mkdir –p /usr/local/dockerdjango

(2)下载jdk-8u171-linux-x64.tar.gz并上传到服务器(虚拟机)中的/usr/local/dockerjdk8目录

(3)创建文件Dockerfile 用vim编辑 Dockerfile

vim Dockerfile

#依赖镜像名称和ID 
FROM centos:7
#指定镜像创建者信息
MAINTAINER TEST
#切换工作目录
WORKDIR /usr
#设置环境变量(添加了一个键值对name:zzh)
ENV name zzh
#安装vim
RUN yum install vim -y
#创建文件夹zzh
RUN mkdir /zzh
#创建文件ss.py
RUN touch /zzh/ss.py
#往文件中写入内容
RUN echo \'print(1)\' >/zzh/ss.py
#拷贝文件
COPY /root/redis.conf /zzh/redis.conf
#设置/zzh为工作目录,已进入容器就会进入这个目录
WORKDIR /zzh

(4)执行命令构建镜像

docker build -t=\'django2.0\' .

注意后边的空格和点,不要省略,他代表使用当前目录下的Dockerfile 文件执行命令

(5)查看镜像是否建立完成

docker images

(6)基于这个镜像运行容器

docker run -id --name 容器名称 镜像名称

# 进入到容器
docker exec -it xx /bin/bash
# 验证vim,和文件夹,文件是否存在

四、作业

1、什么是迭代器,生成器,装饰器

迭代器

具有双下iter和双下next方法的数据类型叫可迭代对象

可迭代对象执行双下iter方法变成迭代器对象,使用双下next就可以对迭代器对象进行迭代取值

如果没有元素则抛出 StopIteration 异常。

生成器

生成器本质是一种特殊的迭代器,只是迭代对象从python数据类型变成了我们自己编写的代码

生成器是内部定义了yield方法的函数,每次使用双下next迭代,遇到yield就会停止,下一次执行双下next也是一样的

装饰器

装饰器的本质是闭包函数,而闭包函数就是嵌套函数的基础上,内层函数调用了外层函数中的名称

装饰器的作用:在不改变源代码以及调用方式的情况下添加新功能

装饰器在使用的时候是用语法糖的形式使用的:@装饰器名称

然后再装饰器的内部可以使用装饰器修复技术:@wraps(变量名),对被装饰函数进行伪装

2、django的信号用过吗?如何用,干过什么

Django 的信号是一种观察者模式,它允许在某种事件发生时自动执行一些操作。例如,在保存一个模型实例时,可以发送一个信号,在该实例被保存到数据库之前或之后执行一些操作。

Django 的信号可以在任何地方发送和接收。要发送信号,可以使用 django.dispatch.Signal 类创建一个新的信号对象,然后在适当的地方发送该信号。要接收信号,可以使用 @receiver 装饰器将一个函数注册为信号的接收者。

下面是一个简单的例子,演示如何在模型保存时发送信号,并在信号接收函数中执行一些操作:

from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import MyModel

# 定义信号对象
my_signal = Signal()

# 发送信号的函数
def my_function(sender, instance, **kwargs):
    # 在保存模型之前执行一些操作
    pass

# 注册信号接收函数
pre_save.connect(my_function, sender=MyModel)

在上面的例子中,我们创建了一个名为 my_signal 的信号对象,并定义了一个名为 my_function 的函数,用于在保存模型之前执行一些操作。然后,我们使用 pre_save.connect() 方法将 my_function 函数注册为 MyModel 模型的 pre_save 信号的接收者。

MyModel 的实例被保存时,pre_save 信号会被发送,my_function 函数会被调用,并执行其中的操作。通过使用信号,我们可以将模型的保存操作与其他功能解耦,从而使代码更具可重用性和可维护性。

3、Dockerfile用过吗?常用命令有哪些

Dockerfile 是用来定义 Docker 镜像的脚本文件,其中包含了构建镜像所需的所有指令和参数。以下是一些常用的 Dockerfile 指令:

  • FROM:指定该镜像构建的基础镜像。
  • RUN:在镜像中执行命令,例如安装软件包或运行编译器。
  • COPY:将文件或目录从主机复制到镜像中。
  • ADD:与 COPY 类似,但支持更多功能,例如从 URL 复制文件或自动解压缩 tar 文件。
  • WORKDIR:设置当前工作目录。
  • EXPOSE:声明容器将使用哪些端口。
  • CMD:指定容器启动时要运行的命令。
  • ENTRYPOINT:与 CMD 类似,但允许在命令前指定可选参数。

这些指令可以组合使用,以创建自定义的 Docker 镜像。例如,下面是一个简单的 Dockerfile,用于构建一个运行 Python Flask 应用程序的镜像:

FROM python:3.8-slim-buster

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 5000

CMD ["python", "app.py"]

在上面的 Dockerfile 中,我们首先指定了基础镜像为 python:3.8-slim-buster,然后设置了工作目录为 /app。接下来,我们复制了 requirements.txt 文件到镜像中,并运行 pip install 命令安装 Python 应用程序所需的所有依赖。然后,我们将应用程序的所有文件复制到镜像中,并声明容器将使用端口 5000。最后,我们指定了容器启动时要运行的命令为 python app.py

使用 Dockerfile,我们可以轻松地构建自定义的 Docker 镜像,以满足特定的应用程序需求。

使用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


Docker部署Redis集群

Docker部署Redis集群

# 创建网卡
docker network create redis --subnet 172.38.0.0/16

# 通过脚本创建6个redis配置
for port in $(seq 1 6); \\
do \\
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis/conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

# 动态启动脚本
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \\
-v /mydata/redis/node-${port}/data:/data \\
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \\
-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \\

# 具体手动操作-开启节点1
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \\
-v /mydata/redis/node-1/data:/data \\
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \\
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \\

# 具体手动操作-开启节点2
docker run -p 6372:6379 -p 16372:16379 --name redis-2 \\
-v /mydata/redis/node-2/data:/data \\
-v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \\
-d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \\

# 具体手动操作-开启节点3
docker run -p 6373:6379 -p 16373:16379 --name redis-3 \\
-v /mydata/redis/node-3/data:/data \\
-v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \\
-d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \\

# 具体手动操作-开启节点4
docker run -p 6374:6379 -p 16374:16379 --name redis-4 \\
-v /mydata/redis/node-4/data:/data \\
-v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \\
-d --net redis --ip 172.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \\

# 具体手动操作-开启节点5
docker run -p 6375:6379 -p 16375:16379 --name redis-5 \\
-v /mydata/redis/node-5/data:/data \\
-v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \\
-d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \\

# 具体手动操作-开启节点6
docker run -p 6376:6379 -p 16376:16379 --name redis-6 \\
-v /mydata/redis/node-6/data:/data \\
-v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \\
-d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \\

# 创建集群
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 \\
                                       172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 \\
                                       --cluster-replicas 1
# 直接点击yes 往下走即可

# 登录集群
redis-cli -c
# 查看集群信息
cluster info
# 查看集群节点
cluster nodes
# 设置键值
set a b
# 获取键值
get a

以上是关于docker-day3——docker应用部署docker迁移与备份Dockerfile的主要内容,如果未能解决你的问题,请参考以下文章

linux12 - docker容器化 -->Docker-day3-四种网络模式

docker-day10

docker部署多个版本的jdk

docker部署

Docker镜像构建的优化总结

外部网络通过端口映射访问部署在虚拟机里的docker中的web应用