docker基础二
三.Docker操作
linux上不能运行windows系统的容器(可运行win的虚拟机),因内核不同。(centos,ubuntu等都是linux内核)
注:不能直接跨平台运行容器,因为容器只是一个进程,用的还是宿主机的内核
1.认识
Docker可理解为手机中的应用市场,当我们yum install -y docker-ce下载好应用市场,里面是没有软件的,需要docker pull 从远方仓库下载指定的软件(镜像),假如我们下载好centos镜像,然后需要进入此容器yum下载相应的例如python解释器、django等,然后将此打包,然后其他人可用
2.安装
1.安装好Docker
1.安装docker源
wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.安装docker
yum install -y docker-ce
2.配置加速器(从仓库中拉取镜像需要),常见 的有 阿里云加速器、DaoCloud 加速器、灵雀云加速器等
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io
会生成/etc/docker/daemon.json文件(如果速度慢更换源: https://docker.mirrors.ustc.edu.cn/ )
如果有错误发生,需要修改docker的配置文件,删除一个逗号:
vim /etc/docker/daemon.json
3.重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker
systemctl status docker #查看docker状态
二.Docker三大概念
如图我们清晰可知:镜像是从仓库中pull下来的,我们使用run命令进入镜像对应的容器,然后在容器内进行一系列操作(如yum install vim,pip install django等),然后使用commit命令将容器打包成新的镜像,其他人如果要用此镜像,直接发给对方即可,或者将其发布到仓库中,对方从仓库中下载
1.镜像(image)
1.1概念
1.Docker镜像就是一个只读的模板,是一个静态的东西。
2.镜像可以用来创建Docker容器。
3.因为镜像包含完整的root文件系统,体积是非常庞大的,因此docker在设计时按照Union FS的技术,将其设计为分层存储的架构。
4.镜像不是ISO那种完整的打包文件,镜像只是一个虚拟的概念,他不是一个完整的文件,而是由一组文件组成,或者多组文件系统联合组成。
1.2 相关命令
从仓库搜索centos相关的镜像
docker search centos
查看机器上的所有镜像
docker image ls/docker images
修改docker镜像的名字
docker tag 镜像id 新的镜像名
获取镜像
docker pull centos #获取centos镜像
运行镜像,生成容器并且检测镜像是否存在,不存在自动docker Pull,只会运行一下就退出,可用docker ps -a命令查看
docker run 镜像id/镜像名
删除镜像
docker rmi 镜像id前三位即可 #删除镜像,必须清除所有的容器记录依赖
docker rmi `docker images -aq` #批量删除镜像记录
2.容器(container)
2.1概念
1.image和container的关系,就像面向对象程序设计中的 类和实例一样,镜像是静态的定义(class),容器是镜像的运行状态。也就好比程序和进程的关系:我们可以在程序内进行各种修改操作,然后将其运行为进程,对于进程我们可以创建、启动、停止、删除、暂停。将程序打包发送给另一台电脑,另一台电脑也可启动为进程。
2.容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。
2.2 相关命令
1.运行、关闭容器
run是启动一个新的容器,并且运行
docker run -it centos /bin/bash #/bin/bash是默认启动命令,可用nginx -g daemon of,如下图
cat /etc/os-release #进入容器之后查看发行版
#如果想要此容器在后台运行,退回到宿主机:
ctrl+p+q
attach是进入一个死的容器,退出该容器也关闭
#进入容器前先docker start 容器id
docker container attach 容器id/容器名
exec是进入一个运行中的容器,退出时该容器不会关闭
docker exec -it 容器id /bin/bash
启动、关闭容器(如果容器中没有进程,只是闪一下子)
docker container stop 容器id/容器名
docker container start 容器id/容器名
交互式容器的关闭和启动
docker container start -i 容器id/容器名
2.端口映射
docker run -d -p 8090:5000 training/webapp python app.py
#-d 后台运行
#-p 指定端口映射 宿主机的 8090映射到容器内的5000 (宿主机的端口你可以自由定义,容器的端口根据代码决定)
#-P 随机端口映射 ,宿主机会随机生成一个端口,映射到容器的5000(映射请情况可使用docker ps查看)
容器运行之后,可用iptables -t nat -L -n
查看端口映射
查看docker的端口转发情况
docker port 容器id
4.容器命名
docker run --name 名字 -d centos /bin/sh -c "while true;do echo 你看这个灯,它又大又亮; sleep 1;done"
5.查看容器
docker ps #查看正在运行的docker容器(正在运行的容器中必须有一个进程在运行,才不会挂掉)
docker ps -a #查看所有运行过的容器(挂掉的和正在运行的)
查看容器的详细信息
docker container inspect 容器id
查看容器日志
docker logs 容器id/容器名 #查看容器内所有日志
docker logs -f 容器id #实时刷新查看容器内的日志
6.导入导出
进入centos容器内,且修改容器内的信息,然后提交为新的镜像
docker run -it centos /bin/bash
yum install vim #然后下载一个vim
exit #退出容器
docker commit 容器id 新的镜像名:v1 #将此容器提交到本地,为新的镜像(冒号+版本)
docker save 镜像id > xx.tar.gz #导出本地的docker镜像
docker load < xx.tar.gz #加载docker镜像文件到本地
7.删除容器
docker rm 容器id #删除容器记录,必须是挂掉的记录才能删除
docker rm `docker ps -aq` #批量删除容器记录
8.宿主机和容器复制数据
docker cp用于宿主机和容器之间的数据复制
# 主机文件--》宿主机
docker cp /www/runoob 96f7f14e99ab:/www/
# 宿主机文件--》主机
docker cp 96f7f14e99ab:/www /tmp/
9.数据卷挂载
docker只是提供了一个运行环境,要想让一个容器重复利用,需要用到数据卷(这样我们只用在宿主机中改代码即可,容器也不用重启)
1.docker run -d -p 80:81 -v 宿主机项目目录/文件:容器项目目录/文件 镜像名 #挂载已存在的宿主目录(跟数据卷无关)
2.docker run -d -p 90:81 -v 容器目录/文件 镜像名 #生成一个随机名称的数据卷
3.docker run -d -p 91:81 -v 卷名别名:容器目录 #生成卷名别名
4.docker run -d -p 92:81 --volumes-from 容器id #使用某容器id的挂载卷(不会产生新卷)
#使用docker volume ls 查看存在的数据卷
#生成数据卷在/var/lib/docker/volumes下
#使用docker inspect 容器名 来查看mounts对应的数据卷名
10.卸载docker
1、查询docker安装过的包:
yum list installed | grep docker
2、删除安装包:
yum remove docker-ce.x86_64 ddocker-ce-cli.x86_64 -y
3、删除镜像/容器等
rm -rf /var/lib/docker
3.仓库(repository)
3.1概念
docker仓库(repository)
1.仓库是集中存放镜像文件的场所。
2.仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
3.最大的公开仓库是Docker Hub,国内的公开仓库包括Docker Pool等
4.当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下载在另外一台机器上使用这个镜像时候,只需需要从仓库上pull下来就可以了。
docker仓库注册服务器(registry)
1.有时候把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
2.国内的一些云服务商提供了针 对 Docker Hub 的镜像服务(Registry Mirror),这些镜像服务被称为加速器。常见 的有 阿里云加速器、DaoCloud 加速器、灵雀云加速器等。
使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从官方网站下载速度会提高很多。
三.Dockerfile
1.认识
Dockerfile 是自动构建 docker 镜像的配置文件, 用户可以使用 Dockerfile 快速创建自定义的镜像。我们可以去使用 Dockerfile 定义镜像,依赖镜像来运行容器
Dockerfile一般分为四部分:
基础镜像(父镜像)指令 FROM
维护者信息指令 MAINTAINER
镜像操作指令 RUN、EVN、ADD、WORKDIR等
容器启动指令CMD、ENTRYPOINT和USER等
2.例子
一段简单的Dockerfile例子:
FROM python:2.7 #从 Docker Hub 上 pull 下 python 2.7 的基础镜像
MAINTAINER Angel_Kitty <angelkitty6698@gmail.com> #显示维护者的信息
ADD hello / #本地的hello可执行文件拷贝到镜像的/目录
WORKDIR /app #当进入容器就在此目录下
RUN pip install -r requirements.txt #安装依赖包
EXPOSE 5000 # 相当于-P 宿主机随机端口映射到容器5000端口
ENTRYPOINT ["python"] #启动app
CMD ["app.py"]
dockerfile写完之后,通过命令docker ps -t 镜像名 .
,会自动找到当前文件夹下的dockerfile文件进行构造
3.构造基础镜像
什么是基础镜像,像centos,ailplane,unbutun等
我们进入清华大学镜像网站: https://mirrors.tuna.tsinghua.edu.cn ,搜lxc(linux container),进入lxc-images界面,找到最小的镜像,使用wget下载下来(此镜像只是centos第一层目录):
https://mirrors.tuna.tsinghua.edu.cn/lxc-images/images/centos/7/amd64/default/20210114_07%3A08/rootfs.tar.xz
同目录新建dockerfile文件:
FROM scratch
ADD rootfs.tar.xz / #ADD命令会解压tar
CMD ['/bin/sh']
构造(docker built -t 镜像名:版本号)好之后进入镜像
docker run -i -t 镜像名:版本号 /bin/sh
四.docker分层
docker的镜像是由一层一层构成的,所有的镜像都公用同一分层,什么意思呢?假如镜像A使用了centos7基础镜像,镜像B也使用了这个基础镜像,那么这个centos基础镜像也是只有一份(作为单一层实现),我们可以使用docker images
查看所有镜像,计算其总大小假如为4G,但是当我们去/var/lib/docker/images下面看的时候,使用du -sh
,其大小肯定是小于4G的,这是因为所有的分层都是单一存放在这里的。
分层的概念也如下:当我们导入一个镜像的时候,可看到进度条,每个进度条就是一个分层
每commit一次,都会产生一个新层(每一层都会有一个parentid,指向父层)
五.docker-compose编排工具
1.是什么?---- 负责管理单机版的容器之间的通信或者对其进行批量管理
2.为什么?---- 对于不同容器,如果我们想要批量操作,就需要用到编排工具
3.怎么用?
1.安装
yum install docker-compose -y (需要epel源)
2.yam文件
version:docker-compose版本
mysql-server:起来的容器名称
restart:
#always 开机重启服务
3.命令
docker-compose up -d
docker-compose down
六.django,mysql通信
django和mysql各自构建镜像,mysql镜像构造好之后,启动镜像(此时的密码为root账户数据库密码)
docker run --name 容器名称 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 镜像名称
启动之后,可通过命令docker exec -it 容器名称 /bin/bash
进入,再mysql -u root -p
进入
django项目和mysql通过内网关联ip进行通信,通过下面命令查看其容器各自ip
docker network inspect bridge
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律