迁移备份
# 镜像从哪来的? 1 docker pull 拉的 2 通过容器打包成镜像 -centos镜像运行成容器---》装了vim -把装了vim的容器---》打包成镜像 -以后拿到这个镜像--》再运行成容器,都会带vim命令 3 Dockerfile构建 # 容器保存为镜像 -运行一个centos容器 docker run -id --name centos_vim centos:centos7 -在容器中装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 -f -基于新构建的镜像,运行成容器 docker run -id --name centos_vim centos_vim_image:latest -进入到容器中,查看,软件都在 docker exec -it c3e633bd1 /bin/bash # 本地镜像---推送到远端docker仓库中---》私有仓库(公司内会有私有仓库--》推送上去,给别人用) -早期 这个是免费的---》后期好像收费 -给镜像打个tag docker tag 镜像id 镜像新名字(账号名/镜像名) -登录到你账号中 docker login 输入账号密码 -docker push 镜像名字 docker push 镜像新名字 -别人就可以下载了 代码写好---》做到容器内---》拿到项目镜像 项目镜像 v1.1 项目镜像 v1.2 项目镜像 v1.3 项目镜像 v2.1---->运行成容器 # 镜像备份和恢复 docker save -o centos_vim_image.tar centos_vim_image -删除容器,删除镜像 -把备份的镜像恢复 docker load -i centos_vim_image.tar
Dockerfile(很重要)
dockerfile介绍和常用命令
# 镜像从哪里来的? 1 远程仓库拉取的 docker pull (hub.docker---》搭建私有仓库) 2 用容器做成的镜像 docker commit 3 把备份的恢复 docker load 4 使用Dockerfile来构建(这种多) # 什么是Dockerfile Dockerfile是由一系列命令和参数构成的脚本文件,这些命令应用于基础镜像并最终创建一个新的镜像 # centos7中,装了vim,在根路径下新建了一个文件 lqz.txt,写了写内容 # 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 # 设置工作目录,运行起这个容器,来到的路径就是这个路径 RUN # 启动并运行容器执行的命令
小案例
# 构建一个带vim的centos:7镜像,根路径下有/lqz/ss.py vim Dockerfile FROM centos:centos7 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 ./aa.txt /lqz/aa.txt WORKDIR /lqz # 基于dockerfile构建镜像,不要忘了 . 基于当前路径下的Dockerfile 构建镜像 docker build -t='centos_lqz_vim' . docker images # 基于这个镜像运行容器 docker run -id --name xx centos_lqz_vim # 进入到容器 docker exec -it xx /bin/bash # 验证vim,和文件夹,文件是否存在
案例2
FROM centos:centos7 MAINTAINER lqz ENV name lqz RUN mkdir /lqz RUN touch /lqz/ss.py RUN echo 'input()' > /lqz/ss.py WORKDIR /lqz CMD ['python' './ss.py'] # 运行容器时会默认加上 /bin/sh -c # 基于dockerfile构建镜像,不要忘了 . 基于当前路径下的Dockerfile 构建镜像 docker build -t='centos_py' . docker images # 基于这个镜像运行容器 docker run -id --name yy centos_py python /lqz/ss.py # 进入到容器 docker exec -it xx /bin/bash # 查看环境变量 # python看 os.environ.get('name') # shell看 echo $name
常用和不常用命令
# https://zhuanlan.zhihu.com/p/419175543?utm_id=0 FROM: 指定基础镜像 RUN: 构建镜像过程中需要执行的命令。可以有多条。docker build CMD:添加启动容器时需要执行的命令。多条只有最后一条生效。可以在启动容器时被覆盖和修改 ENTRYPOINT:同CMD,但这个一定会被执行,不会被覆盖修改。 MLABELAINTAINER:表明镜像的作者。将被遗弃,被LABEL代替。 EXPOSE:设置对外暴露的端口。 ENV:设置执行命令时的环境变量,并且在构建完成后,仍然生效 ARG:设置只在构建过程中使用的环境变量,构建完成后,将消失 ADD:将本地文件或目录拷贝到镜像的文件系统中。能解压特定格式文件,能将URL作为要拷贝的文件 COPY:将本地文件或目录拷贝到镜像的文件系统中。 VOLUME:添加数据卷 USER:指定以哪个用户的名义执行RUN, CMD 和ENTRYPOINT等命令 WORKDIR:设置工作目录 # docker logs 容器名字/id号 查看镜像运行成容器时,错误日志 -如果容器没起来,看日志排查错误 # CMD ENTRYPOINT #相同点: 只能写一条,如果写了多条,那么只有最后一条生效。 容器启动时才运行,运行时机相同。 # 不同点: ENTRYPOINT不会被运行的command覆盖,而CMD则会被覆盖。 如果我们在Dockerfile中同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数 # ARG 和 ENV ENV:设置执行命令时的环境变量,并且在构建完成后,仍然生效 ARG:设置只在构建过程中使用的环境变量,构建完成后,将消失
ARG 演示
# 案例Dockerfile FROM centos:centos7 MAINTAINER lqz ENV name lqz ARG age=19 RUN mkdir /lqz RUN touch /lqz/ss.py RUN echo 'input()' > /lqz/ss.py RUN echo $age WORKDIR /lqz CMD python ./ss.py # docker build -t='xxxx' .
dockerfile构建一个djagno项目(books图书管理系统)
# 以图书管理系统为例---》公司使用docker流程 # 公司中,使用Docker开发的工作流程 第一步:有一个项目,pycharm开发着,开发完后 第二步:在项目路径下新建Dockerfile,写入 FROM python:3.8 MAINTAINER lqz WORKDIR /soft COPY ./requirements.txt /soft/requirements.txt RUN pip install -r requirements.txt -i https://pypi.doubanio.com/simple CMD ["python","manage.py","runserver","0.0.0.0:8080"] 第三步:把代码提交到git ------------------ 第四步:上线人员:在上线机器上,把代码啦下来 git clone https://gitee.com/liuqingzheng/books.git 第五步:构建镜像 docker build -t='django_books' . 第六步:运行容器 docker run -id --name=books -v /root/books:/soft -p 8080:8080 django_books:latest 第七步:其它人访问宿主机的8080端口就能看到项目了 --------- 第八步:开发人员继续提交代码 第九步:运维人员pull代码,重启容器,用户就可以看到最新的了 重启docker容器即可(第三方依赖变了)--》重写构建镜像,运行容器
docker 私有仓库
# 有个远程仓库 ,docker官方提供的 ---》我们可以把我们的镜像传上去
# 公司做的镜像,一般不放在远程仓库,公司会自己搭建私有仓库(把公司制作的镜像传到私有仓库)
镜像传到官方仓库
# 第0步:在远端创建仓库 # 第一步:给镜像打标签 docker tag 086e6b3e71c0 liuqingzheng/lqz_books:v1 # 第二步:登录到远程 docker login 用户名:不是邮箱 密码:挺复杂 # 第三步:提交 docker push liuqingzheng/lqz_books:v1 # 第四步:别人就可以下载了 docker pull liuqingzheng/lqz_books:v1
镜像分层
每一个Dockerfile命令都会构建一层镜像(本质上是每一层都会启动一个容器,执行完命令后,将容器进行提交,通过查看下载下来的镜像,发现历史层信息的层ID是missing,其实是因为原本的层id只存在于构建镜像的宿主机上,一旦转移镜像后,历史层消息中将只保留最新一层的ID # 只要执行一个命令就会多一层 RUN yum install vim -y RUN yum install git -y # 查看镜像分层的命令 docker history liuqingzheng/lqz_books:v1 # 好处: 构建快,分发方便,如果本地有某一层了,这一层就不需要下载了 # 补充:Dcokerfile写命令,建议多条命令合为一条---》只会生成一层 RUN python -m pip install --upgrade pip &&\ python -m pip install --upgrade setuptools &&\ pip install -r requirements.txt
私有仓库搭建
# 自己搭建私有仓库 -harbor:企业级私有仓库---》(有图形化界面--》跟hub.docker 很像)https://blog.csdn.net/weixin_47085247/article/details/129237979 -registry:用docker搭建私有仓库(没有图形化界面) # 搭建步骤:(使用docker搭建docker私有仓库) -第一步:拉取镜像 docker pull registry -第二步:运行容器:docker run -di --name=registry -p 5000:5000 registry -就是一个web服务端--》从浏览器中访问它 -第三步:打开浏览器 输入地址http://10.0.0.110:5000/v2/_catalog看到{"repositories":[]} 表示私有仓库搭建成功并且内容为空 -第四步:修改daemon.json vi /etc/docker/daemon.json { "insecure-registries":["10.0.0.110:5000"] } -第五步:重启docker 让配置生效 systemctl restart docker docker start registry -第六步:把某个镜像tag成私有仓库的镜像 docker tag 镜像名字/id 10.0.0.110:5000/django_books:v1 docker tag nginx:latest 10.0.0.110:5000/my_nginx:v1 -第七步:提交到私有仓库 docker push 10.0.0.110:5000/my_nginx:v1 -第八步:其他人,只要配置了私有仓库就可以直接拉取 docker pull 10.0.0.110:5000/my_nginx:v1 # 以后公司用harbor多---》自己搭建个harbor
标签:容器,centos,lqz,vim,03days,镜像,docker From: https://www.cnblogs.com/wzh366/p/18073560