欢迎光临
我们一直在努力

docke笔记

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

    赞(0)
    未经允许不得转载:171主机测评 » docke笔记
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址