当前位置: 首页 > news >正文

保姆级 Docker 入门到进阶

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

1.1 云服务模型 4 兄弟

缩写全称一句话记忆典型产品
IaaSInfrastructure as a Service只租“地皮”,自己盖楼ECS、EC2
PaaSPlatform as a Service拎包入住,专注写代码SAE、GAE
SaaSSoftware as a Service直接入住“精装修”钉钉、飞书
DaaSData as a Service数据“外卖”送到家MaxCompute、BigQuery

1.2 虚拟化技术速览

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

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


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

2.1 官方金句

Build, Ship and Run Any App, Anywhere.

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

  • 秒级启动

  • 跨云迁移

  • 环境一致性

  • 微服务友好

2.2 鲸鱼 Logo 图解

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

2.3 时间轴:Docker 大事件

年份里程碑
2013dotCloud 开源 Docker
20151.8 版发布,正式支持网络/卷插件
2017分 CE & EE,拥抱 Kubernetes
201818.09 引入多阶段构建
202020.10 默认启用 cgroup v2
202323.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 镜像IDJSON 全量字段
打标签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 stopdocker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash				#批量删除所有容器
docker ps -a | awk 'NR>=2{print $1}'| xargs docker rmdocker 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 c2CONTAINER 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/bashi=0while true; do let i++; done

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

 docker exec -it <container> bash

- 分别进入容器,进行压力测试

  yum install -y epel-releaseyum install -y stressstress -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 cacheAre you sure you want to continue? [y/N] y
Deleted Containers:
1f2b58c43de307b67aa7fa9e98b1314fe3d71cddcb044556c14b901a017966efDeleted Networks:
mynetworkTotal 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/nginxvim 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 443ENTRYPOINT [ "/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: web1hostname: nginxbuild:context: ./nginxdockerfile: Dockerfileports:- 1216:80   # 这里不要空格- 1217:443networks:lnmp:ipv4_address: 172.18.0.10volumes:- ./wwwroot:/usr/local/nginx/html
networks:    #和services是一个组lnmp:driver: bridgeipam: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 8080ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]

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

version: '3'services:nginx:container_name: nginximage: nginx:latestbuild:context: ./nginxports:- "8081:80"volumes:- ./wwwroot:/usr/share/nginx/htmlnetworks:- app_networkdepends_on:- tomcattomcat:container_name: tomcatbuild:context: ./tomcatports:- "8080:8080"networks:- app_networkenvironment:- JAVA_OPTS=-Djava.security.egd=file:/dev/./urandomnetworks: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

http://www.dtcms.com/a/441885.html

相关文章:

  • 网站建站网站80s隐秘而伟大新网站怎么做谷歌推广呢
  • uv 配置国内镜像加速教程
  • Leetcode 295. 数据流的中位数 堆
  • Go 语言的 channel
  • python包管理器——uv
  • 【LeetCode】92. 反转链表 II
  • LeetCode:90.最长有效括号
  • AI 重塑行业格局:从金融风控到智能制造的深度实践
  • 网站开发公共文件太仓营销型网站建设
  • MSM多标量乘法:策略及挑战
  • 做58一样的网站网站如何在国外推广
  • Vue渲染—深入VNode(h函数、JSX、render函数)
  • GPT_Data_Processing_Tutorial
  • 华为AC+AP无线网络组网与配置指南
  • 交互动效设计
  • 电子商务网站建设与管理相关文献邢台路桥建设总公司没有网站吗
  • Leetcode 3700. Number of ZigZag Arrays II
  • Turbopack介绍(由Vercel开发的基于Rust的高性能前端构建工具,用于挑战传统构建工具Webpack、vite地位)Next.js推荐构建工具
  • 网站自适应 如何做ui设计可以从事什么工作
  • 【学习记录】宝塔面板 + Docker 快速部署 RustDesk 自建远程控制服务器
  • 【3DGS复现】Autodl服务器复现3DGS《简单快速》《一次成功》《新手练习复现必备》
  • ollama的下载以及Spring AI Alibaba的ChatModel和ChatClient的流式输出和在idea的实现
  • 自己搭建服务器 发布网站 域名如何申请深圳专业做网站专业
  • 【pytest】fixture 内省(Introspection)测试上下文
  • 【开题答辩实录分享】以《基于python的奶茶店分布数据分析与可视化》为例进行答辩实录分享
  • 嵌入式硬件——基于IMX6ULL的I2C实现
  • 【ROS2学习笔记】分布式通信
  • 唐尧文化 网站建设工作总结邢台手机网站制作
  • 心脏病监测数据可视化分析
  • 【机器人】WMNav 将VLM融入世界模型 | 零样本目标导航 | IROS‘25