docker----day03(容器操作,应用部署,迁移与备份,Dockerfile使用 、ubuntu系统构建redis镜像 )
上节回顾
# 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 退出
---------------------------------------------
.
.
.
.
.
今日内容
1 容器操作
# 启动容器
docker start 容器id
# 停止容器
docker stop 容器id
------------------------------------------
# 文件拷贝
# 宿主机的文件 copy到容器中
docker cp 需要拷贝的文件或目录 容器名称:容器目录
docker cp ./lqz.txt 4668e7190ff9:/home/qqq.txt # 拷贝到容器里文件改名字了
docker cp ./lqz.txt 4668e7190ff9:/home # 拷贝到容器里,文件名字不变
# 就将宿主机上当前目录下的lqz.txt文件 拷贝到对应容器里面去
# 容器的文件 copy到宿主机上(不是在容器内执行,还是在宿主机上执行!!!)
docker cp 容器名称或id :容器目录 需要拷贝的文件或目录
docker cp 4668e7190ff9:/home/qqq.txt /home/qqq111.txt
------------------------------------------
------------------------------------------
# 查看容器IP地址
docker inspect 容器名称 # 查看容器的详细描述
docker inspect 4668e7190ff9
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称/容器ID
docker inspect --format='{{.NetworkSettings.IPAddress}}' 4668e7190ff9
# 查看对应容器的ip地址
# 多个容器间是网络隔离的
# 但是 在多个容器之间是可以ping通的
# youcentos: 172.17.0.3
# mysql888:172.17.0.2
# 先查出容器的ip地址,先进入到 mysql888 容器内部,ping一下youcentos的ip地址
# docker exec -it 62006c4a6a4c /bin/bash
# ping 172.17.0.3 能ping通的
# 如果显示没有ping命令,可能mysql容器里面安装的不是不是centos系统而是乌班图
# apt-get update
# apt-get install net-tools -y
------------------------------------------
------------------------------------------
# 删除容器(删除已停止的容器)
docker rm 容器id # 删除对应id的已停止的容器
docker rm `docker ps -a -q` # 删除所有已停止的容器
docker rm 容器id -f # 删除对应id的容器,不管该容器是否停止,谨慎使用!!
------------------------------------------
------------------------------------------
# 无状态的服务
myslq reids
uwsgi+django
------------------------------------------
.
.
.
.
.
.
2 应用部署
2.1 mysql 部署
----------------------------------------
# 这是直接运行mysql容器,没做目录映射!!!
docker run -id --name=mysql666 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
----------------------------------------
----------------------------------------
# 做目录映射:data文件,配置文件
# 1 先创建文件夹
mkdir /home/mysql
mkdir /home/mysql/conf.d
mkdir /home/mysql/data/
# 2 创建并打开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
# 3 把宿主机里面的目录映射到容器里面去,映射了3个,
# 一个data目录,一个配置文件目录,一个配置文件
docker run -id -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=mysql666 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 这样搞后,mysql库的文件实际上不在容器里面,都在宿主机上了,容器删了,数据也不会丢
# 操作容器里面数据库的表产生的数据,也都在宿主机里面
# cd /home/mysql/ data/ 能看到所创的库
--------------------------------------------------------
# 创建库,创建表,插入数据
# 关闭容器,删除容器,myslq的容器没了,但是数据在宿主机上放着
docker stop 647f85ddf360
docker rm 647f85ddf360
# 再运行起一个容器,做好目录映射,数据都回来了
把上面运行容器的一串代码再运行下,数据就回来了,配置一定要一样
--------------------------------------------------------
.
.
.
.
.
.
2.2 redis 部署
# 如果想要长久的用redis mysql 这些会产生数据的软件,最好在宿主机做目录映射到容器里
# 这样容器没了,产生的数据也还在宿主机里面!!!
# 1 拉取redis镜像
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=redis888 -v /root/redis.conf:/etc/redis/redis.conf -v /root/data:/data redis:latest redis-server /etc/redis/redis.conf
# redis-server /etc/redis/redis.conf 这行代码作为启动容器后的第一条命令
# 容器做成了这个命令的守护进程了
# 这条命令一结束,容器就关掉了,所以要让容器不关掉,就要让这条命令阻塞住,不结束才行
# 不写这行命令,当容器启动起来后,会执行一个默认的命令,阻塞住,不让容器关掉
# 但是写了命令,就会把默认的命令覆盖掉了!!!
# 进入redis容器里面 连接redis
docker exec -it 25dc3e2c7e39 /bin/bash
redsi-cli # 启动服务端
keys * # 查看redis里面所有键值对
auth 123456 # 登录一下
set name lqz # 存字符串
get name # 取字符串
---------------------------------------
# 再到resp远程链接redis 可以看到我们在容器里面的redis服务端里面设置的值!!!
.
.
.
.
.
2.3 nginx 部署
# 拉取nginx镜像
docker pull nginx:latest
# run起容器 在浏览器里面输入http://10.0.0.200:8080/ 映射到容器80端口
# nginx容器80端口的请求后,自动展示html目录下面的index.html欢迎页面!!!
docker run -id --name=nginx -p 8080:80 nginx:latest
----------------------------------------------------------
# 进入docker容器
docker exec -it 3d8f0486961e /bin/bash
cd /usr/share/nginx/html/ # ls 可以看到两个html文件
直接打开html目录下的index.html文件,发现vim没有,要下vim出了点问题,没成功
# apt-get update # apt-get install vim 这两个命令有点问题下载vim有问题
----------------------------------------------
# 所以下面又用目录映射来该index.html文件的
# 来到宿主机上
mkdir html
cd html/
vim index.html # 把html代码粘贴进去 :wq 退出
# 再把改改起的nginx容器停掉,删掉后
# 启动nginx容器,做个目录映射 把原来nginx里面html目录用宿主机上的html目录顶掉
docker run -id --name=nginx -p 8080:80 -v /root/html:/usr/share/nginx/html nginx:latest
# 只需要修改宿主机的/root/html目录里面的index.html里面的代码 ,
# 访问nginx监听的端口 http://10.0.0.200:8080/ 看到页面就是修改后的页面了
.
.
.
.
.
.
.
.
补充知识
-------------------------------------------
# 假如你写了一个开源软件,别人想要运行起你的项目,肯定要先装个mysql与redis,
# 再把你的项目运行起来,这样就比较麻烦
# 第一种办法:
可以把你的项目软件 与 mysql与redis 一起做到一个镜像里面去,
别人拿着你的镜像文件,运行成容器,就可以直接把你的项目跑起来了
该方法太笨重了,不建议在docker容器里面,运行多个服务
# 第二种办法:
把项目文件,mysql与redis文件 都做成容器,做成一个单机的容器编排
别人 只要安装了docker-compose 执行命令docker-compose up -d
就会直接把你的项目文件,mysql与redis文件全部运行起来!!!就比较方便!!!
-------------------------------------------
-------------------------------------------
.
.
.
3 迁移与备份
# 容器保存为镜像!!!
-运行一个centos容器
docker run -id --name=centos_vim centos:7
-在容器中装vim
docker exec -it 00bcf763b395 /bin/bash
yum install vim -y # 容器中装vim软件
mkdir teng # 先随便创个文件夹 cd进去 随便创建并打开一个文件
cd teng
vim aaa.py
exit # 退出容器
-把容器做成镜像(centos+vim)
docker commit 容器名 镜像名
docker commit centos_vim centos_vim_image
--------------
-把centos_vim 容器删除
docker rm centos_vim -f
-基于新构建的镜像centos_vim_image,运行成容器
docker run -id --name=centos_vim555 centos_vim_image:latest
-进入到容器中,查看,软件都在
docker exec -it 容器id号 /bin/bash
---------------------------------------------------
# 镜像备份和恢复
# 把镜像文件打包成压缩包,这样就可以把压缩包复制给别人了,不常用
# cd的家目录下执行该命令
docker save -o centos_vim_image.tar centos_vim_image
# 正常情况下是把 镜像文件 上传到远程仓库(注册中心),让别人从你远程仓库拉
# 删除容器,删除镜像
docker rm b78a105a28be -f # 删除容器
docker images
docker rmi a630cc4e39eb # 删除镜像
# 把备份的镜像压缩包 恢复成镜像 压缩包还在
docker load -i centos_vim_image.tar
docker images # 再查看镜像,发现镜像又有了
.
.
.
.
.
.
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 # 设置工作目录,创建目录并cd到目录下,mkdir lqz cd lqz
# 运行起这个容器,来到的路径就是这个路径
-------------------------------------------------
-------------------------------------------------
# 构建一个带vim的centos镜像
# 第一步:
vim Dockerfile # 在家目录下 创建并打开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
ADD /goudan /hahaha # 找宿主机要复制的目录 是基于dockerfile所在的目录找的
WORKDIR /lqz
# 装一个vim,根目录下创个lqz目录,在里面创个ss.py文件,写了print(1)内容
# 将家目录下goudan目录复制到容器的根目录下的hahaha目录下
# 并来到容器的/lqz目录下
---------------------------------------------
# 第二步:
# 基于dockerfile构建镜像
# 镜像名字自己指定 后面的小点 表示当前路径下的 dockerfile
docker build -t='centos_teng_vim' .
---------------------------------------------
# 第三步:
# 基于这个镜像运行容器
docker run -id --name=xxxx centos_teng_vim
# 进入到容器 就会直接到了 /lqz 目录下 因为设置了 WORKDIR /lqz
docker exec -it xxxx /bin/bash
echo $name # 就能取出环境变量里面的lqz
# 验证vim,和文件夹,文件是否存在
cd /
cd lqz
ls
vim ss.py # 都能正常 执行!!!
------------------------------------
# echo命令就行往文件里面写,然后自动保存
.
.
.
如何构建一个 基于ubuntu系统的redis镜像
# centos yum install nginx
# ubuntu apt-get install nginx
yum update
apt-get update
apt-get install vim -y
----------------------------------
# 需求解决:
# redis,mysql 都是官方镜像
# 公司里:基于ubuntu---》安装redis
让做一个基于ubuntu20.04版操作系统的redis镜像
用Dockerfile去构建,直接构建有可能不成功
可以先把ubuntu20.04镜像拉下来---运行成容器---进到容器---安装redis 安装成功了
把命令记下来---》再写到 Dockerfile 里面去
.
.
.
基于ubuntu镜像构建redis镜像
# 第一步:编辑Dockerfile
vi Dockerfile
# 写入
FROM ubuntu:lunar-20230415
MAINTAINER lqz
WORKDIR /soft
RUN apt-get update && apt-get install wget make build-essential -y
RUN wget https://github.com/redis/redis/archive/7.0.11.tar.gz && tar -xzvf 7.0.11.tar.gz
WORKDIR /soft/redis-7.0.11
RUN make && make install
EXPOSE 6379
CMD ["redis-server","./redis.conf"]
---------------------------------------
# 执行命令构建镜像
docker build -t='ubuntu_redis' .
# 查看构建完成的镜像
docker images
# 镜像运行成容器
docker run -id --name redis -p 6379:6379 ubuntu_redis
# 第五步:查看正在运行的容器
docker ps
# 进入到容器
docker exec -it redis /bin/bash
redis-cli # 连接
.
.
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY