docker学习笔记(1)
文章同步更新于我的个人博客:松果猿的博客,欢迎访问获取更多技术分享。
同时,您也可以关注我的微信公众号:松果猿的代码工坊,获取最新文章推送和编程技巧。
购买服务器
首先来到腾讯云或者阿里云选购一个云服务器以方便练习,系统选择CentOS
,应用Docker装不装都可以,反正我们后面还会安装,付费类型我们选择按量付费,根据使用流量来收费,用过即可释放而且也省钱:

购买好后使用Xshell
远程连接我们的云服务器,点击新建

复制服务器的公网地址:

在新建弹窗中输入连接的名称(随便)和IP:

再输入我们在购买时填写的用户和密码:

点击确定后即可来到该远程终端:

安装Docker
下面输入相关命令安装Docker
首先移除旧版本的Docker:
1 | sudo yum remove docker \ |
配置docker yum源:
1 | sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo |
安装最新docker:
1 | sudo yum install docker-ce docker-ce-cli containerd.io |
启动Docker服务:
1 | systemctl start docker |
设置Docker开机自启动:
1 | systemctl enable docker |
配置加速:
1 | sudo mkdir -p /etc/docker |
配置好镜像加速后重启:
1 | sudo systemctl daemon-reload |
镜像
搜索镜像(以nginx
为例)
1 | docker search nginx |

下载镜像
1 | docker pull nginx |

这里默认下载最新版本,如果需要安装指定版本,只需要如下:
1 | docker pull nginx:1.26.0 |
如果pull正常但是search报错可以看这篇文章:https://blog.csdn.net/weixin_45391996/article/details/143703963
查看所有镜像
1 | docker images |

删除指定id的镜像
1 | docker rmi f876bfc1cc63 |

容器
查看运行中的容器
1 | docker ps |

运行一个新容器(注意这里的运行只是简单启动,一旦ctrl+c
即停止)
1 | docker run nginx |

停止容器(container_name_or_id
:容器名称或 ID)
1 | docker stop [container_name_or_id] |

启动容器(container_name_or_id
:容器名称或 ID)
1 | docker start [container_name_or_id] |

重启容器(container_name_or_id
:容器名称或 ID)
1 | docker restart [container_name_or_id] |

查看容器资源占用情况(container_name_or_id
:容器名称或 ID)
1 | docker stats container_name_or_id |

上面
docker run
命令只是一个简单不指定其他参数的运行命令,以默认配置启动一个Nginx
容器。但是,这个容器不会做任何端口映射,无法从宿主机访问它。
docker run 命令的基本用法
docker run
是 Docker 命令行工具中的一个命令,用于创建并启动一个新的容器。它会从指定的镜像创建一个新的容器实例,并根据提供的选项和参数配置容器的运行环境。
命令格式
1 | docker run [OPTIONS] IMAGE [COMMAND] [ARG...] |
- IMAGE:指定要使用的镜像名称或 ID.
- COMMAND:指定容器启动后要执行的命令,如果省略,则使用镜像中定义的默认命令.
- ARG:传递给命令的参数.
常用选项
-d
:在后台运行容器,并返回容器 ID.-p:将容器的端口映射到宿主机的端口,格式为
宿主机端口:容器端口`.-v, --volume
:将宿主机的目录或文件挂载到容器内部,格式为宿主机路径:容器路径
.-e, --env
:设置环境变量.--name
:为容器指定一个名称.--rm
:容器退出时自动删除容器文件系统.--network
:指定容器的网络连接.
举例
下面我们通过如下命令将宿主机的 80
端口映射到容器的 80
端口(记住要记得去云服务器安全组开放端口):
1 | docker run -d --name mynginx -p 80:80 nginx |
这样我们在浏览器就能访问服务器地址就能够看到nginx
的默认页面了:

docker commit 命令的基本用法
docker commit
是 Docker 命令行工具中的一个命令,用于从一个正在运行的容器创建一个新的镜像。当你对容器进行了一些更改(例如安装软件包、修改配置文件等),并且希望将这些更改保存为一个新的镜像时,可以使用 docker commit
命令。
命令格式
1 | docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] |
- CONTAINER:是你希望从中创建新镜像的容器的 ID 或名称.
- **REPOSITORY[:TAG]**:是你希望创建的新镜像的名称和标签. 如果不指定标签,默认为
latest
.
常用选项
-a, --author
:指定新镜像的作者信息.-c, --change
:应用 Dockerfile 指令来创建镜像,例如CMD
、ENTRYPOINT
、ENV
等.-m, --message
:为新镜像添加提交信息,类似于 Git 的提交信息.-p, --pause
:在提交过程中暂停容器,默认为true
,意味着在提交过程中容器会暂停运行
举例
通过如下命令提交:
1 | docker commit -m "first commit" mynginx mynginx:v1.0 |
执行docker images
可以看到有了我们创建的新镜像:

docker save 命令的基本用法
docker save
是 Docker 命令行工具中的一个命令,用于将一个或多个镜像保存为 tar 归档文件。这在需要将镜像传输到其他机器或存储介质时非常有用.
命令格式
1 | docker save [OPTIONS] IMAGE [IMAGE...] |
- IMAGE:指定要保存的镜像名称或 ID,可以同时指定多个镜像.
常用选项
-o, --output
:指定输出文件的路径,如果不指定,则输出到标准输出
举例
这样我们就可以通过这个tar文件传输给别人docker镜像了
1 | docker save -o mynginx.tar mynginx:v1.0 |

docker load 命令的基本用法
docker load
是 Docker 命令行工具中的一个命令,用于从 tar 归档文件中加载镜像。这通常用于将之前使用 docker save
命令保存的镜像文件重新导入到 Docker 中.
命令格式
1 | docker load [OPTIONS] < tar_file.tar |
- tar_file.tar:指定要加载的 tar 归档文件路径.
常用选项
-i, --input
:指定输入文件的路径
举例
加载我们刚刚执行docker save
保存的tar文件
1 | docker load -i mynginx.tar |

执行docker images
查看加载的镜像

docker tag 命令的基本用法
docker tag
是 Docker 命令行工具中的一个命令,用于为现有的镜像创建一个新的标签(tag)。这通常用于重新标记镜像,以便更容易地识别和管理镜像.
命令格式
1 | docker tag EXISTING_IMAGE NEW_IMAGE[:TAG] |
- EXISTING_IMAGE:指定要重新标记的现有镜像的名称或 ID.
- **NEW_IMAGE[:TAG]**:指定新的镜像名称和标签. 如果不指定标签,默认为
latest
.
举例
不过我们首先需要登录dockerhub,前往去注册一个账号,执行如下命令后输入账号和密码即可:
1 | docker login |

总是报超时,网上的方法试了个遍没用….
1 | docker tag mynginx:v1.0 besonzhang/mynginx:v1.0 |
docker push 命令的基本用法
docker push
是 Docker 命令行工具中的一个命令,用于将本地的镜像推送到远程镜像仓库,如 Docker Hub 或其他私有仓库。这使得你可以与他人共享你的镜像,或者在不同的机器之间同步镜像.
命令格式
1 | docker push [OPTIONS] NAME[:TAG] |
- **NAME[:TAG]**:指定要推送的镜像名称和标签. 如果不指定标签,默认为
latest
.
举例
推送镜像
1 | docker push besonzhang/mynginx:v1.0 |
目录挂载
绑定挂载可以将宿主机上的任意路径挂载到容器内。使用以下命令进行绑定挂载:
1 | docker run -d -v /path/on/host:/path/in/container my_image |
这里的 -v
或 --mount
标志用于指定挂载的细节:
/path/on/host
是宿主机上的路径。/path/in/container
是容器内的路径。
举例
执行如下命令:
1 | docker run -d -p 80:80 -v /app/nghtml:/usr/share/nginx/html nginx |

切换到宿主机上挂载的目录:
1 | cd /app/nghtml |
修改index.html
内容
1 | echo hello > index.html |
这样会同步到运行的容器内/usr/share/nginx/html
的index.html
,我们到浏览器查看,可以发现默认的nginx
页面已经被修改了:

卷挂载
卷挂载是 Docker 管理宿主机文件系统的一部分,通常用于持久化数据。使用以下命令进行卷挂载:
1 | docker run -d --mount source=myvolume,target=/path/in/container my_image |
或者使用 -v
的语法:
1 | docker run -d -v myvolume:/path/in/container my_image |
这里的 myvolume
是卷的名字,如果它不存在,Docker 会自动创建它。
举例
不同于上面目录挂载,执行如下命令,再启动一个卷挂载的容器:
1 | docker run -d -p 81:80 -v ngconf:/etc/nginx --name nginx-02 nginx |
执行如下命令查看已创建的Docker卷:
1 | docker volume ls |

查看某个卷的相关消息,比如说创建时间、在宿主机上的挂载目录等:
1 | docker volume inspect ngconf |

下面我们修改挂载卷的数据,通过上面的卷的详细信息我们看到其在宿主机上的挂载位置(不同于目录挂载可以指定位置,而是固定的),cd来到服务器挂载目录:

修改nginx.conf
(比如添加个注释):

我们再进入容器内部, 可以看到其nginx.conf
内容的确同步修改了:

让我想到了
Vue
的双向绑定…
Docker 网络配置
我们启动两个容器:
1 | docker run -d -p 88:80 --name app1 nginx |

1 | docker run -d -p 89:80 --name app2 nginx |

使用 docker container inspect
命令可以查看容器的详细信息,包括网络配置:
1 | docker container inspect app1 |

1 | docker container inspect app2 |

在 Bridge 模式下,Docker 为每个容器分配了一个唯一的 IP 地址,如 172.17.0.2
和 172.17.0.3
(假设 app2
的 IP 为 172.17.0.3
)。使用容器的 IP 地址加上容器内部的端口(例如 80),容器之间可以互相访问。例如,app1
可以通过 http://172.17.0.3:80
访问 app2
,反之亦然

docker为每个容器分配唯一IP,使用容器IP+容器端口可以互相访问、
下面我们创建一个自定义网络:
1 | docker network create mynet |

- 创建自定义网络后,Docker 会为该网络分配一个子网和网关,例如
172.18.0.0/16
子网和172.18.0.1
网关(具体分配的子网和网关可能因 Docker 版本和配置而异) - 自定义网络允许容器之间通过容器名称进行通信,而不需要使用 IP 地址,这使得容器间的通信更加方便和直观
执行docker network ls
可以看到我们的确已经创建了一个自定义网络:

不同于之前启动的默认网络配置容器,下面我们再分别启动了两个 Nginx
容器 app3
和 app4
,并将它们连接到之前创建的 mynet
网络,--network mynet
指定容器连接到 mynet
网络,这样 app3
和 app4
就可以在同一个网络中通信
1 | docker run -d -p 90:80 --name app3 --network mynet nginx |
1 | docker run -d -p 91:80 --name app4 --network mynet nginx |

由于 app3
和 app4
都连接到了同一个自定义网络 mynet
,它们可以通过容器名称互相访问。例如,在 app4
容器中执行如下命令:

由于 app3
容器中运行的是 Nginx 服务,默认监听 80 端口,因此 curl
命令会成功访问到 app3
容器中的 Nginx 服务,并返回 Nginx 的默认欢迎页面内容
结束
别忘了删除云服务器实例…
