保姆级 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 把应用 + 依赖 + 配置 + 运行时统一打包成“集装箱”,实现:
秒级启动
跨云迁移
环境一致性
微服务友好
2.2 鲸鱼 Logo 图解
大海(宿主机 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 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. 进阶路线指北
写 Dockerfile → 多阶段构建
docker-compose 一键起项目
Harbor 私有仓库 + 漏洞扫描
CI/CD(GitLab Runner / GitHub Actions)
Kubernetes 集群编排
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