保姆级 Docker 入门到进阶

1. 云时代必修课:从虚拟化到容器化

1.1 云服务模型 4 兄弟

缩写 全称 一句话记忆 典型产品
IaaS Infrastructure as a Service 只租"地皮",自己盖楼 ECS、EC2
PaaS Platform as a Service 拎包入住,专注写代码 SAE、GAE
SaaS Software as a Service 直接入住"精装修" 钉钉、飞书
DaaS Data as a Service 数据"外卖"送到家 MaxCompute、BigQuery

1.2 虚拟化技术速览

类型 代表 特点
全虚拟化 VMware 硬件级模拟,兼容性最强
半虚拟化 Xen 改内核,性能更高
硬件辅助 KVM 内核模块,云厂商最爱
轻量级 VirtualBox 本地开发神器

一句话:虚拟机是"整栋楼",容器是"乐高模块"。


2. Docker 是什么?为什么人人都在用?

2.1 官方金句

Build, Ship and Run Any App, Anywhere.

Docker 把应用 + 依赖 + 配置 + 运行时统一打包成"集装箱",实现:

  • 秒级启动

  • 跨云迁移

  • 环境一致性

  • 微服务友好

复制代码
大海(宿主机 OS)
 └─ 鲸鱼(Docker Engine)
     └─ 集装箱(Container)
         ├─ App1
         ├─ App2
         └─ App3

2.3 时间轴:Docker 大事件

年份 里程碑
2013 dotCloud 开源 Docker
2015 1.8 版发布,正式支持网络/卷插件
2017 分 CE & EE,拥抱 Kubernetes
2018 18.09 引入多阶段构建
2020 20.10 默认启用 cgroup v2
2023 23.x 增强云原生安全、CI/CD

3. 核心概念 30 秒速记

名词 类比 一句话
Image 只读"安装光盘" 类
Container 运行中的镜像 对象
Registry 镜像"应用商店" Docker Hub
Dockerfile 烹饪食谱 描述怎么构建镜像
Layer 千层蛋糕 每层可复用、可缓存

4. 5 分钟极速安装(CentOS 7/8 通用)

关闭防火墙

复制代码
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0

安装依赖包

复制代码
# 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 安装阿里云的镜像
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装Docker-CE并设置开机自启
yum install -y docker-ce docker-ce-cli containerd.io
# 注意:如果是指定版本docker-ce-20.10.18
systemctl start docker.service
systemctl enable docker.service

镜像加速下载

镜像下载可能会因为网络原因而比较慢,尤其是国内用户。这里给出了几种加速镜像下载的方法。

**阿里云加速器**:

复制代码
# 创建文件夹
mkdir -p /etc/docker
# 将镜像源写入
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://ae3f5qei.mirror.aliyuncs.com"]
}
EOF

# 加载并重启
systemctl daemon-reload
systemctl restart docker

作用:配置 Docker 使用阿里云镜像加速器来提高镜像下载速度。

华为加速器:

复制代码
```bash
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [ "https://0a40cefd360026b40f39c00627fa6f20.mirror.swr.myhuaweicloud.com" ]
}
EOF
```

# 加载并重启
systemctl daemon-reload
systemctl restart docker

作用:配置 Docker 使用华为云镜像加速器。

国外小网站加速器 国外:

复制代码
{
  "registry-mirrors": ["https://hub.littlediary.cn/"]
}

# 加载并重启
systemctl daemon-reload
systemctl restart docker

国外小网站2

复制代码
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
 "registry-mirrors": ["http://43.163.206.59:9211"] 
}
EOF

# 加载并重启
systemctl daemon-reload
systemctl restart docker

作用:使用一个国外小网站作为加速器,适用于国内网络环境下下载速度较慢的情况。

重启镜像源

复制代码
[root@docker ~]# systemctl daemon-reload 
[root@docker ~]# systemctl restart docker

2.1.4 查看镜像信息

复制代码
cat /var/lib/docker/image/overlay2/repositories.json

作用:查看 Docker 本地镜像的详细信息。`/var/lib/docker` 是 Docker 存储所有数据的目录,镜像存储在 `image` 目录下的 `overlay2` 子目录中。

获取镜像

复制代码
[root@docker ~]# docker pull nginx

作用 :从 Docker Hub 拉取 nginx 镜像,默认下载最新(latest)版本。如果你不指定标签(tag),则会下载默认的 latest 标签的镜像

tag指定标签

复制代码
[root@docker ~]# docker tag nginx:latest nginx:web
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    41f689c20910   6 weeks ago   192MB
nginx        web       41f689c20910   6 weeks ago   192MB

注意:镜像不能重复创建,否则会报错

还有centos的镜像

docker pull centos:7

复制代码
[root@localhost opt]# docker pull centos:7
7: Pulling from library/centos
2d473b07cdd5: Pull complete 
Digest: sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
Status: Downloaded newer image for centos:7
docker.io/library/centos:7

查看镜像信息**

复制代码
[root@docker ~]# cat /var/lib/docker/image/overlay2/repositories.json
{"Repositories":{"nginx":{"nginx:latest":"sha256:41f689c209100e6cadf3ce7fdd02035e90dbd1d586716bf8fc6ea55c365b2d81","nginx:web":"sha256:41f689c209100e6cadf3ce7fdd02035e90dbd1d586716bf8fc6ea55c365b2d81","nginx@sha256:d5f28ef21aabddd098f3dbc21fe5b7a7d7a184720bc07da0b6c9b9820e97f25e":"sha256:41f689c209100e6cadf3ce7fdd02035e90dbd1d586716bf8fc6ea55c365b2d81"}}}[root@docker ~]# 
  • **作用**:查看 Docker 本地镜像的详细信息。`/var/lib/docker` 是 Docker 存储所有数据的目录,镜像存储在 `image` 目录下的 `overlay2` 子目录中。
**查看本地所有镜像**:
复制代码
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    41f689c20910   6 weeks ago   192MB

REPOSITORY:镜像属于的仓库;

TAG:镜像的标签信息,标记同一个仓库中的不同镜像;

IMAGE ID:镜像的唯一ID 号,唯一标识一个镜像;

CREATED:镜像创建时间;

VIRTUAL SIZE:镜像大小;


  • **作用**:列出所有已经下载到本地的镜像,包括仓库名称、标签、镜像 ID、创建时间和大小等信息。

查看镜像详细信息

复制代码
[root@docker ~]# docker inspect  41f689c20910
[
    {
        "Id": "sha256:41f689c209100e6cadf3ce7fdd02035e90dbd1d586716bf8fc6ea55c365b2d81",
        "RepoTags": [
            "nginx:latest"
        ],
        "RepoDigests": [
            "nginx@sha256:d5f28ef21aabddd098f3dbc21fe5b7a7d7a184720bc07da0b6c9b9820e97f25e"
        ],
        "Parent": "",
        "Comment": "buildkit.dockerfile.v0",
        "Created": "2025-08-13T16:34:01Z",
        "DockerVersion": "",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.29.1",
                "NJS_VERSION=0.9.1",
                "NJS_RELEASE=1~bookworm",
                "PKG_RELEASE=1~bookworm",
                "DYNPKG_RELEASE=1~bookworm"
            ],
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
            ],
            "Image": "",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGQUIT"
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 192385289,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/5929715a7c3153b006d02a65403617a45c10f5d3019a00c8d904c7d867205191/diff:/var/lib/docker/overlay2/d5a52e2ab95750f8866ae934435a13dc5063dce4366c70b496908e168098e54a/diff:/var/lib/docker/overlay2/0a46c58658e585734a2e64d8aba789dce0a47a7863913b3b9ce249e509ecaeda/diff:/var/lib/docker/overlay2/bfa7e14336f622d61aad9bd58b67f17ca8f236cff4874014bdacc997450de0cd/diff:/var/lib/docker/overlay2/b6e4f89de63cd408aafd9d748cf21869112d5932346598418cbbd80936cbbe48/diff:/var/lib/docker/overlay2/7f413123b7bf0c9dab1f2a14f33b646399f21bdc526d5a49b92f9ecb372a33ae/diff",
                "MergedDir": "/var/lib/docker/overlay2/74b5fd8fbe7d1738e72d44226423f76c4d952f2f9d2996c1b472348fa46b0272/merged",
                "UpperDir": "/var/lib/docker/overlay2/74b5fd8fbe7d1738e72d44226423f76c4d952f2f9d2996c1b472348fa46b0272/diff",
                "WorkDir": "/var/lib/docker/overlay2/74b5fd8fbe7d1738e72d44226423f76c4d952f2f9d2996c1b472348fa46b0272/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:36f5f951f60a9fa1d51878e76fc16ba7b752f4d464a21b758a8ac88f0992c488",
                "sha256:c855abf10cdcf792853d61ec842e41c85cb82a5cb926c86217a7fa632dfc56c4",
                "sha256:8e7d6b51107830934d3dcdcf0883f193250d22b3d0dc7a2d7d57e4403d1a3489",
                "sha256:50da593f622278859c89ed290484a8cafa3ddb1fef0090530fff63c9de06845f",
                "sha256:72fa904a482c9806187aeb804837f58f54da8aeb564f0ce4ef01426e08f68a01",
                "sha256:7d95a4a72e110d4fe6bab4059f2d2968058c8006d0f3976ea7065186acc49fbd",
                "sha256:3ce214e9ebc59367731dc352744c8392822aceddcee0a3806537dfd9fa984268"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

删除镜像

格式:

复制代码
docker rmi 仓库名称:标签                #当一个镜像有多个标签时,只是删除其中指定的标签

或者

复制代码
docker rmi 镜像ID号                        #会彻底删除该镜像

示例

复制代码
[root@docker ~]# docker rmi -f 41f689c20910
Untagged: nginx:latest
Untagged: nginx:web
Untagged: nginx@sha256:d5f28ef21aabddd098f3dbc21fe5b7a7d7a184720bc07da0b6c9b9820e97f25e
Deleted: sha256:41f689c209100e6cadf3ce7fdd02035e90dbd1d586716bf8fc6ea55c365b2d81
Deleted: sha256:6d03e4aefb16ea9e0d73cacb9a9fcb8f7fb3a806c41606600cab179aa381550f
Deleted: sha256:0951af45805a90677b83c3e3ae0ff7c1d6114b796206381914d1976df19d5af7
Deleted: sha256:dfa09858601e1678c6300924eeb880cbe0070bd41b3cc1bd8245f39104f1c8d7
Deleted: sha256:0502b463a609459d9b7bbd8044fd58e77f4309818da8841029dbf638a3a1581e
Deleted: sha256:39ffa72f273801580dbcd954e125f78fd5bb430896c32ab303667c5bbf154f39
Deleted: sha256:e57750b7e7ad7cb2436b3e9d3aafa338e89ee68f50d7e63bc09af37166ebc68e
Deleted: sha256:36f5f951f60a9fa1d51878e76fc16ba7b752f4d464a21b758a8ac88f0992c488
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。

复制代码
docker rmi nginx:web
  • **作用**:删除指定标签的镜像。注意:如果镜像有多个标签,删除指定标签不会删除镜像本身,只有在没有其他标签和容器依赖的情况下才会彻底删除镜像。如果镜像正在被容器使用,需要先删除容器。

存储镜像(导出)

复制代码
[root@docker ~]# docker save -o nginx.tar nginx:latest 
[root@docker ~]# ls
anaconda-ks.cfg  initial-setup-ks.cfg  nginx.tar
  • **作用**:将本地镜像 `nginx:latest` 保存为 tar 包(`nginx.tar`)。这可以用于镜像备份或迁移。

镜像导入

复制代码
# 将镜像从192.168.10.150传到192.168.10.160
[root@docker ~]# scp nginx.tar root@192.168.10.160:/opt/
root@192.168.10.160's password: 
nginx.tar                                                                                          100%  187MB  39.8MB/s   00:04    

192.168.10.160

复制代码
[root@localhost ~]# docker load < /opt/nginx.tar 
Loaded image: nginx:latest
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    41f689c20910   6 weeks ago   192MB
centos       7         eeb6ee3f44bd   4 years ago   204MB

和192.168.10.150的镜像是一样的

或者:

复制代码
docker load -i nginx.tar
  • 两种方法记一个就行了

  • **作用**:同上,导入镜像文件。

上传镜像到 Docker Hub

镜像总结

目的 命令 备注
搜索 docker search nginx(已经无法使用) 看星级
拉取 docker pull nginx:1.25 带标签更稳
列表 docker images 看大小/ID
详情 docker inspect 镜像ID JSON 全量字段
打标签 docker tag nginx:1.25 yourhub/nginx:prod 多标签 0 复制
导出 docker save -o nginx.tar nginx:1.25 离线备份
导入 docker load -i nginx.tar 任意机器恢复
上传 docker push yourhub/nginx:prod 先 docker login
删除 docker rmi yourhub/nginx:prod 先删容器再删镜像

Docker 容器操作

**容器创建:就是将镜像加载到容器的过程。**

**新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。**

创建容器

格式:docker create 选项 镜像

常用选项:

-i:让容器开启标准输入

-t:让 Docker 分配一个伪终端 tty

-it :合起来实现和容器交互的作用,运行一个交互式会话 shell

复制代码
[root@localhost ~]# docker create -it nginx:latest
d7a61334647d3cb40036b525ccf4bbe24b1740b94bfe49289371c4e7eb3650ac

启动端口:

复制代码
[root@localhost ~]# docker start d7a61334647d
d7a61334647d
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED             STATUS          PORTS     NAMES
d7a61334647d   nginx:latest   "/docker-entrypoint...."   About an hour ago   Up 18 seconds   80/tcp    nostalgic_jepsen

停止端口:

复制代码
[root@localhost ~]# docker stop d7a61334647d
d7a61334647d
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED             STATUS                     PORTS     NAMES
d7a61334647d   nginx:latest   "/docker-entrypoint...."   About an hour ago   Exited (0) 3 seconds ago             nostalgic_jepsen

创建并启动容器

可以直接执行 docker run 命令, 等同于先执行 docker create 命令,再执行 docker start 命令。**

注意:容器是一个与其中运行的 shell 命令共存亡的终端,命令运行容器运行, 命令结束容器退出。

docker 容器默认会把容器内部第一个进程,也就是 pid=1 的程序作为docker容器是否正在运行的依据,如果docker容器中 pid = 1 的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉。**

​ 容器的生命周期包括创建、启动、停止、重启、删除等操作。容器会根据其进程的状态自动结束,例如当容器中的 PID=1 的进程退出时,容器也会停止。

复制代码
[root@localhost ~]# docker run centos:7 /usr/bin/bash -c ls /
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                      PORTS     NAMES
bdffbb873a90   centos:7       "/usr/bin/bash -c ls..."   18 seconds ago   Exited (0) 16 seconds ago             peaceful_kepler
ecf5b136f2cc   centos:7       "/bin/bash"               4 minutes ago    Created                               hungry_pike
d7a61334647d   nginx:latest   "/docker-entrypoint...."   2 hours ago      Exited (0) 22 minutes ago             nostalgic_jepsen

后台持续运行某一个进程

复制代码
[root@localhost ~]# docker run -d centos:7 /usr/bin/bash -c "while true;do echo hello;done"
72c56c6afc390a591b3e7cf4c6bb6040158dbc55561ba42383b02c5bbb3fc7cc
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS                      PORTS     NAMES
72c56c6afc39   centos:7       "/usr/bin/bash -c 'w..."   6 seconds ago   Up 5 seconds                          quirky_ramanujan
bdffbb873a90   centos:7       "/usr/bin/bash -c ls..."   3 minutes ago   Exited (0) 3 minutes ago              peaceful_kepler
ecf5b136f2cc   centos:7       "/bin/bash"               7 minutes ago   Created                               hungry_pike
d7a61334647d   nginx:latest   "/docker-entrypoint...."   2 hours ago     Exited (0) 26 minutes ago             nostalgic_jepsen

此时cpu已经满了

创建容器并持续运行

复制代码
[root@localhost ~]# docker run -itd --name zcx centos:7 /bin/bash
c39491b01187d838439925416007fafeb00c44b714f2ba26974d8a59f9b8bb03
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                      PORTS     NAMES
c39491b01187   centos:7       "/bin/bash"               10 seconds ago   Up 9 seconds                          zcx
bdffbb873a90   centos:7       "/usr/bin/bash -c ls..."   9 minutes ago    Exited (0) 8 minutes ago              peaceful_kepler
ecf5b136f2cc   centos:7       "/bin/bash"               13 minutes ago   Created                               hungry_pike
d7a61334647d   nginx:latest   "/docker-entrypoint...."   2 hours ago      Exited (0) 31 minutes ago             nostalgic_jepsen

容器交互:

复制代码
[root@localhost ~]# docker exec -it c39491b01187 bash
[root@c39491b01187 /]# 

进入容器前确保运行,退出后仍然运行

复制代码
[root@localhost ~]# docker exec -it zcx bash
[root@c39491b01187 /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@c39491b01187 /]# exit
exit
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                      PORTS     NAMES
c39491b01187   centos:7       "/bin/bash"               7 minutes ago    Up 7 minutes                          zcx
bdffbb873a90   centos:7       "/usr/bin/bash -c ls..."   16 minutes ago   Exited (0) 15 minutes ago             peaceful_kepler
ecf5b136f2cc   centos:7       "/bin/bash"               20 minutes ago   Created                               hungry_pike
d7a61334647d   nginx:latest   "/docker-entrypoint...."   2 hours ago      Exited (0) 38 minutes ago             nostalgic_jepsen

但是不加 -d 选项会创建容器后直接进入容器,但是退出容器,容器也会停止

复制代码
[root@localhost ~]#  docker run -it centos:7 bash
[root@7d7abe2445b6 /]# exit
exit
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                      PORTS     NAMES
7d7abe2445b6   centos:7       "bash"                    8 seconds ago    Exited (0) 2 seconds ago              tender_lehmann
c39491b01187   centos:7       "/bin/bash"               10 minutes ago   Up 10 minutes                         zcx
bdffbb873a90   centos:7       "/usr/bin/bash -c ls..."   19 minutes ago   Exited (0) 19 minutes ago             peaceful_kepler
ecf5b136f2cc   centos:7       "/bin/bash"               23 minutes ago   Created                               hungry_pike
d7a61334647d   nginx:latest   "/docker-entrypoint...."   2 hours ago      Exited (0) 42 minutes ago             nostalgic_jepsen

复制

复制到容器

复制代码
[root@localhost ~]#  echo abc123 > ~/test.txt
[root@localhost ~]# docker cp ~/test.txt c39491b01187:/opt
Successfully copied 2.05kB to c39491b01187:/opt

从容器中复制到主机里面

复制代码
[root@localhost ~]# docker cp c39491b01187:/opt/test.txt ~/abc123.txt
Successfully copied 2.05kB to /root/abc123.txt
[root@localhost ~]# ls
abc123.txt  anaconda-ks.cfg  initial-setup-ks.cfg  test.txt

注意:在主机中运行,因为容器没装docker镜像

容器的导入和导出

导出

复制代码
[root@localhost ~]# docker export c39491b01187 > centos7.tar
[root@localhost ~]# ls
abc123.txt  anaconda-ks.cfg  centos7.tar  initial-setup-ks.cfg  test.txt

导入

复制代码
[root@docker opt]# cat centos7.tar|docker import - centos7:test
sha256:23f2ec66dd541fd739ffe47dce13c9ccb318db28302716b3a0748cf0a3145d0d
[root@docker opt]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
centos7      test      23f2ec66dd54   7 seconds ago   204MB
nginx        latest    41f689c20910   6 weeks ago     192MB

删除端口

复制代码
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED        STATUS                    PORTS     NAMES
7d7abe2445b6   centos:7       "bash"                    11 hours ago   Exited (0) 11 hours ago             tender_lehmann
c39491b01187   centos:7       "/bin/bash"               11 hours ago   Up 6 seconds                        zcx
bdffbb873a90   centos:7       "/usr/bin/bash -c ls..."   11 hours ago   Exited (0) 11 hours ago             peaceful_kepler
ecf5b136f2cc   centos:7       "/bin/bash"               12 hours ago   Created                             hungry_pike
d7a61334647d   nginx:latest   "/docker-entrypoint...."   13 hours ago   Exited (0) 12 hours ago             nostalgic_jepsen
[root@localhost ~]# docker rm zcx
Error response from daemon: cannot remove container "/zcx": container is running: stop the container before removing or force remove
[root@localhost ~]# docker rm  tender_lehmann
tender_lehmann

注意:无法删除正在运行的端口,除非rm -f强制删除

复制代码
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED        STATUS                    PORTS     NAMES
c39491b01187   centos:7       "/bin/bash"               11 hours ago   Up 56 seconds                       zcx
bdffbb873a90   centos:7       "/usr/bin/bash -c ls..."   12 hours ago   Exited (0) 12 hours ago             peaceful_kepler
ecf5b136f2cc   centos:7       "/bin/bash"               12 hours ago   Created                             hungry_pike
d7a61334647d   nginx:latest   "/docker-entrypoint...."   13 hours ago   Exited (0) 12 hours ago             nostalgic_jepsen
[root@localhost ~]# docker rm -f zcx
zcx

删除端口的小妙招

复制代码
docker stop 2592d3fad0fb
docker rm 2592d3fad0fb				#删除已经终止状态的容器

docker rm -f 2592d3fad0fb			#强制删除正在运行的容器

docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash			#批量停止容器
docker ps -a | awk 'NR>=2{print $1}'| xargs docker stop

docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash				#批量删除所有容器
docker ps -a | awk 'NR>=2{print $1}'| xargs docker rm

docker images | awk 'NR>=2{print "docker rmi "$3}'| bash			#批量删除镜像
docker images | grep none | awk '{print $3}' | xargs docker rmi		#删除none镜像

docker rm $(docker ps -a -q)		#批量清理后台停止的容器

容器生命周期 10 连招

场景 命令
创建 docker create -it --name web nginx
启动 docker start web
停止 docker stop web
重启 docker restart web
删除 docker rm -f web
一次性 docker run --rm -it ubuntu:22.04 bash
后台守护 docker run -d --name blog nginx
进入终端 docker exec -it web bash
看日志 docker logs -f --tail 200 web
批量清退 docker rm -f $(docker ps -aq)

Docker 网络 5 大原生模式

Docker 网络实现原理

Docker 用虚拟网桥 docker0 为容器分配内部 IP,同主机容器可直接互通;外部无法直接访问 Container-IP,需把容器端口映射到宿主机(-p 或 -P),通过"宿主机 IP:映射端口"访问。随机映射口如果没有被定义,需要

复制代码
[root@docker opt]# docker run -d --name test1 -P nginx  #随机映射端口(从32768开始)
46b35bea28f517beb46d82df609a5d9bfe9af770e97a4aa4f53a869c05736760
[root@docker opt]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS         PORTS                                     NAMES
46b35bea28f5   nginx     "/docker-entrypoint...."   10 seconds ago   Up 7 seconds   0.0.0.0:32768->80/tcp, :::32768->80/tcp   test1

登录:

随机映射口之后会不断增加

复制代码
[root@docker opt]# docker run -d --name test2 -p 43000:80 nginx
b573f31a91c77681190cd8136fab8e5c4e169f605d01202f68807e187087fbb2
[root@docker opt]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS                                     NAMES
b573f31a91c7   nginx     "/docker-entrypoint...."   4 seconds ago    Up 2 seconds    0.0.0.0:43000->80/tcp, :::43000->80/tcp   test2
46b35bea28f5   nginx     "/docker-entrypoint...."   10 minutes ago   Up 10 minutes   0.0.0.0:32768->80/tcp, :::32768->80/tcp   test1

登录

复制代码
#查看容器的输出和日志信息
docker logs 容器的ID/名称
[root@docker opt]# docker logs test1  # 启动日志

host

Docker 默认给容器独立 Network Namespace(含虚拟网卡、IP),类似 VMware 桥接但无对外可见的独立 IP;若加 --network host,则容器与宿主机共用网络栈,不再隔离。

container模式

容器 --network container:NAME 与指定容器共用 Network Namespace,IP、端口、lo 网卡共享,其余仍隔离。

案例:

复制代码
[root@localhost opt]# docker run -itd --name test1 centos:7 /bin/bash
5949f185e29a335f7d796561d31afd6badf534eaacf30ea10a9bba6832da3057
[root@localhost opt]# docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS          PORTS     NAMES
5949f185e29a   centos:7   "/bin/bash"   16 seconds ago   Up 14 seconds             test1
[root@localhost opt]# docker inspect -f '{{.State.Pid}}' test1
11276
[root@localhost opt]# docker inspect -f '{{.State.Pid}}' 5949f185e29a
11276
[root@localhost opt]# ls -l /proc/11276/ns
总用量 0
lrwxrwxrwx. 1 root root 0 9月  27 15:11 ipc -> ipc:[4026532565]
lrwxrwxrwx. 1 root root 0 9月  27 15:11 mnt -> mnt:[4026532563]
lrwxrwxrwx. 1 root root 0 9月  27 15:08 net -> net:[4026532568]
lrwxrwxrwx. 1 root root 0 9月  27 15:11 pid -> pid:[4026532566]
lrwxrwxrwx. 1 root root 0 9月  27 15:11 user -> user:[4026531837]
lrwxrwxrwx. 1 root root 0 9月  27 15:11 uts -> uts:[4026532564]

创建

复制代码
[root@localhost opt]# docker run -itd --name test2 --net=container:test1 centos:7 /bin/bash
21d8ff6c2d797c896fe299b0f1807c379a57333a8a8263173914e5653b7ee8f7
[root@localhost opt]#  docker inspect -f '{{.State.Pid}}' test2
11506
[root@localhost opt]# ls -l /proc/11506/ns
总用量 0
lrwxrwxrwx. 1 root root 0 9月  27 15:19 ipc -> ipc:[4026532635]
lrwxrwxrwx. 1 root root 0 9月  27 15:19 mnt -> mnt:[4026532633]
lrwxrwxrwx. 1 root root 0 9月  27 15:19 net -> net:[4026532568]
lrwxrwxrwx. 1 root root 0 9月  27 15:19 pid -> pid:[4026532636]
lrwxrwxrwx. 1 root root 0 9月  27 15:19 user -> user:[4026531837]
lrwxrwxrwx. 1 root root 0 9月  27 15:19 uts -> uts:[4026532634]

查看可以发现两个容器的 net user编号相同

无网络模式(none)

容器只带"单机"网卡(lo),没有 eth0、没有 IP、没有路由,彻底断网,外面进不来,它也出不去。

桥接模式

Docker 默认给每个容器"虚拟一台小电脑"------自己独占 IP、网卡,再通过宿主机上的软件交换机 docker0 和 iptables 做 NAT,容器之间、容器与宿主机就能互相通信,也能主动上网;外部想访问容器,就通过 -p 把宿主机端口映射进去即可。

自定义模式

自定义网络模式,docker提供了三种自定义网络驱动: bridge overlay macvlan

用自定义网络(bridge/overlay/macvlan)代替默认 bridge:

  • 跨机通信选 overlay/macvlan

  • 自动 DNS、隔离更细、运维更清爽

本机的docker地址为127.17.0.1

直接使用bridge模式,是无法支持指定IP运行docker的,例如执行以下命令就会报错

复制代码
[root@localhost opt]# docker run -itd --name test3 --network bridge --ip 172.17.0.1 centos:7 /bin/bash
docker: Error response from daemon: invalid config for network bridge: invalid endpoint settings:
user specified IP address is supported on user defined networks only.
See 'docker run --help'.

创建自定义网络

复制代码
[root@localhost opt]# docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1"  mynetwork
22aef1372612a8442da213cc58b35d4cd5e5c20d9ba14cc2fcc66ff9827652ae
[root@localhost opt]# docker run -itd --name test4 --net mynetwork --ip 172.18.0.10 centos:7 /bin/bash
299416e30ee77c05810156ef1137c0e1079de7e98beb069424232298537cfdb9
[root@localhost opt]# docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED             STATUS                       PORTS     NAMES
299416e30ee7   centos:7   "/bin/bash"   16 seconds ago      Up 14 seconds                          test4
21d8ff6c2d79   centos:7   "/bin/bash"   57 minutes ago      Exited (137) 3 minutes ago             test2
5949f185e29a   centos:7   "/bin/bash"   About an hour ago   Exited (137) 3 minutes ago             test1

总结:

模式 参数 特点 适用场景
bridge --net bridge 默认 NAT 网络,端口映射 单主机通用
host --net host 共用宿主机网络,无端口映射 高性能
none --net none 仅有 lo 口,完全隔离 安全沙箱
container --net container:NAME 与指定容器共享网络 侧车(Sidecar)
自定义 --net mynet 可固定 IP、自动 DNS 多项目隔离

CPU 资源限制

设置 CPU 使用率上限

复制代码
[root@localhost opt]# docker run -itd --name test3 --cpu-quota 50000 centos:7 /bin/bash
19ede3ab4cb43e37df79959fec35019a65fae821d675061fb2b9082ed7b4cc64

同样也可以这样写,简便一点

复制代码
[root@localhost opt]# docker run -itd --name cputest --cpus='0.5' centos:7 /bin/bash
3841c43eae815d89bc2716773f4ea31177bccc7cedec7fb0eca9b7a46c765e6b
[root@localhost opt]# docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED             STATUS                        PORTS     NAMES
3841c43eae81   centos:7   "/bin/bash"   9 seconds ago       Up 7 seconds                            cputest
19ede3ab4cb4   centos:7   "/bin/bash"   7 minutes ago       Up 7 minutes                            test3
299416e30ee7   centos:7   "/bin/bash"   17 minutes ago      Up 17 minutes                           test4
21d8ff6c2d79   centos:7   "/bin/bash"   About an hour ago   Exited (137) 21 minutes ago             test2
5949f185e29a   centos:7   "/bin/bash"   About an hour ago   Exited (137) 21 minutes ago             test1

设置 CPU 占用比

原理:--cpu-shares` 指定相对权重(默认 1024),仅在 CPU 争用时生效(不是硬限制)。

复制代码
[root@localhost opt]# docker run -itd --name c1 --cpu-shares 512 centos:7
b6bdedc03f1935e639416aacbc8a8f1cb4decb0f40d3e21491b061ba04cf1abd
[root@localhost opt]# docker run -itd --name c2 --cpu-shares 1024 centos:7
7af26bd78f33c5ca61676c36226083c18ccad1b09c0212674f74d696b72e7eaa

如果要验证,先让两个容器同时跑满 1 核(制造争抢),然后查看CPU的分配,验证此处省略

测试方法1

复制代码
[root@docker ~]# docker inspect -f '{{.HostConfig.CpuShares}}' c1
512
[root@docker ~]# docker inspect -f '{{.HostConfig.CpuShares}}' c2
1024

测试方法2

进入c1并写一个死循环运行

复制代码
[root@docker ~]# docker exec -it c1 bash
[root@8770b1331f51 /]# vi c1.sh
# 在容器内执行(会占用1个CPU核心满负荷运行)
# while :; do :; done &
[root@8770b1331f51 /]# chmod +x c1.sh 
[root@8770b1331f51 /]# sh c1.sh 

进入另一台机子并写一个死循环

复制代码
[root@docker ~]# docker exec -it c2 bash
[root@4539a7dce369 /]# vi c2.sh
# 在容器内执行(会占用1个CPU核心满负荷运行)
# while :; do :; done &
[root@4539a7dce369 /]# chmod +x c2.sh 
[root@4539a7dce369 /]# sh c2.sh 

测试它的状态

复制代码
[root@docker ~]# docker stats c1 c2

CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O       BLOCK I/O     PIDS
8770b1331f51   c1        32.78%    1MiB / 1.776GiB     0.05%     2.43kB / 0B   0B / 6.14kB   3
4539a7dce369   c2        65.18%    620KiB / 1.776GiB   0.03%     656B / 0B     0B / 6.14kB   2

绑定指定 CPU

用途:把容器进程绑定到宿主机的指定 CPU 核上(硬亲和性)。

示例:将容器绑定到第 0和第 1 个核(本机只有两个内核):

复制代码
[root@localhost opt]# docker run -itd --name test7 --cpuset-cpus "0,1" centos:7 /bin/bash
7c953f502bb35516a15fa483088a79869e10d44acc565e9fd7e06fa7dc88abd6
[root@localhost opt]# lscpu | grep '^CPU(s):'
CPU(s):                2
[root@localhost opt]# cat /proc/cpuinfo | grep processor
processor	: 0
processor	: 1

压力测试

在容器内创建一个繁忙循环脚本:

复制代码
  # /cpu.sh
  #!/bin/bash
  i=0
  while true; do let i++; done

在容器内运行 `./cpu.sh`,在宿主机观察 `top` 与 `docker stats`:

复制代码
 docker exec -it <container> bash
  • 分别进入容器,进行压力测试

    复制代码
    yum install -y epel-release
    yum install -y stress
    stress -c 4                #产生四个进程,每个进程都反复不停的计算随机数的平方根

内存使用限制

**基础选项**

  • `-m, --memory`:限制容器可用的物理内存(例如 `-m 512m`)。

  • `--memory-swap`:限制容器可用的物理内存 + swap 总量(必须与 `-m` 一起使用以明确 swap 上限)。

示例命令

复制代码
[root@localhost ~]# docker run -itd --name test8 -m 512m centos:7 /bin/bash
8b5eabd7feeba700610d367c381ef5502fd4983e5455fca751279d79f0a9c441

或者

复制代码
[root@localhost ~]# docker run -itd --name test8b -m 300m --memory-swap=1g centos:7
1b0a27037d9fc2020b656ec91db5dae00766c869cb778208365f654a002697ed

test8的验证

复制代码
[root@localhost 8b5eabd7feeba700610d367c381ef5502fd4983e5455fca751279d79f0a9c441]#   cat memory.limit_in_bytes
536870912
[root@localhost 8b5eabd7feeba700610d367c381ef5502fd4983e5455fca751279d79f0a9c441]#  cat memory.usage_in_bytes
417792

test8b的验证

复制代码
[root@localhost 1b0a27037d9fc2020b656ec91db5dae00766c869cb778208365f654a002697ed]#   cat memory.limit_in_bytes
314572800
[root@localhost 1b0a27037d9fc2020b656ec91db5dae00766c869cb778208365f654a002697ed]#  cat memory.usage_in_bytes
417792
[root@localhost 1b0a27037d9fc2020b656ec91db5dae00766c869cb778208365f654a002697ed]# cat memory.memsw.limit_in_bytes
1073741824

磁盘 IO(blkio / io)控制

  • Docker 提供对块设备读写带宽与 IOPS 的限制选项(基于 cgroups 的 blkio 控制器)。

  • 注意:在 cgroup v2 中,blkio 功能被 `io` 控制器取代,语义与文件名有所不同(如果你运行的是较新内核/系统,请参考对应 cgroup 版本文档)。

    常用 Docker 参数(blkio)

    • --device-read-bps /dev/sda:1M:限制设备上读速率为 1 MB/s。
    • --device-write-bps /dev/sda:1M:限制写速率为 1 MB/s。
    • --device-read-iops /dev/sda:100:限制读 IOPS(次数)。
    • --device-write-iops /dev/sda:100:限制写 IOPS(次数)。

示例:

复制代码
[root@localhost ~]# docker run -it --name test10 --device-write-bps /dev/sda:1MB centos:7 /bin/bash
[root@1f2b58c43de3 /]#

验证:

进入容器中交互

复制代码
[root@1f2b58c43de3 /]# dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.0294779 s, 356 MB/s

清理 Docker 占用的磁盘空间(补充)

复制代码
[root@localhost ~]#  docker system prune -a
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all images without at least one container associated to them
  - all build cache

Are you sure you want to continue? [y/N] y
Deleted Containers:
1f2b58c43de307b67aa7fa9e98b1314fe3d71cddcb044556c14b901a017966ef

Deleted Networks:
mynetwork

Total reclaimed space: 10.49MB

一般谨慎使用

一般谨慎使用

一般谨慎使用

常见命令速查(快速摘录)

复制代码
# CPU
docker run -itd --name c1 --cpu-shares 512 centos:7
docker run -itd --name c2 --cpu-quota 50000 centos:7
docker run -itd --name c3 --cpuset-cpus "1,3" centos:7
docker run -itd --name c4 --cpus="0.5" centos:7

# 内存
docker run -itd --name memtest -m 512m centos:7
docker run -itd --name memtest2 -m 300m --memory-swap=1g centos:7

# blkio
docker run -it --name iotest --device-write-bps /dev/sda:1MB centos:7

# 监控/验证
docker stats
docker exec -it <container> bash
cat /sys/fs/cgroup/cpu/docker/<container-id>/cpu.cfs_quota_us
cat /sys/fs/cgroup/memory/docker/<container-id>/memory.limit_in_bytes

# 清理
docker system prune -a

数据卷容器 (Data Volumes Containers)

定义

数据卷是 Docker 中一种专门为容器提供持久化存储的机制。它是容器内部的特殊目录,可以与宿主机或其他容器共享数据。通过使用数据卷,容器可以在其生命周期内访问和修改数据,而不会影响镜像本身。这样一来,数据卷能够保持数据持久性,即使容器被删除或重建,数据依然能够保留。

复制代码
[root@localhost ~]# docker run -v /var/www:/data1 --name web1 -it centos:7 /bin/bash
[root@115cad3b9377 /]# 

进入容器后,可以在 `/data1` 目录下创建文件:

复制代码
[root@115cad3b9377 /]# echo "this is web1" > /data1/abc.txt

此时,容器中的 `/data1/abc.txt` 文件与宿主机中的 `/var/www/abc.txt` 文件是同步的。即使容器退出,宿主机上的数据依然存在

数据卷容器

数据卷容器是一种专门用于共享数据的容器,它不是用于运行应用程序的容器,而是仅仅提供一个数据卷,供其他容器挂载并使用。这种方式常用于多个容器共享数据,避免数据丢失或重复管理。

创建数据卷容器

复制代码
[root@localhost ~]# docker run --name web02 -v /data1 -v /data2 -it centos:7 /bin/bash

写入数据

复制代码
[root@c02fd180a6e4 /]# echo "this is web2" > /data1/abc.txt
[root@c02fd180a6e4 /]# echo "THIS IS WEB2" > /data2/ABC.txt
[root@c02fd180a6e4 /]# cat /data1/abc.txt 
this is web2
[root@c02fd180a6e4 /]# cat /data2/ABC.txt 
THIS IS WEB2

使用 `--volumes-from` 共享数据卷

复制代码
[root@localhost ~]# docker run -it --volumes-from web02 --name web3 centos:7 /bin/bash
[root@44a3577aa837 /]# 

进入web3里面查看

复制代码
[root@localhost ~]# docker run -it --volumes-from web02 --name web3 centos:7 /bin/bash
[root@44a3577aa837 /]# cat /data1/abc.txt
this is web2
[root@44a3577aa837 /]# cat /data2/ABC.txt
THIS IS WEB2

端口映射 2 种玩法

随机端口映射

复制代码
[root@localhost ~]# docker run -d --name test1 -P nginx
1adb281b7aacb11febf2dd5e1a4da701e776a98da7c3fa41a570e51b82c4f736
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS         PORTS                                     NAMES
1adb281b7aac   nginx     "/docker-entrypoint...."   5 seconds ago   Up 4 seconds   0.0.0.0:32769->80/tcp, :::32769->80/tcp   test1

如果不指定端口,Docker 会自动为容器的服务分配一个随机端口(通常从 32768 开始)。这种方式适用于无需指定端口号的场景:这里上面已经讲过

此时,`test1` 容器内部的端口 `80` 被映射到宿主机的端口 `49170`。你可以通过浏览器访问:

http://192.168.10.160:32769

复制代码
[root@localhost ~]# docker run -d --name test2 -p 43000:80 nginx
f720df22be8b049d3d4049069b157143db9d6a25de70d0d380dc6f7e953a9e26

登录http://192.168.10.160:43000

容器互联

创建并运行源容器web01

复制代码
[root@localhost ~]# docker run -itd -P --name web01 centos:7 /bin/bash
f3846c11a21efe15d1ee96859a48b6b7a7b20bd200c0db0b467e018198dc2882

创建并运行接收容器 `web02`

进入web02并和web01取得联系

复制代码
[root@localhost ~]# docker exec -it web02 /bin/bash
[root@5e60a15c6f84 /]# ping web01

Docker 镜像的创建

启动容器并进入其 bash 环境:

复制代码
[root@localhost ~]#  docker create -it centos:7 /bin/bash
5d81fe6dbb4105008d2f3de84ef0031ae237261316b598fed0e5f6b12d4564f7

提交容器为新的镜像

基于本地模板创建

下载 Debian 模板

复制代码
[root@localhost ~]# wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz

也可以使用 `curl` 下载:

复制代码
curl -L 下载路径 -o 保存路径

导入为 Docker 镜像

复制代码
[root@localhost ~]# cat debian-7.0-x86-minimal.tar.gz |docker import - debian:test
sha256:96f0b251ba1af4e7958c9e509006885d73cc396f82839644ff45fb7685fef3a3

Docker Compose 编排

简介

Docker Compose 是 Docker 官方开源工具,可通过 YAML 文件(默认 docker-compose.yml)定义多关联服务及容器配置,实现应用部署管理简化。

它将容器分工程、服务、容器三层,能解决多容器协作场景(如 LNMP、Nginx+Tomcat 等),由 Python 编写,调用 Docker API 管理容器,还支持自定义配置文件,助力快速编排容器集群。

Docker Compose 环境安装

复制代码
#下载
[root@localhost bin]# curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose  
#需要翻墙,但是目前条件有限
[root@localhost bin]# chmod +x /usr/local/bin/docker-compose-v2.24.3 
# 这里记住,要重新命名,要不然无法识别
[root@localhost bin]# mv docker-compose-v2.24.3 docker-compose
[root@localhost bin]# docker-compose --version
Docker Compose version v2.24.3

YAML 文件格式及编写注意事项

  • **大小写敏感**:YAML 是大小写敏感的,所以一定要注意区分大小写。

  • **缩进**:YAML 使用空格进行缩进,**不支持 TAB 缩进**。通常推荐使用两个空格作为一个层级的缩进。

  • **列表**:列表项使用 `-`(短横线)表示。

  • **字典**:字典使用 `:`(冒号)连接键值对,冒号后面需要加一个空格。

  • **注释**:使用 `#` 来添加注释。

  • **字符串**:如果字符串包含特殊字符,可以使用单引号 `'` 或双引号 `"` 来包裹。

示例:

复制代码
mkdir -p /opt/compose_nginx/nginx /opt/compose_nginx/wwwroot
cd /opt/compose_nginx/nginx

vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx

编写Dockerfile

复制代码
vim Dockerfile
#基于基础镜像
FROM centos:7
#用户信息
MAINTAINER this is nginx image <hmj>
#添加环境包
RUN rm -rf /etc/yum.repos.d/*
ADD  CentOS-Base.repo /etc/yum.repos.d/
RUN yum clean all && \
    yum makecache && \
    yum -y install pcre-devel zlib-devel gcc gcc-c++ make && \
    useradd -M -s /sbin/nologin nginx
#上传nginx软件压缩包,并解压
ADD nginx-1.20.2.tar.gz /usr/local/src/
#指定工作目录
WORKDIR /usr/local/src/nginx-1.20.2
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
#指定http和https端口
EXPOSE 80
EXPOSE 443

ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]

wq退出,并在命令行写下

复制代码
[root@localhost nginx]# echo "<h1>this is test web</h1>" > /opt/compose_nginx/wwwroot/index.html

编写配置文件docker-compose.yml

复制代码
vim /opt/compose_nginx/docker-compose.yml
version: '3'
services:
  nginx:
    container_name: web1
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 1216:80   # 这里不要空格
      - 1217:443
    networks:
      lnmp:
        ipv4_address: 172.18.0.10
    volumes:
      - ./wwwroot:/usr/local/nginx/html
networks:    #和services是一个组
  lnmp:
   driver: bridge
   ipam:
     config:
	   - subnet: 172.18.0.0/16

查看

复制代码
[root@localhost compose_nginx]# docker ps -a
CONTAINER ID   IMAGE                 COMMAND                   CREATED         STATUS         PORTS                                                                            NAMES
bf016d219d52   compose_nginx-nginx   "/usr/local/nginx/sb..."   8 minutes ago   Up 8 minutes   0.0.0.0:1216->80/tcp, :::1216->80/tcp, 0.0.0.0:1217->443/tcp, :::1217->443/tcp   web1
[root@localhost compose_nginx]# cd /opt/compose_nginx/
[root@localhost compose_nginx]# docker-compose ps
NAME      IMAGE                 COMMAND                   SERVICE   CREATED         STATUS         PORTS
web1      compose_nginx-nginx   "/usr/local/nginx/sb..."   nginx     8 minutes ago   Up 8 minutes   0.0.0.0:1216->80/tcp, :::1216->80/tcp, 0.0.0.0:1217->443/tcp, :::1217->443/tcp

访问192.168.10.160:1216的地址

编写注意事项

  • **文件路径**:在 `docker-compose.yml` 文件中,`context` 和 `volumes` 路径都是相对路径,相对于 `docker-compose.yml` 文件所在的目录。

  • **字段区分**:YAML 格式中,`services` 下定义的每个服务都会有自己的配置项,例如 `image`、`build`、`ports` 等。确保每个字段的位置和缩进正确。

  • **服务间的依赖关系**:例如,`depends_on` 可以控制服务启动的顺序,确保依赖的服务先启动。

动静分离

再/opt/compose_nginx/tomcat路径下编写Dockerfile

复制代码
FROM centos:7
MAINTAINER this is tomcat image <hmj>
ADD jdk-8u191-linux-x64.tar.gz /usr/local
WORKDIR /usr/local
RUN mv jdk1.8.0_191 /usr/local/java
ENV JAVA_HOME /usr/local/java
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH $JAVA_HOME/bin:$PATH
ADD apache-tomcat-8.5.35.tar.gz /usr/local
WORKDIR /usr/local/
RUN mv apache-tomcat-8.5.35 /usr/local/tomcat
EXPOSE 8080

ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]

在/opt/compose_nginx路径下编写compose.yml文件

复制代码
version: '3'

services:
  nginx:
    container_name: nginx
    image: nginx:latest
    build:
      context: ./nginx
    ports:
      - "8081:80"
    volumes:
      - ./wwwroot:/usr/share/nginx/html
    networks:
      - app_network
    depends_on:
      - tomcat

  tomcat:
    container_name: tomcat
    build:
      context: ./tomcat
    ports:
      - "8080:8080"
    networks:
      - app_network
    environment:
      - JAVA_OPTS=-Djava.security.egd=file:/dev/./urandom

networks:
  app_network:
    driver: bridge

注意:compose.yml文件对格式要求及其严格

运行:

复制代码
[root@localhost compose_nginx]# docker-compose -f docker-compose.yml up -d
[+] Running 2/0
 ? Container tomcat  Running                                                                                                    0.0s 
 ? Container nginx   Running                       

查看当前进程

复制代码
[root@localhost compose_nginx]# docker-compose ps
NAME      IMAGE                  COMMAND                   SERVICE   CREATED          STATUS          PORTS
nginx     nginx:latest           "/docker-entrypoint...."   nginx     12 minutes ago   Up 12 minutes   0.0.0.0:8081->80/tcp, :::8081->80/tcp
tomcat    compose_nginx-tomcat   "/usr/local/tomcat/b..."   tomcat    12 minutes ago   Up 12 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp

Harbor

在 Harbor 仓库中,任何镜像在被 push 到 regsitry 之前都必须有一个自己所属的项目。 单击"+项目",填写项目名称,项目级别若设置为"私有",则不勾选。如果设置为公共仓库,则所有人对此项目下的镜像拥有读权限,命令行中不需要执行"Docker login"即可下载镜像,镜像操作与 Docker Hub 一致。

安装

复制文件在/opt/路径,并解压在/usr/local的路径下面

复制代码
[root@localhost opt]# rz -E
rz waiting to receive.
[root@localhost opt]# tar zxvf harbor-offline-installer-v1.9.2.tgz -C /usr/local/
harbor/harbor.v1.9.2.tar.gz
harbor/prepare
harbor/LICENSE
harbor/install.sh
harbor/harbor.yml

在/usr/local/harbor/路径下修改harbor.yml配置文件

安装

复制代码
[root@localhost harbor]# ./install.sh

注意安装的时候,如果容器里面的registry没有关,可能会报错

输入本机IP进入harbor的用户界面

账号:admin 密码:Harbor12345


12. 进阶路线指北

  1. 写 Dockerfile → 多阶段构建

  2. docker-compose 一键起项目

  3. Harbor 私有仓库 + 漏洞扫描

  4. CI/CD(GitLab Runner / GitHub Actions)

  5. Kubernetes 集群编排

  6. Helm + Operator 云原生交付

录制文件1:https://meeting.tencent.com/crm/24bPd0eXa1

访问密码:2OAM

录制文件2:https://meeting.tencent.com/crm/N8JdRW8Xb0

访问密码:6HQF

录制文件3:https://meeting.tencent.com/crm/K04z0kmW06

访问密码:9GRL

相关推荐
wewowilling37 分钟前
认识微服务
java·运维·微服务·springcloud
玖石书1 小时前
Ubuntu 24.04 UFW 全命令攻略:从入门到端口开放实战
linux·运维·ubuntu
VIP_CQCRE2 小时前
给团队搭一个 AI 工作台:Open WebUI 接入 Ace Data Cloud 实战
docker·ai·rag·open webui·ace data cloud
weifont3 小时前
自动化抓取和上架商品:能不动手,就少动手
运维·前端·自动化
拂拉氏3 小时前
【知识讲解】 Linux之动静态库的了解
linux·运维·服务器·动静态库
Mikko74 小时前
Linux 重启后日志没了?进程被 OOM 杀了去哪看?logrotate 之后日志还往旧文件写?三台真机实测日志与性能排查
linux·运维·centos
光依旧4 小时前
发版就掉请求?Spring Boot优雅停机的四步
运维·spring boot·nginx·高可用·优雅停机·mcp server
yichengerp5 小时前
电子行业常用erp系统有哪些?推荐适合中小电子厂的易呈erp软件,操作简单,易落地
大数据·运维·人工智能·云计算·制造
天国梦5 小时前
国密门禁品牌怎么选?2026年最新3个避坑要点
运维·服务器·数据库·python
程序员老赵6 小时前
Docker 部署 Portainer CE:轻松搭建容器管理平台
docker·容器·开源