docker基础一
一.Docker基本概念
1.三大概念
image镜像:docker 镜像就是安装文件,你从网上下载的 exe 或其它文件
container容器:容器就是你安装到本机的程序,可理解为运行中的镜像
Replsitory仓库:就是你下载软件的地方,可理解为git仓库
2.其他
docker的核心是隔离。容器就是添加了隔离机制的进程
docker的运行模式是C/S。我们本机是C,docker引擎是S
二.命令
1.镜像操作
docker search 镜像名称\id # 搜索远程库中的可用镜像
docker pull 镜像名称 # 拉取
docker images # 查看本地所有镜像
docker rmi "镜像id" # docker删除镜像
docker save -o 导出路径 镜像id #导出镜像
docker load -i 镜像文件 #导入镜像
docker tag 镜像id 新镜像名称:版本 #修改镜像名称
2.容器操作
#1.运行容器(-it:交互 -d后台)
docker run -it 镜像id|镜像名称
#例子:docker run -d -p 宿机端口:容器端口 --name 起别名 镜像标识|镜像名称
#-d表示后台运行 -p表示宿机与容器间的映射端口 --name表示给容器指定的命名
#2.查看正在运行的容器
docker ps #查看运行中的容器
docker ps -a #查看所有容器 包括未运行的
docker ps -q #查看容器的标识
#3.查看容器日志
docker logs -f 容器id
-f表示查看最后几行
#4.在容器内部运行脚本
docker exec -it 容器id /bin/sh
#进入容器之后可使用shell命令:例:ls\cd\mkdir等等,退出exit
#5.启动容器
docker start 容器id
#6.将主机中的文件放入容器中的方式
docker cp 文件名称 容器id:容器内部的路径
#7.一条命令停用并删除容器
docker stop $(docker ps -q) & docker rm $(docker ps -aq)
3.安装
docker安装(参考https://www.runoob.com/docker/centos-docker-install.html),这里选择自动安装
curl -sSL https://get.daocloud.io/docker | sh
安装好之后启动docker服务
systemctl start docker
测试执行hello-world镜像,会先从本地找,找不到会从远程库中找
如果没有设置远程库,修改/etc/docker/daemon.json如下
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
三.Dockerfile
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,具体参考:https://www.cnblogs.com/panwenbin-logs/p/8007348.html,例子:当python镜像构造成功之后,直接运行容器用run,要进入容器内部执行某个脚本用exec,两者作用相同
每个镜像都有其对应的dockerfile文件,要想构建新的容器,需要新建一个文件夹,文件夹中新建Dockerfile文件,然后在此路径下docker build -t 自定义镜像名称 . 也可以使用-f参数指定Dockerfile文件docker build -f /path/to/a/Dockerfile
在一个Dockerfile里面不能有多个基础镜像,也就是下面这种写法(不可取)
FROM image1
FROM image2
1.CMD
是在docker run时进行,RUN是在docker build时候运行,如果一个文件中有多行CMD命令,仅仅最后一行的生效,格式:CMD [xx,xx]
CMD ["shell命令"]
CMD ["可执行文件或命令","param1","param2"] #一般文件都是xx.sh,需要给其赋予执行权限
CMD ["param1","param2"] # 该写法是为ENTRYPOINT指令指定的程序提供默认参数
例子
FROM python:3.6.5
RUN mkdir /code
WORKDIR /code
ADD . /code
RUN pip install -r /code/requirements.txt
CMD ["build.sh","参数"]
#***build.sh内容:
docker run -p 80:8000 -d guoqing:test /bin/bash -c "python manage.py runserver 0.0.0.0:8000"
后面直接运行build.sh即可
2.ENTRYPOINT
FROM nginx:test
ENTRYPOINT ["nginx","-c"] # 定参
CMD ["/etc/nginx/nginx.conf"]
#不传参运行 docker run nginx:test,容器内会默认运行nginx -c /etc/nginx/nginx.conf
#传参运行 docker run nginx:test -c /etc/nginx/new.conf,容器内会默认运行nginx -c /etc/nginx/new.conf
例子1
FROM python:3.6.5
ENTRYPOINT ["python","/code/manage.py"]
RUN mkdir /code
WORKDIR /code
ADD . /code
RUN pip install -r /code/requirements.txt
CMD ["runserver","0:8000"]
#当运行docker run -it guoqing:text 时相当于python /code/manage.py runsever 0:8000
3.RUN
RUN命令两种格式,一种是shell,一种是exec,和docker运行容器中的run无关
RUN 命令 # RUN ./test.php dev offline
RUN ["./test.php", "dev", "offline"] # 相当于RUN ./test.php dev offline
4.ENV
ENV用来设置环境变量,设置了环境变量之后,在之后的指令中可用$xx使用
ENV NODE_VERSION 7.2.0
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"
四.镜像合并
通常我们需要一个镜像中处理多件事情,例如部署django项目,一个镜像中可能需要包含python、mysql、redis等功能,但通常来说我们都是多个容器共同处理一个项目(例如python有其对应的容器、mysql有其对应的容器),那么改如何将其独立的容器合并为一个呢?我们都知道每个容器的构建都需要其对应的Dockerfile文件,只需要将其Dockerfile文件合并重新build即可得到新的容器。
https://www.cnblogs.com/shiningrise/p/5820426.html
五.多镜像导出导入
导出
docker save image1 image2 > images.tar
导入(确保没有此tar中的镜像)
docker load --input images.tar
六.docker-compose
1.简介
docker-compose用来单机上编排容器(定义和运行多个容器,使容器互通)
通常情况下,我们会为python、django、mysql等各自构建一个容器(是为了之后方便维护),让这些容器为同一个项目服务,但是我们不能一个一个容器执行run命令吧,这样太麻烦了,这就引入了docker-compose。docker-compose是 docker 官方的开源项目,使用 python 编写,实现上调用了 Docker 服务的 API 进行容器管理
docker-compose将所管理的容器分为3层结构:project service container
一份标准配置文件应该包含 version、services、networks 三大部分
2.文件详解
Compose和Docker兼容性:
Compose 文件格式有3个版本,分别为1, 2.x 和 3.x
目前主流的为 3.x 其支持 docker 1.13.0 及其以上的版本
常用参数(参考:https://www.jianshu.com/p/90bf0e231e5a)
version # 指定 compose 文件的版本
services # 定义所有的service信息,services下面的第一级别的key就是一service 的名称,一个service代表一个容器
build # 指定构建上下文的路径
command # 覆盖启动容器后默认执行的命令
volumes # 通常在项目所在容器的service中使用(容器中项目所存放路径)
3.安装
默认情况下,windows 和 mac 下的 docker 已经自带了 docker-compose 工具,可以使用 docker-compose -v
命令查看,linux
系统下使用
curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
4.使用
三个步骤
1.新建Dockerfile文件,文件中主要导入项目所需模块
2.docker-compose.yml文件中声明程序的服务,比如webapp,mysql、redis
3.执行docker-compose up来启动运行
命令(安装docker-compose并为脚本赋予执行权限)
1.curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
2.sudo chmod +x /usr/local/bin/docker-compose
查看安装是否成功
docker-compose -v
列出所有运行容器
docker-compose ps
查看服务器日志输出
docker-compose logs
https://www.cnblogs.com/xiaonq/p/12377099.html
1.port和expose区别
2.关闭防火墙之后nginx启动不了
3.dockerfile用到的所有文件路径都是在容器中可以找得到的
4.每个容器下面都是和linux目录相同的目录结构
【推荐】国内首个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 绘制太阳,地球,月球 运作规律