docker之容器操作-应用部署-迁移与备份-Dockerfile
目录
docker之容器操作-应用部署-迁移与备份-Dockerfile
昨日内容回顾
# 1 docker 启动 停止 查看状态命令
systemctl start docker
systemctl stop docker
systemctl status docker
docker info # 查看详情
systemctl enable docker # 开机自启动
# 2 配置镜像源 拉取镜像时 速度快
vim /etc/docker/daemon.json
# 阿里云的:每个账户会分配
# 腾讯云的:会有一个固定地址
# 3 镜像操作
搜索镜像:在网站上搜索 https://hub.docker.com/
拉取镜像: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 退出
今日内容详细
1 容器操作
# 启动容器
docker start 容器id
# 停止容器
docker stop 容器id
# 文件拷贝
# 容器的文件copy到宿主机上(不是在容器内执行)
docker cp 容器名称:容器目录 需要拷贝的文件或目录
docker cp d8aaf53209a3:/zpf/2.txt /root/zpf/22.txt
# 宿主机的文件copy到容器中
docker cp 需要拷贝的文件或目录 容器名称:容器目录
docker cp /root/zpf/22.txt d8aaf53209a3:/zpf/2.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`
# 无状态的服务
mysql redis
uwsgi+django
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的容器没了,但是数据在宿主机上放着
# 再运行起一个容器,做好目录映射,数据都回来了
2.2 redis
# 拉取redis镜像
docker pull redis
mkdir /home/redis/data
vim /home/redis/redis.conf
bind 0.0.0.0
daemonize NO
protected-mode no
requirepass 123456
# 运行
docker run -id -p 6379:6379 --name redis -v /home/redis/redis.conf:/etc/redis/redis.conf -v /home/redis/data:/data redis redis-server /etc/redis/redis.conf
# 远程链接redis操作
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 /home/html:/usr/share/nginx/html nginx
# 以后只需要修改宿主机的/root/html 路径,看到页面就是修改后的
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
# 镜像从哪里来?
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 什么是迭代器 生成器 装饰器
迭代器是一种特殊的对象,它可以访问容器(如数组、链表和集合)中的元素,而不暴露容器的底层结构。通过迭代器可以实现遍历容器中的各个元素,包括读取、修改和删除元素。迭代器把遍历容器的代码与容器本身的结构分离开来,使得容器的结构和访问操作可以独立地进行修改,而不影响遍历容器的代码。迭代器是 STL(Standard Template Library)中的重要组件之一,几乎所有的容器都提供了迭代器。
生成器是一种特殊的函数,其返回值是一个可迭代对象,在调用时不是一次性生成所有结果,而是用 yield 语句来生成结果并暂停函数的执行,待下一次调用时再从上一次暂停的地方继续执行。生成器可用于处理大规模数据集合,以减小内存开销,也常用于异步编程中的协程。生成器与迭代器使用的是相同的协议,可以用 for 循环、next() 函数或 yield from 语句来访问其元素。Python 中的生成器函数是以函数名前加上关键字 yield 来定义的。
装饰器是一种特殊的函数 在不改变被装饰函数原有代码和调用方式的情况下给被装饰函数增加功能
# 2 django的信号用过吗 如何用 干过什么
Django 的信号是一种简单的消息系统,可以在应用程序中不同的部分之间进行通信。当某个事件(比如:创建对象、删除对象)发生时,会发送一个信号,所有连接了该信号的处理程序都会在接收到该信号时进行相应的处理。
以下是使用 Django 信号的基本步骤:
1. 导入信号:
```python
from django.dispatch import Signal
my_signal = Signal()
```
2. 连接信号处理程序:
```python
from django.core.signals import request_started
def my_handler(sender, **kwargs):
print("Request started")
request_started.connect(my_handler)
```
3. 发送信号:
```python
my_signal.send(sender=my_object, arg1='value1', arg2='value2')
```
在以上代码中,sender 参数指明哪个对象发送了信号,kwargs 参数包含了除了 sender 之外的其他任意参数。
Django 中内置了多种信号,例如 request_started、request_finished、pre_save、pre_delete、post_save、post_delete 等。开发者也可以自定义信号并使用。
# 3 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 # 设置工作目录 运行起这个容器 来到的路径就是这个路径