Skip to content

安装docker

shell
# 安装前先删除docker
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
# 安装需要的包
yum install -y yum-util
# 设置镜像仓库(阿里云)
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新yum软件包索引(非必须,推荐更新下)
yum makecache fast
# 安装docker-ce (推荐社区版)
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 启动docker
systemctl start docker
# 查看是否安装成功
docker version

通过运行hello-world镜像来验证安装是否成功

shell
[root@VM-4-8-centos ~]# docker run hello-world
Unable to find image 'hello-world:latest' locally	 # 本地没找到
latest: Pulling from library/hello-world		    # 去拉取此镜像  
c1ec31eb5944: Pull complete 					   # 拉取完成
Digest: sha256:305243c734571da2d100c8c8b3c3167a098cab6049c9a5b066b6021a60fcb966
Status: Downloaded newer image for hello-world:latest

Hello from Docker!								# 出现说明安装成功
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

卸载docker

sh
# 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 删除资源
rm -rf /var/lib/docker  # docker默认工作路径

docker命令

docker镜像搜索地址

docker官方文档地址

sh
# 运行管理
systemctl start docker			# 启动 docker
systemctl stop docker			# 关闭 docker
systemctl restart docker		# 重启 docker
systemctl status docker			# 查看 docker 运行状态
systemctl enable docker			# 设置自启动
docker version 				    # 显示 docker 的版本信息
docker info 				    # 显示 docker 的系统信息,包括镜像和容器数量
docker 命令 --help			  # 万能帮助命令

# 镜像拉取
docker search [OPTIONS]			# 搜索镜像,例:docker search mysql
docker pull [OPTIONS]			# 拉取镜像,例:docker pull mysql 没有制定版本则默认最新版 

docker images	# 查看镜像列表
docker ps		# 查看正在运行的镜像
docker ps -a	# 查看所有镜像(包括已停止的)
docker ps -qa	# 查看所有镜像的ID(包括已停止的)
docker top		# 查看容器中的进程信息
docker stats	# 查看容器的资源使用情况

docker run -d -p8080 --name [指定名称] [容器id] # 创建一个新的容器并启动它。可以使用-d参数在后台运行,-p参数映射端口,--name指定容器名称

docker create [容器名]	# 创建一个新的容器但不启动它。可以指定容器名称和所使用的镜像

镜像命令

docker start
docker restart
docker stop
启动一个已创建的容器
重启一个运行的容器
停止一个运行的容器
docker exec
docker attach
docker logs
docker cp
在运行的容器中执行命令
连接到正在运行的容器
查看容器的日志输出,可以使用-f参数实时查看。
将文件或目录从容器复制到宿主机,或将文件从宿主机复制到容器
docker rmi -f [xxx]
docker container prune
docker rename [xxx]
删除一个或多个停止的容器
删除所有停止的容器
重命名一个容器

docker images

查看所有镜像

docker images [OPTIONS] [REPOSITORY[:TAG]]

sh
# 参数说明
[-a] or [--all]		# 列出所有镜像
[-q] or [--quiet]	# 只显示镜像的id

[root@VM-4-8-centos ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    d2c94e258dcb   19 months ago   13.3kB

# 解释
REPOSITORY	# 镜像的仓库源
TAG			# 镜像的标签
IMAGE ID	# 镜像id
CREATED		# 镜像创建时间
SIZE		# 镜像大小

搜索镜像

docker search [OPTIONS]

sh
# 参数说明
[-f] or [--filter]	# 过滤,过滤STARS>3000的: docker search mysql --filter=STARS=3000

[root@VM-4-8-centos ~]# docker search mysql
NAME                   DESCRIPTION                                     STARS     OFFICIAL
mysql                  MySQL is a widely used, open-source relation…   15516     [OK]
bitnami/mysql          Bitnami container image for MySQL               120       
circleci/mysql         MySQL is a widely used, open-source relation…   30   
...

docker pull

下载镜像

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

sh
# 参数说明
[:TAG] 	# 指定版本号,不写默认最新版

[root@VM-4-8-centos ~]# docker pull mysql
Using default tag: latest	# 如果不写[TAG],默认就是最新版本
latest: Pulling from library/mysql
2c0a233485c3: Pull complete # 分层下载,docker images 的核心,联合文件系统
cb5a6a8519b2: Pull complete 
570d30cf82c5: Pull complete 
a841bff36f3c: Pull complete 
80ba30c57782: Pull complete 
5e49e1f26961: Pull complete 
ced670fc7f1c: Pull complete 
0b9dc7ad7f03: Pull complete 
cd0d5df9937b: Pull complete 
1f87d67b89c6: Pull complete 
Digest: sha256:0255b469f0135a0236d672d60e3154ae2f4538b146744966d96440318cc822c6	# 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest	# 真实地址
# docker pull mysql 等价于 docker pull docker.io/library/mysql:latest

# 指定版本
[root@VM-4-8-centos ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
20e4dcae4c69: Pull complete 
1c56c3d4ce74: Pull complete 
e9f03a1c24ce: Pull complete 
68c3898c2015: Pull complete 
6b95a940e7b6: Pull complete 
90986bb8de6e: Pull complete 
ae71319cb779: Pull complete 
ffc89e9dfd88: Pull complete 
43d05e938198: Pull complete 
064b2d298fba: Pull complete 
df9a4d85569b: Pull complete 
Digest: sha256:4bc6bc963e6d8443453676cae56536f4b8156d78bae03c0145cbe47c2aad73bb
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

docker rmi

删除镜像

docker rmi [OPTIONS] IMAGE [IMAGE...]

docker rmi -f $(docker images -aq) 删除所有镜像

sh
[root@VM-4-8-centos ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
mysql         latest    56a8c14e1404   5 weeks ago     603MB
mysql         8.0       6c55ddbef969   5 weeks ago     591MB
mysql         5.7       5107333e08a8   11 months ago   501MB
hello-world   latest    d2c94e258dcb   19 months ago   13.3kB

# 删除指定镜像 docker rmi -f 5107333e08a8
[root@VM-4-8-centos ~]# docker rmi -f 5107333e08a8 56a8c14e1404 ...
Untagged: mysql:5.7
Untagged: mysql@sha256:4bc6bc963e6d8443453676cae56536f4b8156d78bae03c0145cbe47c2aad73bb
Deleted: sha256:5107333e08a87b836d48ff7528b1e84b9c86781cc9f1748bbc1b8c42a870d933
Deleted: sha256:37fd5f1492d4e9cb540c52c26655f220568050438f804275e886200c8807ffb4
...

[root@VM-4-8-centos ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
mysql         latest    56a8c14e1404   5 weeks ago     603MB
mysql         8.0       6c55ddbef969   5 weeks ago     591MB
hello-world   latest    d2c94e258dcb   19 months ago   13.3kB

# 删除所有镜像
[root@VM-4-8-centos ~]# docker rmi -f $(docker images -aq)
Untagged: mysql:latest
Untagged: mysql@sha256:0255b469f0135a0236d672d60e3154ae2f4538b146744966d96440318cc822c6
Deleted: sha256:56a8c14e14044b8ec7ffb4dd165c8dbe10d4c6ba3d9e754f0c906f52a0b5b4fb
...
Untagged: mysql:8.0
Untagged: mysql@sha256:d58ac93387f644e4e040c636b8f50494e78e5afc27ca0a87348b2f577da2b7ff
Deleted: sha256:6c55ddbef96911f9f36d1330ffe3f7557c019d49434e738cafabd1a3dd6b4bac
...
Untagged: hello-world:latest
Untagged: hello-world@sha256:305243c734571da2d100c8c8b3c3167a098cab6049c9a5b066b6021a60fcb966
Deleted: sha256:d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a

[root@VM-4-8-centos ~]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

容器命令

docker run

创建一个新容器 并 启动

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

docker run 运行原理图

image-20241125155641744

sh
# 参数说明
[--name="name"]   # 容器名字,用来区分容器
[-d] 			 # 后台方式运行
[-it]			 # 使用交互方式运行,进入容器查看内容
[-P]			 # 随机指定端口(大写)
[-p]			 # 指定容器端口 -p 8080:8080,下面列出四中使用方式
	[-p 127.0.0.1:8080:8080]  # ip:主机端口:容器端口
	[-p 8080:8080] 			 # 主机端口:容器端口(常用)
	[-p 8080] 				 # 容器端口
	[容器端口]				  # 容器端口


# 测试,启动并进入容器
[root@VM-4-8-centos ~]# docker run -it centos /bin/bash
[root@7af32a2a5687 /]# ls	# 容器内的centos,基础版本,很多命令都没有
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@7af32a2a5687 /]# exit		# 退出容器
exit

退出容器

sh
exit 			# 容器停止并退出
Ctrl + P + Q	 # 容器不停止退出

docker start / restart / stop

启动/重启/停止容器

docker start [OPTIONS] CONTAINER [CONTAINER...]

docker restart [OPTIONS] CONTAINER [CONTAINER...]

docker stop [OPTIONS] CONTAINER [CONTAINER...]

sh
docker start [容器id]		# 启动容器
docker restart [容器id]	# 重启容器
docker stop [容器id]		# 停止容器
docker kill [容器id]		# 强制停止容器

docker ps

列出所有正在运行的容器

docker ps [OPTIONS]

sh
# 参数说明
[]		# (不加参数)列出当前正在运行的容器
[-a]	# 列出当前正在运行的容器+曾经运行过的容器
[-n=?]	# 列出最近创建的容器
[-q]	# 只列出容器id,一般配合-a使用,[-aq]

[root@VM-4-8-centos ~]# docker ps	# 查看正在运行的容器,因为上面已经退出了所以看不到
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@VM-4-8-centos ~]# docker ps -a	# 查看曾经启动个过的容器
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                     PORTS     NAMES
7af32a2a5687   centos    "/bin/bash"   4 minutes ago   Exited (0) 2 minutes ago             modest_keldysh
[root@VM-4-8-centos ~]# docker ps -n=1	# 列出最近1次创建的容器
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
7af32a2a5687   centos    "/bin/bash"   14 minutes ago   Exited (0) 11 minutes ago             modest_keldysh
[root@VM-4-8-centos ~]#

docker rm

删除容器(不会删除镜像)

docker rm [OPTIONS] CONTAINER [CONTAINER...]

sh
# 参数说明
[-f]							  # 强制删除
docker rm -f [id]				   # 删除单个容器(不加 -f 不能删除正在运行的容器)
docker rm -f $(docker ps -aq)		# 删除所有容器
docker ps -aq|xargs docker rm		# 删除所有容器
	[docker ps -aq]		 # 列出所有容器id
	[|]			   		# 表示将前一个命令的输出作为后一个命令的输入
	[xargs docker rm [-f] ]	 # 会将前面获取到的容器 ID 列表传递给 docker rm 命令,从而实现批量删除这些容器。
	

[root@VM-4-8-centos ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
794c7f701ab9   centos    "/bin/bash"   41 seconds ago   Up 41 seconds             zealous_euclid
[root@VM-4-8-centos ~]# docker rm -f 794c7f701ab9
794c7f701ab9

部署应用

前提已有 Dockerfile 文件,如果没有需要先编写,或找AI编写一个

sh
# 先把包含 Dockerfile 的项目传到服务器对应位置,我这里传到了 /soft/docker-projects/
# 连接到服务器并进入项目目录, 查看项目文件,应该看到 Dockerfile 文件
cd /soft/docker-projects/flask_project

# 构建镜像(注意最后的点),flask-tools 是项目名,你可以改成任何名字,也可以不跟项目一样
docker build -t flask-tools .
# 查看构建进度和结果(非必需)
docker images | grep flask-tools
# 运行容器,映射端口5000
docker run -d -p 5000:5000 --name flask-utils-container flask-utils
# 查看容器状态
docker ps
# 查看应用日志
docker logs flask-utils-container
# 测试项目接口(此命令与docker无关)
curl http://localhost:5000/health


# 其他操作(非必需)
# 进入容器内部
docker exec -it flask-utils-container /bin/bash
# 在容器内检查文件
ls -la

重新部署应用(更新项目)

sh
# 方案一 
# 一行命令完成更新部署
docker stop flask-utils-container && docker rm flask-utils-container && docker build -f Dockerfile.fixed -t flask-utils . && docker run -d -p 5000:5000 --name flask-utils-container flask-utils

# 方案二
# 1. 停止并删除旧容器
docker stop flask-utils-container
docker rm flask-utils-container

# 2. 删除旧镜像(可选,但建议删除以确保使用最新代码)
docker rmi flask-utils

# 3. 重新构建镜像 (指定配置文件 Dockerfile.fixed 构建镜像)
docker build -f Dockerfile.fixed -t flask-utils .

# 4. 运行新容器
docker run -d -p 5000:5000 --name flask-utils-container flask-utils

# 5. 验证部署
docker ps
docker logs flask-utils-container