docker详解
我们利用docker安装应用时,docker会自动搜索并下载应用镜像(image).镜像不仅包含应用本身,还包含应用运行所需要的环境,配置,系统函数库。docker会在运行镜像时创建一个隔离环境,称为容器1).容器(Container)容器是镜像创建的运行实例,它是一个轻量级的、可执行的独立软件包,包含了运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。容器化技术使得软件可以在几乎任何
目录
1.docker介绍
我们利用docker安装应用时,docker会自动搜索并下载应用镜像(image).镜像不仅包含应用本身,还包含应用运行所需要的环境,配置,系统函数库。docker会在运行镜像时创建一个隔离环境,称为容器
1).容器(Container):
- 容器是镜像创建的运行实例,它是一个轻量级的、可执行的独立软件包,包含了运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。
- 容器化技术使得软件可以在几乎任何地方以相同的方式运行,解决了“在我的机器上可以运行”的问题。
2).镜像(Image):
- 镜像是构建容器的模板,它是一个只读的模板,用于创建Docker容器。
- 镜像通常是通过一个Dockerfile定义的,Dockerfile包含了构建镜像所需的指令。
3).仓库(Registry):
- Docker仓库用于存储和分发Docker镜像。
- 公共的Docker Hub是最大的Docker镜像仓库,用户可以在那里找到、分享和运行高质量的Docker镜像。
主要特点:
- 可移植性:Docker容器可以在任何支持Docker的操作系统上运行,应用部署和迁移变得非常简单。
- 隔离性:容器之间是相互隔离的,一个容器的崩溃不会影响其他容器。
- 轻量级:容器不需要像虚拟机那样启动一个完整的操作系统,因此它们可以快速启动,并且占用更少的系统资源。
- 安全性:容器运行在自己的隔离环境中,并且可以限制对系统资源的访问,从而提供了额外的安全层。
工作流程:
- 编写Dockerfile:定义应用的依赖、环境变量、配置等。
- 构建镜像:通过Dockerfile构建应用镜像。
- 运行容器:从镜像启动一个或多个容器实例。
- 管理容器:启动、停止、监控和删除容器。
- 共享镜像:将构建好的镜像推送到Docker仓库,以便在其他机器上使用

编写 Dockerfile
做什么:创建一个名为
Dockerfile的文本文件。它包含了一系列指令,告诉 Docker 如何一步步地构建你的应用镜像。示例指令:
FROM python:3.9-slim:指定基础镜像。
COPY . /app:将本地代码复制到镜像内的/app目录。
RUN pip install -r requirements.txt:在镜像内执行命令安装依赖。
CMD ["python", "app.py"]:指定容器启动时默认运行的命令。构建镜像
做什么:执行
docker build -t my-app .命令。过程:Docker 守护进程会读取
Dockerfile,逐步执行其中的指令,并为每一步创建一个新的镜像层,最终生成一个可命名的镜像(如my-app:latest)。(可选) 推送至镜像仓库
做什么:执行
docker push my-registry.com/my-app:latest命令。目的:将本地构建好的镜像上传到像 Docker Hub、Google Container Registry 或私有仓库这样的镜像仓库中,以便在其他地方拉取和使用。
拉取镜像
做什么:在需要运行该应用的其他机器上,执行
docker pull my-registry.com/my-app:latest命令。目的:从镜像仓库下载指定的镜像到本地。
运行容器
做什么:执行
docker run -d -p 8080:80 --name my-running-app my-app命令。过程:Docker 守护进程根据指定的镜像创建一个可写的容器层,并按照配置(如端口映射、环境变量等)启动容器内的进程。
2.安装docker(本机默认使用的centos)
2.1卸载docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine \
docker-selinux

2.2配置Docker的yum库
Docker的yum源是一个软件仓库,它允许用户通过yum包管理器在基于Red Hat的Linux发行版(如CentOS、Fedora)上轻松地安装、更新和卸载Docker及其相关组件。Yum(Yellowdog Updater, Modified)是一个用于RPM-based Linux系统的自动化更新和软件包安装的工具。
1)安装yum工具
yum install -y yum-utils
如果报错显示 Cannot find a valid baseurl for repo: base/7/x86_64
1)备份原有的repo文件(可选,有备无患)
sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup2)下载阿里云的repo配置文件
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo或者
sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo3)刷新YUM元数据缓存
更新完repo文件后,需要清空并重建YUM的元数据缓存,以便让它认识新的仓库配置:sudo yum clean all sudo yum makecache4)使用阿里云源安装yum-utils
sudo yum --disablerepo=\* --enablerepo=aliyun install -y yum-utils
2)配置Docker的yum源(更新为阿里云源)
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
更新yum,建立缓存
sudo yum makecache fast
2.3安装Docker
安装命令
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
一些启动和校验命令
#查看Docker版本
docker -v
# 启动Docker
systemctl start docker
#列出运行在本地Docker主机上的所有镜像
docker images
# 停止Docker
systemctl stop docker
# 重启
systemctl restart docker
# 设置开机自启
systemctl enable docker
# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
当未启动时,查看镜像(docker images)结果为:
![]()
启动Docker后的查看镜像结果:
2.4配置docker镜像加速
之前安装Docker时,配置的阿里加速镜像现在停用失效,导致网络无法访问PS:听网友说是阿里加速镜像已停用
如果镜像有问题的话,会报错:
docker: Error response from daemon: Get “https://registry-1.docker.io/v2/”: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
解决方式:
# 创建目录
mkdir -p /etc/docker
# 复制内容
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://mirrors.tuna.tsinghua.edu.cn",
"http://mirrors.sohu.com",
"https://ustc-edu-cn.mirror.aliyuncs.com",
"https://ccr.ccs.tencentyun.com",
"https://docker.m.daocloud.io",
"https://docker.awsl9527.cn"
]
}
EOF
# 重新加载配置
systemctl daemon-reload
# 重启Docker
systemctl restart docker
2.5.安装mysql(其实验证镜像能否成功拉取)
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql
Docker会按以下顺序执行:
1. 在本地查找mysql:latest镜像。
2. 如果没找到,自动从Docker Hub拉取。
3. 创建一个名为mysql的容器。
4. 在后台启动这个容器。
3.Docker命令解读
image是镜像的名字,tag是镜像版本,container是容器
1)查看镜像docker images
- 语法: docker images [option]

option说明:
-a,all: 展示所有镜像
-q,quite: 只展示镜像ID
2)拉取镜像 docker pull
- 语法: docker pull image[:tag]
#拉取镜像
docker pull nginx
#拉取指定版本镜像
docker pull nginx:1.26.0
3)镜像删除docker rmi
- 语法: docker rmi [option] image:tag
#注意要是完整标签:
docker rmi nginx:latest
#推荐使用其唯一镜像ID 删除:
docker rmi 3f8a4339aadd
#option说明,-f:全部删除
#$(docker images -aq) 即取得所有镜像ID集合
docker rmi -f $(docker images -aq)
3.2容器
1)运行容器docker run
- 语法:docker run [option] image[:tag] [command] [arg...]
--name: 为容器指定一个名称; -d: 后台运行容器,并返回容器ID,也即启动守护式容器; 非后台运行会阻塞控制台 常见坑:当后台运行容器时,若容器没有提供服务,则会自动停止 -i,-t,-it:以交互模式运行容器;为容器重新分配一个伪输入终端;二者通常同时使用; 交互方式运行,进入容器内部查看内容 exit:停止容器并从退回主机 ctrl + p + q:不停止容器退出 -p: 端口映射,-p标志用于指定端口映射,它允许你将容器内的端口映射到镜像端口,即 运行Docker的机器上的端口。这是为了让外部网络能够访问在Docker容器内运行的服务 端口映射可以提高安全性,因为可以只公开必要的端口,而非公开容器内的所有端口。 映射有以下格式 -p ip:主机端口:容器端口 -p 主机端口:容器端口(常用) -p 容器端口 容器端口 -e:环境变量 -P: 随机端口映射; -w: 指定命令执行时,所在的路径 例如: docker run -d --name nignx -p 80:80 nginx 后台运行最新版本nginx ,容器名字定义为nginx,镜像,容器端口都是80
这里这个端口映射,因为docker是封闭性的,所以我们是没办法直接访问到docker中的镜像端口的,这时候我们就需要访问主机的端口3306,会自动映射到镜像的3306上
- 不写tag默认最新版本,command和arg为默认配置一般不写
- ctrl + c 终止运行
2)停止容器docker stop
- 语法: docker stop [option] container [container]
option说明
-t, --time int:这个选项指定在发送 SIGTERM 信号后等待容器停止的秒数。
容器中的应用程序可以捕获SIGTERM信号并执行清理操作,如保存状态、关闭连接、释放资源等再退出
如果在指定的时间内容器没有停止,那么 Docker 将发送 SIGKILL 信号来强制停止容器。
默认情况下,docker stop 会等待 10 秒。
#container自己停止或20秒后强制停止,不使用-t默认10秒
docker stop -t 20 container
[container]
同时操作多个容器
3)强停容器docker kill
- 语法: docker stop [option] container
- 直接发送SIGKILL信号到容器的主进程,这会立即终止容器,不给容器中的进程任何清理和退出的机会。适用于容器无响应或者需要快速停止容器。
4)查看运行容器docker ps
- 语法:docker ps [option] container

- 容器id 镜像名 容器默认命令 创建时间 启动状态(up即成功) 占用端口 应用容器名(随机)
- 容器的操作(container)只能是容器名或容器ID(非镜像名),若可以唯一识别,可以只使用ID前几位数字

option说明
-d: 查看正在运行容器
-a: 查看所有容器(包括已经停止的)
-n=?:展示最近运行的?个容器
-q: 只显示id
5)删除容器docker rm
- 语法:docker rm [option] container [container]
- 不能删除运行中的容器,除非option选用-f
- 同理,删除所有镜像: docker rmi -f $(docker ps -aq)

6)启动容器docker start
- 语法: docker restart container [container]
- 启动停止的容器,若已经启动或者已经删除则无效

7)重启容器docker restart
- 语法: docker restart container [container]
- 关闭的则启动,启动的则重启
8)查看容器状态docker stats
- 语法: docker stats container
- 展示容器占用的cpu内存情况
- ctrl + c 退出
9)查看容器日志docker logs
- 语法:docker logs [option] container
option 说明
-tf:展示日志
--tail number:以字符串的形式展示日志,number展示日志条数
-f 一直跟踪这个日志(调试一般会用)
10)查看容器进程信息docker top
- 语法:docker top container
11)进入容器docker exec/attach
- 语法:docker exec -it container bashShell
#命令以与控制台(/bin/bash)交互(-it)的形式进入容器nginx(已经取容器名为nginx)
docker exec -it nginx /bin/bash
或者
docker exec -it nginx bash
#exec进入容器并开启新终端并操作,更常用

进入容器后也可以进去mysql

12)起别名
vi ~/.bashrc

source ~/.bashrc
3.3保存镜像
1)镜像保存docker save
- 语法:docker save [option] image[:tag]
-o:将镜像保存为tar包(名字随便取)
docker save -o mynginx.tar mynginx:vers1.0
2)镜像加载docker load
- 语法:docker load [option]
-i:指定压缩包路径,自动读取,根据压缩包产生镜像
docker load -i mynginx.tar
这相当于是打包好的镜像
4 Docker存储
| 挂载类型 | 语法示例 | 来源/说明 |
|---|---|---|
| 匿名挂载 | -v /容器内路径 |
只写容器内路径 |
| 具名挂载 | -v 数据卷名:/容器内路径 |
给数据卷起名,便于管理 |
| 指定路径挂载 | -v /本地目录:/容器内路径 |
指定宿主机具体目录 |
-
匿名挂载:你只指定了容器内的路径,没有给数据卷起名,Docker会自动在宿主机
/var/lib/docker/volumes/下生成一个随机字符串的目录来关联。因为匿名挂载卷的名字是随机字符串,不便于后续管理和维护。 -
具名挂载:你为数据卷指定了一个名字(如
juming-nginx),Docker会以这个名字在/var/lib/docker/volumes/下创建目录。通过名字管理卷,推荐使用这种方式。 -
指定路径挂载:你明确指定了宿主机上的一个具体目录路径(如
/home/user/app)和容器内的路径进行关联。
1)数据卷挂载
语法: docker -v 数据卷名:容器目录
- 不指定本地目录,默认放在/var/lib/docker/volums/xxxx/_data
- 容器内路径: ro rw 改变读写权限,看到ro说明只能通过本地主机修改文件而非容器内修改

#查看帮助信息
docker volum --help
#创建数据卷
docker volume create
#查看所有数据卷
docker volume ls
#删除指定数据卷
docker volume rm
#查看某个数据卷的详情
docker volume inspect
#清除数据卷
docker volume prune


2)本地目录挂载
语法: docker -v 本地目录:容器目录
docker inspect:查询容器详情
我们先看一下nginx的详细信息(刚挂载过)

我们在看以下mysql的挂载

像数据库就有匿名挂载,因为data数据存储是需要的,那就直接创建数据卷然后随机给一个很长的名字

3).Dockerfile

| 指令 | 指定基础镜像 | 示例 |
|---|---|---|
| FROM |
|
FROM centos:6 |
| ENV |
|
ENV key value |
| COPY |
|
COPY ./jrel1.tar.gz /tmp |
| RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN tar-zxvf/tmp/jrell.tar.gz&& EXPORTS path=/tmp/jrell:$path |
| EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
| ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |


5.docker网络
ip地址是docker网桥分配的,如果关掉就没了,这是别的容器在启动,就把这个占用了,这时候就可以自定义网络
| 命令 | 语法示例 | |
|---|---|---|
| docker network create | 创建一个网络 |
|
| docker network ls | 查看所有网络 |
|
| docker network rm | 删除指定网络 |
|
| docker network prune | 清除未使用的网络 | |
| docker network connect | 使指定容器连接加入某网络 | |
| docker network disconnect | 使指定容器连接离开某网络 | |
| docker network inspect | 查看网络详细信息 |
更多推荐



所有评论(0)