docker 入门到精通

2026-1-16 17 1/16

第一部分: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

  • 下载 Docker Desktop

  • 安装后启用 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="lidao996
    youjiu_linux@qq.com
    推荐使用
    LABEL,不推荐
    使用下面的
    MAINTAINER
    MAINTAINER
    不再使用,推荐使
    用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:80
    CMD
    用于指定容器的
    入口命令.入口命
    令可以在docker
    run的时候替
    换.==运行镜像
    启动容器的时候,
    容器默认运行的
    命令是什么.
    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 -
Tag:

delu

4月29日00:26

最后修改:2026年4月29日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论