文章同步更新于我的个人博客:松果猿的博客,欢迎访问获取更多技术分享。
同时,您也可以关注我的微信公众号:松果猿的代码工坊,获取最新文章推送和编程技巧。
购买服务器
首先来到腾讯云或者阿里云选购一个云服务器以方便练习,系统选择CentOS
,应用Docker装不装都可以,反正我们后面还会安装,付费类型我们选择按量付费,根据使用流量来收费,用过即可释放而且也省钱:
购买好后使用Xshell
远程连接我们的云服务器,点击新建
复制服务器的公网地址:
在新建弹窗中输入连接的名称(随便)和IP:
再输入我们在购买时填写的用户和密码:
点击确定后即可来到该远程终端:
安装Docker
下面输入相关命令安装Docker
首先移除旧版本的Docker:
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
配置docker yum源:
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装最新docker:
sudo yum install docker-ce docker-ce-cli containerd.io
启动Docker服务:
systemctl start docker
设置Docker开机自启动:
systemctl enable docker
配置加速:
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
配置好镜像加速后重启:
sudo systemctl daemon-reload
sudo systemctl restart docker
镜像
搜索镜像(以nginx
为例)
docker search nginx
下载镜像
docker pull nginx
这里默认下载最新版本,如果需要安装指定版本,只需要如下:
docker pull nginx:1.26.0
如果pull正常但是search报错可以看这篇文章:blog.csdn.net/weixin_4539…
查看所有镜像
docker images
删除指定id的镜像
docker rmi f876bfc1cc63
容器
查看运行中的容器
docker ps
运行一个新容器(注意这里的运行只是简单启动,一旦ctrl+c
即停止)
docker run nginx
停止容器(container_name_or_id
:容器名称或 ID)
docker stop [container_name_or_id]
启动容器(container_name_or_id
:容器名称或 ID)
docker start [container_name_or_id]
重启容器(container_name_or_id
:容器名称或 ID)
docker restart [container_name_or_id]
查看容器资源占用情况(container_name_or_id
:容器名称或 ID)
docker stats container_name_or_id
上面
docker run
命令只是一个简单不指定其他参数的运行命令,以默认配置启动一个Nginx
容器。但是,这个容器不会做任何端口映射,无法从宿主机访问它。
docker run 命令的基本用法
docker run
是 Docker 命令行工具中的一个命令,用于创建并启动一个新的容器。它会从指定的镜像创建一个新的容器实例,并根据提供的选项和参数配置容器的运行环境。
命令格式
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
- IMAGE:指定要使用的镜像名称或 ID.
- COMMAND:指定容器启动后要执行的命令,如果省略,则使用镜像中定义的默认命令.
- ARG:传递给命令的参数.
常用选项
-d
:在后台运行容器,并返回容器 ID.-p:将容器的端口映射到宿主机的端口,格式为
宿主机端口:容器端口`.-v, --volume
:将宿主机的目录或文件挂载到容器内部,格式为宿主机路径:容器路径
.-e, --env
:设置环境变量.--name
:为容器指定一个名称.--rm
:容器退出时自动删除容器文件系统.--network
:指定容器的网络连接.
举例
下面我们通过如下命令将宿主机的 80
端口映射到容器的 80
端口(记住要记得去云服务器安全组开放端口):
docker run -d --name mynginx -p 80:80 nginx
这样我们在浏览器就能访问服务器地址就能够看到nginx
的默认页面了:
docker commit 命令的基本用法
docker commit
是 Docker 命令行工具中的一个命令,用于从一个正在运行的容器创建一个新的镜像。当你对容器进行了一些更改(例如安装软件包、修改配置文件等),并且希望将这些更改保存为一个新的镜像时,可以使用 docker commit
命令。
命令格式
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
,意味着在提交过程中容器会暂停运行
举例
通过如下命令提交:
docker commit -m "first commit" mynginx mynginx:v1.0
执行docker images
可以看到有了我们创建的新镜像:
docker save 命令的基本用法
docker save
是 Docker 命令行工具中的一个命令,用于将一个或多个镜像保存为 tar 归档文件。这在需要将镜像传输到其他机器或存储介质时非常有用.
命令格式
docker save [OPTIONS] IMAGE [IMAGE...]
- IMAGE:指定要保存的镜像名称或 ID,可以同时指定多个镜像.
常用选项
-o, --output
:指定输出文件的路径,如果不指定,则输出到标准输出
举例
这样我们就可以通过这个tar文件传输给别人docker镜像了
docker save -o mynginx.tar mynginx:v1.0
docker load 命令的基本用法
docker load
是 Docker 命令行工具中的一个命令,用于从 tar 归档文件中加载镜像。这通常用于将之前使用 docker save
命令保存的镜像文件重新导入到 Docker 中.
命令格式
docker load [OPTIONS] < tar_file.tar
- tar_file.tar:指定要加载的 tar 归档文件路径.
常用选项
-i, --input
:指定输入文件的路径
举例
加载我们刚刚执行docker save
保存的tar文件
docker load -i mynginx.tar
执行docker images
查看加载的镜像
docker tag 命令的基本用法
docker tag
是 Docker 命令行工具中的一个命令,用于为现有的镜像创建一个新的标签(tag)。这通常用于重新标记镜像,以便更容易地识别和管理镜像.
命令格式
docker tag EXISTING_IMAGE NEW_IMAGE[:TAG]
- EXISTING_IMAGE:指定要重新标记的现有镜像的名称或 ID.
- NEW_IMAGE[:TAG]:指定新的镜像名称和标签. 如果不指定标签,默认为
latest
.
举例
不过我们首先需要登录dockerhub,前往去注册一个账号,执行如下命令后输入账号和密码即可:
docker login
总是报超时,网上的方法试了个遍没用....
docker tag mynginx:v1.0 besonzhang/mynginx:v1.0
docker push 命令的基本用法
docker push
是 Docker 命令行工具中的一个命令,用于将本地的镜像推送到远程镜像仓库,如 Docker Hub 或其他私有仓库。这使得你可以与他人共享你的镜像,或者在不同的机器之间同步镜像.
命令格式
docker push [OPTIONS] NAME[:TAG]
- NAME[:TAG]:指定要推送的镜像名称和标签. 如果不指定标签,默认为
latest
.
举例
推送镜像
docker push besonzhang/mynginx:v1.0
目录挂载
绑定挂载可以将宿主机上的任意路径挂载到容器内。使用以下命令进行绑定挂载:
docker run -d -v /path/on/host:/path/in/container my_image
这里的 -v
或 --mount
标志用于指定挂载的细节:
/path/on/host
是宿主机上的路径。/path/in/container
是容器内的路径。
举例
执行如下命令:
docker run -d -p 80:80 -v /app/nghtml:/usr/share/nginx/html nginx
切换到宿主机上挂载的目录:
cd /app/nghtml
修改index.html
内容
echo hello > index.html
这样会同步到运行的容器内/usr/share/nginx/html
的index.html
,我们到浏览器查看,可以发现默认的nginx
页面已经被修改了:
卷挂载
卷挂载是 Docker 管理宿主机文件系统的一部分,通常用于持久化数据。使用以下命令进行卷挂载:
docker run -d --mount source=myvolume,target=/path/in/container my_image
或者使用 -v
的语法:
docker run -d -v myvolume:/path/in/container my_image
这里的 myvolume
是卷的名字,如果它不存在,Docker 会自动创建它。
举例
不同于上面目录挂载,执行如下命令,再启动一个卷挂载的容器:
docker run -d -p 81:80 -v ngconf:/etc/nginx --name nginx-02 nginx
执行如下命令查看已创建的Docker卷:
docker volume ls
查看某个卷的相关消息,比如说创建时间、在宿主机上的挂载目录等:
docker volume inspect ngconf
下面我们修改挂载卷的数据,通过上面的卷的详细信息我们看到其在宿主机上的挂载位置(不同于目录挂载可以指定位置,而是固定的),cd来到服务器挂载目录:
修改nginx.conf
(比如添加个注释):
我们再进入容器内部, 可以看到其nginx.conf
内容的确同步修改了:
让我想到了
Vue
的双向绑定...
Docker 网络配置
我们启动两个容器:
docker run -d -p 88:80 --name app1 nginx
docker run -d -p 89:80 --name app2 nginx
使用 docker container inspect
命令可以查看容器的详细信息,包括网络配置:
docker container inspect app1
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+容器端口可以互相访问、
下面我们创建一个自定义网络:
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
就可以在同一个网络中通信
docker run -d -p 90:80 --name app3 --network mynet nginx
docker run -d -p 91:80 --name app4 --network mynet nginx
由于 app3
和 app4
都连接到了同一个自定义网络 mynet
,它们可以通过容器名称互相访问。例如,在 app4
容器中执行如下命令:
由于 app3
容器中运行的是 Nginx 服务,默认监听 80 端口,因此 curl
命令会成功访问到 app3
容器中的 Nginx 服务,并返回 Nginx 的默认欢迎页面内容
结束
别忘了删除云服务器实例...