第一部分:Docker 基础概念
1.1 什么是 Docker?
-
容器化技术:轻量级虚拟化,共享主机内核
-
与传统虚拟机的区别:
-
虚拟机:完整操作系统 + 应用
-
Docker:共享内核 + 应用及其依赖
-
-
核心优势:
-
快速部署
-
环境一致性
-
资源利用率高
-
易于扩展
-
1.2 Docker 核心组件
核心概念:
-
概念 说明 镜像 (Image) 只读模板,包含运行应用所需的文件、依赖、配置。类似面向对象中的“类”。 容器 (Container) 镜像的运行实例,可创建、启动、停止、删除。类似“对象”。 仓库 (Repository) 存放镜像的地方,Docker Hub 是默认公共仓库。 Dockerfile 定义如何构建镜像的脚本。 卷 (Volume) 持久化容器数据的机制。
第二部分:Docker 安装与配置
Linux内核: 3.10以上. 如果旧的内核需要升级内核才能使用.
uname -r
2.1 Linux (Ubuntu/Debian/CentOS)
# 更新包索引
sudo apt update # Ubuntu/Debian
# 或 sudo yum update # CentOS
# 安装依赖
sudo apt install apt-transport-https ca-certificates curl software-properties-common
# 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加稳定版仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装 Docker Engine
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
# 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 将当前用户加入 docker 组(避免每次 sudo)
sudo usermod -aG docker $USER
newgrp docker # 刷新组权限
2.2 Windows / macOS
-
安装后启用 WSL2(Windows)或 HyperKit(macOS)
-
验证安装:
docker version
配置优化
# 1. 配置镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://your-mirror.mirror.aliyuncs.com"]
}
EOF
# 2. 重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
# 3. 验证安装
docker --version
docker info
二进制安装docker
docker二进制下载链接https://download.docker.com/linux/static/stable/x86_64/
##解压上传的docker文件包
[root@docker02 ~]# tar xf docker-20.10.24.tgz
##修改docker目录及里面内容权限
[root@docker02 ~]# chown root.root docker/*
##移到到docker命令到bin目录下面
[root@docker02 ~]# mv docker/* /bin/
##创建docker启动命令
[root@docker02 ~]# vim /usr/lib/systemd/system/docker.service
# /usr/lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
Environment=GOTRACEBACK=crash
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
[Install]
WantedBy=multi-user.target
##重新加载
[root@docker02 ~]# systemctl daemon-reload docker
[root@docker02 ~]# mkdir -p /etc/docker
[root@docker02 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://ubfhz9vw.mirror.aliyuncs.com"]
}
[root@docker02 ~]# systemctl enable --now docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
[root@docker02 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disable>
Active: active (running) since Wed 2025-04-02 02:12:05 CST; 7s ago
Docs: https://docs.docker.com
Main PID: 1598 (dockerd)
第三部分:Docker 基础操作
3.1 镜像操作
# 搜索镜像
docker search ubuntu
# 拉取镜像
docker pull
docker pull nginx 1.24-alpine
#指定版本
只写服务名字一般下载服务的最新版本.
docker pull nginx === docker pull nginx:latest 最新版
docker pull nginx 下载ngx最新版本 docker pull nginx:latest
下载ngx最新稳定的版本 nginx:stable
下载指定的版本 nginx:1.24
#指定系统
nginx镜像默认的系统是Debian系统
docker pull nginx:1.20-alpine 使用alpine系统更加节约空间
docker pull nginx:1.24-alpine 使用alpine系统更加节约空间
# 查看镜像
docker images
docker image ls 简写为docker images查看镜像
docker images -a 查看所有镜像包含隐藏镜像
# 导出/导入镜像
保存docker镜像(save),其他节点上导入(load)
docker image save #docker save
docker image load #docker load
##节点保存docker 镜像 -o输出到指定的文件.
[root@docker01 ~]# docker save debian:bullseye -o debian_bullseye
#增加压缩功能
[root@docker01 ~]# docker save debian:bullseye |gzip > debian_bullseye.tar.gz
[root@docker01 ~]# ll -h debian*
-rw------- 1 root root 124M 4月 2 20:30 debian_bullseye
-rw-r--r-- 1 root root 52M 4月 2 20:31 debian_bullseye.tar.gz
#导入load
[root@docker02 ~]# ll
-rw-r--r-- 1 root root 53971542 4月 2 20:33 debian_bullseye.tar.gz
[root@docker02 ~]# docker load -i debian_bullseye.tar.gz
3dec696a3faa: Loading layer [==================================================>] 129.4MB/129.4MB
Loaded image: debian:bullseye
[root@docker02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
debian bullseye 189a2f977ff1 21 months ago 124MB
##批量导出镜像
docker images |awk 'NR>1{print $1":"$2}' > /root/images.txt
for name in `cat /root/images.txt`
do
name_new=`echo $name |sed 's#:#_#g'`
docker save ${name} -o ${name_new}.tar
done
##删除镜像
条件:镜像不能在使用中.(没有基于这个镜像的容器).
docker image rm === docker rmi
[root@docker02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
debian bullseye 189a2f977ff1 21 months ago 124MB
[root@docker02 ~]# docker rmi debian:bullseye
Untagged: debian:bullseye
Deleted: sha256:189a2f977ff1e0aeb33038f380dd9a6ab0355d27ec82f10d23567b95386506ce
Deleted: sha256:3dec696a3faa5c4e640ffcc75cdc563e6198d7386bf0872ada5d956f56119957
[root@docker02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
补充:镜像清理用的命令
- 用于清理一些临时镜像,未来我们自定义镜像的时候会有.
- 这些镜像一般来自于自定义镜像,生成临时镜像.没有名字和tag标签.
[root@docker01 ~]# docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B
##标签与推送
docker tag
- 给镜像设置一个新的名字.
- 应用场景:
1.自定义镜像.
2.搭建与使用内部镜像仓库.registry
docker tag nginx:latest myrepo/nginx:v1 # 打标签
docker push myrepo/nginx:v1 # 推送到私有仓库
查看镜像详细信息(补充)
-
docker image inspect-jq专门过滤,json形式数据
##需要先安装jq [root@docker01 ~]# yum -y install jq [root@docker01 ~]# docker inspect ubuntu:22.04 |jq .[].Id "sha256:5a81c4b8502e4979e75bd8f91343b95b0d695ab67f241dbed0d1530a35bde1eb" [root@docker01 ~]# docker inspect ubuntu:22.04 |jq .[].ContainerConfig.Hostname "c4538cadf1a2" [root@docker01 ~]# docker inspect ubuntu:22.04 |jq .[].ContainerConfig.Env [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ] 结果中最外面是: [] 所以先用 jq .[]进入到 []中. 结果中{} 可以用jq .Id 形式取出,对于缩进的需要先访问上级然后继续访问3.2 容器操作
##1.创建并启动容器 # 基本运行 docker run nginx:latest # 后台运行 (-d) docker run -d nginx:latest # 端口映射 (-p 宿主机端口:容器端口) docker run -d -p 8080:80 nginx # 命名容器 (--name) docker run -d --name my-nginx -p 8080:80 nginx # 交互式运行 (-it) docker run -it ubuntu /bash docker container run过程⭐ ⭐ ⭐ ⭐ 1.查找本地是否有这个镜像,如果没有则先下载镜像. docker image pull 2. 下载完成,创建容器 docker container create,没有启动. 3. 启动容器docker container start 4.容器启动,进行访问 ##2 常用参数组合说明 参数 含义 -d 后台运行 -p 端口映射 -v 挂载卷或目录 --name 容器命名 -e 设置环境变量 --rm 容器退出后自动删除 -it 交互式终端(常用 -it bash) --restart=always 自动重启策略 --cpus=0.5 限制 CPU 核心数 -m 512m 限制内存 - 使用-p选项需要配置端口映射(内核转发) [root@docker01 ~]# tail -1 /etc/sysctl.conf #写入到文件最后即可 net.ipv4.ip_forward = 1 [root@docker01 ~]# sysctl -p net.ipv4.ip_forward = 1 ###3 查看容器 docker ps # 运行中的容器 docker ps -a # 所有容器(包括停止的) docker ps -q # 只显示容器 ID ##4 停止/启动/重启 docker stop my-nginx docker start my-nginx docker restart my-nginx docker pause my-nginx # 暂停进程 docker unpause my-nginx #发现问题 重启linux或docker服务后,容器处于关闭状态.类似于Linux的服务没有设置开机自 启动一样. [root@docker01 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@docker01 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 136786a7574d mysql:8.0-debian "docker-entrypoint.s…" About an hour ago Exited (255) About a minute ago 3306/tcp, 33060/tcp mysql_8.0 b3b80d16075c redis:6.0-alpine "docker-entrypoint.s…" 2 days ago Exited (255) About a minute ago 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis b2d728e7f6c5 nginx:1.24 "/docker-entrypoint.…" 2 days ago Exited (255) About a minute ago 0.0.0.0:80->80/tcp, :::80->80/tcp nginx_1.24 929f1979424f debian:bullseye "/bin/bash" 2 days ago Exited (255) About a minute ago debian_bulls_v4 baca538e8d4f debian:bullseye "sleep 5" 2 days ago Exited (0) 2 days ago debian_bulls_v3 fe4d725c4624 debian:bullseye "bash" 2 days ago Exited (0) 2 days ago debian_bulls_v2 d9a0d6d00498 debian:bullseye "bash" 2 days ago Exited (0) 2 days ago debian_bulls_v1 #解决方法 1. docker start 启动 2. docker run的时候设置容器重启策略 [root@docker01 ~]# docker start mysql_8.0 mysql_8.0 [root@docker01 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 136786a7574d mysql:8.0-debian "docker-entrypoint.s…" About an hour ago Up 5 seconds 3306/tcp, 33060/tcp mysql_8.0 ##方法2: [root@docker01 ~]# docker update --restart always nginx_1.24 debian_bulls_v4 redis mysql_8.0 nginx_1.24 debian_bulls_v4 redis mysql_8.0 ##5 删除容器 docker rm my-nginx # 删除已停止的容器 docker rm -f my-nginx # 强制删除运行中的容器 docker container prune # 删除所有停止的容器 #显示所有容器(-a)并只显示容器id (-q) docker ps -a -q #删除所有容器 docker rm -f docker ps -a -q docker ps -a -q |xargs docker rm -f [root@docker01 ~]# docker rm -f docker ps -a -q 1f13a9cd0fd5 88ba99dff313 [root@docker01 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ##6 查看日志 docker logs my-nginx # 查看全部日志 docker logs -f my-nginx # 实时跟踪日志 docker logs --tail 100 my-nginx # 最后100行 docker logs --since 1h my-nginx # 最近1小时 ##7 进入运行中的容器 # 推荐使用 exec(不推荐 attach) docker exec -it my-nginx bash # 若镜像带 bash docker exec -it my-nginx sh # 若只有 sh ##8 文件复制 # 从宿主机复制到容器 docker cp ./index.html my-nginx:/usr/share/nginx/html/ # 从容器复制到宿主机 docker cp my-nginx:/var/log/nginx/access.log . ##9 其他容器指令 - docker kill 用于结束指定的容器. stop无法关闭,可以使用kill. - docker top 查看容器中进程信息. docker top 容器名 docker top 容器名 -ef/-efL/aux - docker stats 查看所有容器的cpu,内存,磁盘,网络,进程信息.第四部分:Dockerfile 编写
1 基本指令
dockerfile指令含义应用建议dockerfile开头部分FROM指定基本镜像类似于 docker pull 下载镜像FROM ubuntu:20.04尽量少写ubuntu或ubuntu:latest,尽量指定具体的版本LABEL用于指定容器的属性信息,作者,个人联系方式(邮件)..LABEL maintainer="lidao996youjiu_linux@qq.com推荐使用LABEL,不推荐使用下面的MAINTAINERMAINTAINER不再使用,推荐使用LABEL 个人信息ENV用于创建Dockerfile中使用的变量ENV Tengine_Version空格2.3.3软件版本可以创建使用变量dockerfile中间处理部分RUN制作镜像过程中需要的执行命令,通常系统配置,服务配置,部署。但不能出现阻塞当前终端的命令RUN 系统命令即可不建议使用连续多个RUN,合并连续多个RUN.ADD可以把指定文件或目录拷贝到容器中(指定目录),会解压压缩包.相对于当前目录ADD restart.tar.gz空格/app/code/restar拷贝压缩包使用COPY可以把指定文件或目录拷贝到容器中(指定目录),不支持自动解压.相对于当前目录COPY nginx.conf空格/etc/nginx/nginx.conf拷贝文件或目录WORKDIR指定容器的默认工作目录.WORKDIR/app/code/restart/ADD restart.tar.gz空一般用于配合ADD,COPY需要书写容器中路径指令.Dockerfile中使用相对路径操作容器VOLUME挂载数据卷VOLUME/usr/share/nginx/html创建随机数据卷挂载容器的目录.未来推荐docker run的时候指定 -v即可.dockerfile结尾部分书写的内容EXPOSE指定镜像要对外暴露的端口EXPOSE 80用于指定一个或多个容器的端口.未来这个端口可以被-P识别.xxxx:80CMD用于指定容器的入口命令.入口命令可以在dockerrun的时候替换.==运行镜像启动容器的时候,容器默认运行的命令是什么.CMD ["命令","参数01","参数02"]CMD ["nginx","-g","daemon off;"]ENTRYPOINT用于指定容器的入口命令.无法被docker run替换,dockerrun指定的时候仅仅作为entrypoint命令的参数而已ENTRYPOINT["executable","param1", "param2"]使用不多
2.Dockerfile格式
[root@docker01 /app/docker/dockerfile/01-bird]# vim Dockerfile
###1.指定基础镜像
FROM nginx:1.24
##2.基本信息
LABEL author=gao url=delu7.cn
#3.把配置文件/压缩包内容传输到目录
ADD default.conf /etc/nginx/conf.d/default.conf
ADD bird.tar.gz /usr/share/nginx/html
## 4.对镜像进行操作 执行命令
RUN touch /tmp/test.txt
#5.告诉镜像使用者容器映射的是80端口 443端口
EXPOSE 80 443
##6.收尾 入口指令(运行容器后默认运行下面的命令)
CMD ["nginx","-g","daemon off;"]
---------------
####根据Dockerfile构建镜像
#注意: .表示 Dockerfile在当前目录下面 -t 就是给自定义镜像命名.
[root@docker01 /app/docker/dockerfile/01-bird]# docker build -t web:bird_v2_dk .
Sending build context to Docker daemon 95.23kB
Step 1/7 : FROM nginx:1.24
---> b6c621311b44
Step 2/7 : LABEL author=gao url=delu7.cn
---> Running in 920bb6bef8b6
Removing intermediate container 920bb6bef8b6
---> 1ead576ab3ab
Step 3/7 : ADD default.conf /etc/nginx/conf.d/default.conf
---> 00b7db438b65
Step 4/7 : ADD bird.tar.gz /usr/share/nginx.html
---> ee98bbdad431
Step 5/7 : RUN touch /tmp/test.txt
---> Running in b7c0427d20fb
Removing intermediate container b7c0427d20fb
---> aa71001b715e
Step 6/7 : EXPOSE 80 443
---> Running in 73af98d42ab4
Removing intermediate container 73af98d42ab4
---> 3d00978126e6
Step 7/7 : CMD ["nginx","-g","daemon off;"]
---> Running in 680c31c1a1e6
Removing intermediate container 680c31c1a1e6
---> 10f7eb0c1874
Successfully built 10f7eb0c1874
Successfully tagged web:bird_v2_dk
###运行
[root@docker01 /app/docker/dockerfile/01-bird]# docker images |grep bird
web bird_v2_dk 10f7eb0c1874 29 seconds ago 142MB
web bird_v1 3b8687b1e45f 3 days ago 142MB
[root@docker01 /app/docker/dockerfile/01-bird]# docker run -d --name bird_v2_Dk -p 80:80 web:bird_v2_dk
120efcd072ca83b0208d2bd2b1c23b48cc41031f57a662f703e155692b83fb48
[root@docker01 /app/docker/dockerfile/01-bird]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
120efcd072ca web:bird_v2_dk "/docker-entrypoint.…" 6 seconds ago Up 5 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp bird_v2_Dk
[root@docker01 ~]# docker exec -it bird_v2_Dk /bin/bash
root@120efcd072ca:/# ls -l /tmp/
total 0
-rw-r--r-- 1 root root 0 Apr 15 07:37 test.txt
- THE END -
最后修改:2026年4月29日
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://7d.delu7.cn/63/.html
共有 0 条评论