Docker入门
1开始
## 二、Docker 安装
> 本批材料中未提供具体内容,待补充。
—
## 三、Docker的常用命令
### 1. 帮助命令
```bash
docker version # 显示 Docker 版本信息
docker info # 显示 Docker 系统信息(容器/镜像数量、驱动等)
docker –help # 帮助命令(可查看所有子命令)
docker 命令 –help # 查看特定命令的帮助,如 docker run –help
2. 镜像命令
列出本地镜像
bash
docker images # 列出所有镜像
docker images -q # 只显示镜像 ID
docker images -a # 列出所有镜像(含中间层)
docker images –digests # 显示摘要信息
docker images –no-trunc # 不截断输出
搜索镜像
bash
docker search 镜像名 # 从 Docker Hub 搜索镜像
docker search –limit 5 镜像名 # 限制结果数量
拉取镜像
bash
docker pull 镜像名[:TAG] # 下载镜像(默认 latest)
docker pull mysql:5.7 # 示例:拉取 MySQL 5.7
删除镜像
bash
docker rmi 镜像ID/名 # 删除指定镜像
docker rmi -f 镜像ID # 强制删除(即使有容器依赖)
docker rmi -f 镜像ID1 镜像ID2 # 删除多个
docker rmi -f $(docker images -aq) # 删除所有镜像
查看镜像详情
bash
docker inspect 镜像ID/名 # 显示镜像详细信息(JSON)
docker history 镜像ID/名 # 显示镜像构建历史
构建镜像
bash
docker build -t 镜像名:TAG . # 从 Dockerfile 构建镜像
打标签
bash
docker tag 源镜像:tag 目标镜像:tag # 给镜像打新标签
导入导出镜像
bash
docker save -o 文件名.tar 镜像名 # 导出镜像为 tar 文件
docker load -i 文件名.tar # 从 tar 文件导入镜像
3. 容器命令
运行容器
bash
docker run 镜像名 # 创建并启动容器
docker run -it 镜像名 bash # 交互式运行(进入容器终端)
docker run -d 镜像名 # 后台运行(守护模式)
docker run –name 容器名 镜像名 # 指定容器名
docker run -p 宿主机端口:容器端口 镜像名 # 端口映射
docker run -v 宿主机目录:容器目录 镜像名 # 挂载数据卷
docker run –restart=always 镜像名 # 自动重启
查看容器
bash
docker ps # 查看运行中的容器
docker ps -a # 查看所有容器(含已停止)
docker ps -aq # 只显示容器 ID
docker ps -l # 查看最近创建的容器
启动/停止/重启容器
bash
docker start 容器ID/名 # 启动已停止的容器
docker stop 容器ID/名 # 停止容器
docker restart 容器ID/名 # 重启容器
docker kill 容器ID/名 # 强制停止容器
进入容器
bash
docker exec -it 容器ID/名 bash # 进入容器(推荐,不会导致容器停止)
docker attach 容器ID/名 # 进入容器(退出会导致容器停止)
删除容器
bash
docker rm 容器ID/名 # 删除已停止的容器
docker rm -f 容器ID/名 # 强制删除(运行中的也能删)
docker rm -f $(docker ps -aq) # 删除所有容器
docker container prune # 删除所有停止的容器
查看日志
bash
docker logs 容器ID/名 # 查看全部日志
docker logs -f 容器ID/名 # 实时跟踪日志(tail -f 效果)
docker logs –tail 100 容器ID # 显示最后 100 行
查看容器内进程
bash
docker top 容器ID/名 # 显示容器内运行的进程
查看容器详情
bash
docker inspect 容器ID/名 # 显示容器详细信息(JSON)
复制文件
bash
docker cp 宿主机文件 容器ID:容器路径 # 从宿主机复制到容器
docker cp 容器ID:容器路径 宿主机路径 # 从容器复制到宿主机
查看端口映射
bash
docker port 容器ID/名 # 显示容器的端口映射
查看资源占用
bash
docker stats # 实时显示所有容器资源占用
docker stats 容器ID/名 # 查看指定容器
暂停/恢复容器
bash
docker pause 容器ID/名 # 暂停容器
docker unpause 容器ID/名 # 恢复容器
重命名容器
bash
docker rename 旧容器名 新容器名
等待容器退出
bash
docker wait 容器ID/名 # 阻塞直到容器停止,返回退出码
4. 其他常用命令
清理资源
bash
docker system prune # 删除所有停止的容器、未使用的网络、dangling 镜像
docker system prune -a # 更彻底清理(包括未使用的镜像)
docker volume prune # 删除未使用的数据卷
登录/退出仓库
bash
docker login # 登录 Docker Hub(输入用户名/密码)
docker logout # 退出登录
推送镜像到仓库
bash
docker push 用户名/镜像名:TAG
查看事件
bash
docker events # 实时输出 Docker 守护进程事件
5. 容器管理速查表
| 删除所有停止的容器 | docker container prune |
| 删除所有镜像(谨慎) | docker rmi -f $(docker images -aq) |
| 停止所有运行中的容器 | docker stop $(docker ps -q) |
| 删除所有容器(含运行中) | docker rm -f $(docker ps -aq) |
| 进入容器后退出不停止 | 用 exec 进入,然后 exit 退出 |
| 查看容器 IP 地址 | docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器ID |
6. 命令基础表格(按字母排序)
| attach | Attach to a running container |
| build | Build an image from a Dockerfile |
| commit | Create a new image from a container changes |
| cp | Copy files/folders from container to host |
| create | Create a new container (但不启动) |
| diff | Inspect changes on a container's filesystem |
| events | Get real time events from the server |
| exec | Run a command in an existing container |
| export | Export container's filesystem as tar |
| history | Show the history of an image |
| images | List images |
| import | Import from tar to create filesystem image |
| info | Display system-wide information |
| inspect | Return low-level info on container/image |
| kill | Kill a running container |
| load | Load an image from a tar archive |
| login | Login to Docker registry |
| logout | Logout from Docker registry |
| logs | Fetch the logs of a container |
| port | Lookup public-facing port mapping |
| pause | Pause all processes within a container |
| ps | List containers |
| pull | Pull an image from registry |
| restart | Restart a running container |
| rm | Remove one or more containers |
| rmi | Remove one or more images |
| run | Run a command in a new container |
| save | Save an image to a tar archive |
| search | Search for an image on Docker Hub |
| start | Start a stopped container |
| stop | Stop a running container |
| tag | Tag an image |
| top | Lookup running processes of a container |
| unpause | Unpause a paused container |
| version | Show Docker version info |
| wait | Block until container stops, then print exit code |
7. 小技巧
-
有了镜像才可以创建容器,例如 docker pull centos
-
docker run [可选参数] 镜像
-
–name="Name" 容器名字
-
-d 后台方式运行
-
-it 交互式运行
-
-p 指定端口映射(-p 宿主机端口:容器端口)
-
-P 随机指定端口
-
四、Docker镜像讲解
1. 镜像管理
查看镜像
bash
docker images
docker images -a # 显示所有(含中间层)
删除镜像
bash
docker rmi <镜像ID/名>:<标签>
docker rmi -f <镜像ID> # 强制删除
给镜像打标签
bash
docker tag <原镜像>:<标签> <新镜像名>:<新标签>
导入/导出镜像
bash
docker save -o myimage.tar <镜像名>:<标签>
docker load -i myimage.tar
查看镜像构建历史
bash
docker history <镜像名>:<标签>
2. 镜像分层与 commit
镜像分层原理
-
Docker 镜像由多个只读层(layer)堆叠而成。
-
多个镜像可以共享相同的底层,节省磁盘空间。
-
docker run 时在镜像层上添加一个可写层(容器层)。
-
容器删除时,可写层被删除,镜像层不变。
查看镜像分层
bash
docker history nginx:latest
docker commit 创建自定义镜像
bash
# 1. 启动容器并修改
docker run -it –name mynginx nginx:latest bash
apt update && apt install -y vim
exit
# 2. 提交为新镜像
docker commit -m "add vim" -a "teacher" mynginx nginx-with-vim:v1
# 3. 使用新镜像
docker run -it nginx-with-vim:v1 bash
生产环境建议用 Dockerfile,而非 commit。
3. 常见镜像拉取与运行
CentOS
bash
docker pull centos:7
docker run -it centos:7 bash
Ubuntu
bash
docker pull ubuntu:latest
docker run -it ubuntu:latest bash
Nginx
bash
docker run -d -p 80:80 –name mynginx nginx
MySQL
bash
docker run -d \\
–name mysql \\
-e MYSQL_ROOT_PASSWORD=123456 \\
-p 3306:3306 \\
mysql:latest
Tomcat
bash
docker run -d -p 8080:8080 –name tomcat tomcat:latest
Elasticsearch
bash
docker run -d \\
–name elasticsearch \\
-p 9200:9200 -p 9300:9300 \\
-e "discovery.type=single-node" \\
elasticsearch:7.6.2
Portainer(Docker 图形化管理工具)
bash
docker run -d \\
-p 8088:9000 \\
–name portainer \\
–restart=always \\
-v /var/run/docker.sock:/var/run/docker.sock \\
-v portainer_data:/data \\
portainer/portainer-ce:latest
访问 http://<宿主机IP>:8088,首次创建管理员账户。
五、容器数据卷
1. 什么是容器数据卷
-
Docker 的理念:将应用和环境打包成镜像。
-
问题:数据放在容器中,容器删除数据会丢失 → 需要数据持久化。
-
例如 MySQL 容器删除相当于删库跑路 → 需要 MySQL 数据存在本地。
-
容器之间可以共享数据 → 数据卷技术:将容器内部目录挂载到宿主机上。
一句话:容器的持久化和同步操作,容器间也可以数据共享。
2. 使用数据卷
直接使用命令挂载 -v
bash
docker run -it -v /home/ceshi:/home centos /bin/bash
# 启动测试容器,将本机 /home/ceshi 挂载到容器的 /home
# 查看挂载详情:docker inspect 容器ID
-
停止容器后,在宿主机上修改文件,再启动容器,容器内数据同步。
-
好处:以后修改配置文件只需在本地修改,容器内自动同步。
3. 实战 MySQL 数据持久化
bash
docker pull mysql:5.7
docker run -d \\
-p 3310:3306 \\
-v /home/mysql/conf:/etc/mysql/conf.d \\
-v /home/mysql/data:/var/lib/mysql \\
-e MYSQL_ROOT_PASSWORD=123456 \\
–name mysql01 \\
mysql:5.7
-
即使删除容器,本地挂载的数据卷依然存在 → 实现容器数据持久化。
4. 具名和匿名挂载
-
匿名挂载:-v 容器内路径
-
具名挂载:-v 卷名:容器内路径
-
指定路径挂载:-v /宿主机路径:容器内路径
示例
bash
# 匿名挂载
docker run -d -P –name nginx01 -v /etc/nginx nginx
# 具名挂载
docker run -d -P –name nginx02 -v juming-nginx:/etc/nginx nginx
docker volume ls
docker volume inspect juming-nginx # 查看卷的实际路径(位于 /var/lib/docker/volumes/…)
权限控制
bash
# ro : 只读(容器内只能通过宿主机操作)
docker run -d -P –name nginx02 -v juming-nginx:/etc/nginx:ro nginx
# rw : 可读可写
docker run -d -P –name nginx02 -v juming-nginx:/etc/nginx:rw nginx
5. 数据卷容器
多个容器同步数据
bash
# 1. 创建一个具名卷
docker volume create shared-data
# 2. 启动第一个容器,挂载该卷
docker run -d –name container1 -v shared-data:/data your-image:tag
# 3. 启动第二个容器,挂载同一个卷
docker run -d –name container2 -v shared-data:/data your-image:tag
两个容器对 /data 目录的操作会互相可见。删除容器不会删除数据卷,只要还有容器使用或本地持久化,数据就不会丢失。
六、DockerFile
1. 初识 Dockerfile
-
Dockerfile 是构建 Docker 镜像的构建文件(命令脚本)。
-
镜像是一层一层的,脚本中的每个命令都是一层。
示例 Dockerfile
dockerfile
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "—-end—-"
CMD /bin/bash
构建镜像
bash
docker build -f Dockerfile -t liuzhuang/mysql:1.0 .
2. Dockerfile 基础知识
-
每个保留关键字(指令)必须是大写字母。
-
执行从上到下顺序执行。
-
# 表示注释。
-
每一个指令都会创建一个新的镜像层并提交。
Dockerfile 是面向开发的,以后发布项目、做镜像非常常用。Docker 镜像逐渐成为企业交付的标准。
3. Dockerfile 指令
| FROM | 基础镜像,一切从这里开始构建 |
| MAINTAINER | 镜像是谁写的,姓名+邮箱 |
| RUN | 镜像构建时需要运行的命令 |
| ADD | 添加内容(如 Tomcat 压缩包,会自动解压) |
| WORKDIR | 镜像的工作目录 |
| VOLUME | 挂载的目录 |
| EXPOSE | 暴露端口配置(与 -p 对应) |
| CMD | 容器启动时运行的命令(只有最后一个生效,可被替代) |
| ENTRYPOINT | 容器启动时运行的命令(可以追加命令) |
| ONBUILD | 当构建一个被继承的 Dockerfile 时触发 |
| COPY | 将文件拷贝到镜像中 |
| ENV | 构建时设置环境变量 |
4. 实战测试 – 构建自己的 CentOS
Dockerfile 内容
dockerfile
FROM centos:7
MAINTAINER kuangshen<226628325@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "—-end—-"
CMD /bin/bash
构建镜像
bash
docker build -f mydockerfile -t mycentos:0.1 .
# 若遇到版本问题,可指定 centos:7 或禁用 BuildKit:
DOCKER_BUILDKIT=0 docker build -f mydockerfile -t mycentos:0.1 .
查看历史
bash
docker history mycentos:0.1
5. CMD 和 ENTRYPOINT 的区别
-
CMD:只有最后一个生效,可被 docker run 后面的命令替换。例:docker run -it cmdtest -l 会报错,因为 -l 替换了 CMD ["ls","-a"]。
-
ENTRYPOINT:不会被替换,docker run 后面的命令会作为参数追加。
6. 实战 Tomcat 镜像
Dockerfile 示例
dockerfile
FROM centos:7
COPY jdk1.8.0_171 /usr/local/jdk1.8.0_171
ADD apache-tomcat-7.0.88.tar.gz /usr/local/
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-7.0.88
ENV CATALINA_BASE /usr/local/apache-tomcat-7.0.88
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-7.0.88/bin/startup.sh && tail -F /usr/local/apache-tomcat-7.0.88/logs/catalina.out
构建并运行
bash
docker build -t my-tomcat:7 .
docker run -d -p 8081:8080 –name mytomcat my-tomcat:7
# 带数据卷挂载的运行方式
docker run -d \\
-p 8081:8080 \\
–name mytomcat \\
-v /home/kuangshen/build/tomcat/test:/usr/local/apache-tomcat-7.0.88/webapps/test \\
-v /home/kuangshen/build/tomcat/tomcatlogs:/usr/local/apache-tomcat-7.0.88/logs \\
my-tomcat:7
发布项目修改项目可直接在本机修改,不用进入容器内部。
7. 发布自己的镜像
注册 Docker Hub:https://hub.docker.com/
确定账户
在服务器上提交镜像
bash
docker push 用户名/镜像名:标签
七、Docker 网络
1. 理解 Docker0
-
Docker 是如何处理容器网络访问的?
-
每启动一个 Docker 容器,Docker 就会给容器分配一个 IP。
-
安装 Docker 后,会有一个虚拟网卡 docker0(桥接模式,使用 veth-pair 技术)。
-
veth pair 可以理解为虚拟网线:一头在容器内(eth0),一头插在宿主机的 docker0 网桥上。
测试
bash
docker run -d -P –name tom01 tomcat
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' tom01
# 输出 172.17.0.2
ping 172.17.0.2 # 宿主机可以 ping 通容器内部
-
启动多个容器,每个容器都会生成一对虚拟网卡。
-
所有容器不指定网络时,都通过 docker0 路由,Docker 会分配默认可用 IP。
-
容器之间可以互相 ping 通(因为共用 docker0 路由器)。
-
容器删除,对应的虚拟网桥也会被删除。
2. –link
-
微服务场景中,希望用容器名而不是 IP 来访问。
-
–link 可以打通容器间的域名访问(但已不推荐,推荐使用自定义网络)。
3. 自定义网络
查看所有 Docker 网络
bash
docker network ls
网络模式:
-
bridge:桥接(默认)
-
none:不配置网络
-
host:和宿主机共享网络
-
container:容器内网络连通(用的少)
创建自定义网络
bash
docker network create –driver bridge –subnet 192.168.0.0/16 –gateway 192.168.0.1 mynet
-
–driver bridge:指定网络驱动(可省略)
-
–subnet:子网范围
-
–gateway:网关地址
使用自定义网络
bash
docker run -d -P –name tomcat-net-01 –net mynet tomcat
docker run -d -P –name tomcat-net-02 –net mynet tomcat
-
在自定义网络中,容器之间可以直接通过容器名 ping 通(不需要 –link)。
-
好处:不同的集群可以使用不同的网络,保证网络隔离和健康。
4. 网络连通
将现有容器连接到另一个网络
bash
docker network connect mynet tom01
-
一个容器可以有多个 IP 地址(类似阿里云的公网 IP + 私网 IP)。
-
作用:
-
访问不同网络中的服务(减少攻击面,灵活打通通信)。
-
充当网关或代理(如 Nginx 同时接入前后端网络)。
-
实现安全隔离(不同业务不同网络,只打通必要的容器)。
-
微服务场景中跨网络调用。
-
5. 实战:Redis 集群
创建网络
bash
docker network create redis –subnet 172.38.0.0/16
通过脚本创建六个 Redis 配置
bash
for port in $(seq 1 6); \\
do \\
mkdir -p /mydata/redis/node-${port}/conf && \\
cat << EOF > /mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
启动 6 个 Redis 容器
bash
# 节点 1
docker run -p 6371:6379 -p 16371:16379 –name redis-1 \\
-v /mydata/redis/node-1/data:/data \\
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \\
-d –net redis –ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
# … 节点 2~6 类似,IP 分别为 172.38.0.12~16
创建集群
bash
docker exec -it redis-1 /bin/sh
redis-cli –cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 –cluster-replicas 1
-
测试主从切换:停掉一个 master,对应的 slave 会自动提升为 master。
6. 常见网络问题排查
bash
# 检查虚拟机外网连通性
ping 8.8.8.8
ping baidu.com
curl -I https://registry-1.docker.io/v2/
# 检查 Docker 服务状态
systemctl status docker
journalctl -u docker -n 50
# 检查防火墙
systemctl status firewalld
sudo systemctl stop firewalld # 临时关闭(仅测试)
# 重置 Docker 配置(如果加速器未生效)
sudo systemctl reset-failed docker
sudo systemctl restart docker
7. 镜像加速器配置
问题:国内访问 Docker Hub 不稳定。解决方案:配置国内镜像加速器。
方法一:手动配置编辑 /etc/docker/daemon.json:
json
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.m.daocloud.io",
"https://docker.xuanyuan.me"
]
}
重启 Docker:
bash
sudo systemctl restart docker
方法二:一键脚本
bash
bash <(wget -qO- https://xuanyuan.cloud/docker.sh)
sudo systemctl restart docker
方法三:临时拉取(不配置加速器)
bash
docker pull docker.1ms.run/library/centos:7
docker tag docker.1ms.run/library/centos:7 centos:7
验证加速器是否生效
bash
docker info | grep -A 5 "Registry Mirrors"
8. 清理与维护
bash
# 删除所有停止的容器
docker container prune
# 删除所有未使用的镜像(悬空镜像)
docker image prune
docker system prune -a # 更彻底
# 查看磁盘占用
docker system df
