文章同步更新于我的个人博客:松果猿的博客,欢迎访问获取更多技术分享。

同时,您也可以关注我的微信公众号:松果猿的代码工坊,获取最新文章推送和编程技巧。

购买服务器

首先来到腾讯云或者阿里云选购一个云服务器以方便练习,系统选择CentOS,应用Docker装不装都可以,反正我们后面还会安装,付费类型我们选择按量付费,根据使用流量来收费,用过即可释放而且也省钱:

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

复制服务器的公网地址:

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

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

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

安装Docker

下面输入相关命令安装Docker

首先移除旧版本的Docker:

1
2
3
4
5
6
7
8
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

配置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
2
3
4
5
6
7
8
9
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com",
"https://docker.m.daocloud.io"
]
}
EOF

配置好镜像加速后重启:

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

镜像

搜索镜像(以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 指令来创建镜像,例如 CMDENTRYPOINTENV 等.
  • -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/htmlindex.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.2172.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容器 app3app4,并将它们连接到之前创建的 mynet 网络,--network mynet 指定容器连接到 mynet 网络,这样 app3app4 就可以在同一个网络中通信

1
docker run -d -p 90:80 --name app3 --network mynet nginx
1
docker run -d -p 91:80 --name app4 --network mynet nginx

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

由于 app3 容器中运行的是 Nginx 服务,默认监听 80 端口,因此 curl 命令会成功访问到 app3 容器中的 Nginx 服务,并返回 Nginx 的默认欢迎页面内容

结束

别忘了删除云服务器实例…