Docker
2639字约9分钟
2025-05-28
提示
镜像id可以换成镜像名称:版本号(REPOSITORY:TAG)
,可以使用docker images查看
[root@hadoop01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 74cc54e27dc4 4 months ago 10.1kB
[root@hadoop01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 74cc54e27dc4 4 months ago 10.1kB
[root@hadoop01 ~]# docker run -d hello-world:latest
容器id可以换成容器名称(NAMES),可以使用docker ps -a 查看
[root@hadoop01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
45ccaeea4759 2c849dee4ca9 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 3306/tcp, 33060/tcp hello
[root@hadoop01 ~]# docker stop hello
安装Docker
先卸载docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# docker 默认工作路径
rm -rf /var/lib/docker
# 添加软件源信息
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# 更新源并下载docker
yum makecache fast
yum install docker-ce docker-ce-cli containerd.io
# 启动Docker,并设置开机自启动
systemctl start docker && systemctl enable docker
# 配置docker加速
cat > /etc/docker/daemon.json << EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors" : [ "https://docker.m.daocloud.io", "https://noohub.ru", "https://huecker.io", "https://dockerhub.timeweb.cloud", "https://docker.rainbond.cc" ]
}
EOF
# 重启服务
systemctl daemon-reload && systemctl restart docker && docker info
docker version # docker版本信息
docker info # docker系统信息
docker --help # docker帮助命令
Docker运行原理图
镜像
查看镜像
[root@hadoop01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 74cc54e27dc4 4 months ago 10.1kB
REPOSITORY
镜像仓库名称
TAG
镜像版本
IMAGE ID
镜像id
CREATED
镜像创建时间,而非下载时间
SIZE
镜像的大小
查看所有镜像
[root@hadoop01 ~]# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 74cc54e27dc4 4 months ago 10.1kB
只查看镜像id
[root@hadoop01 ~]# docker images -q
74cc54e27dc4
搜索镜像
docker search 镜像名
docker search mysql
条件
# 搜索收藏大于3000的镜像
docker search mysql ----filter=STARS=3000
下载镜像
docker pull 镜像名
# 默认是最新版本
[root@hadoop01 ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
c2eb5d06bfea: Pull complete
ba361f0ba5e7: Pull complete
0e83af98b000: Pull complete
770e931107be: Pull complete
a2be1b721112: Pull complete
68c594672ed3: Pull complete
cfd201189145: Pull complete
e9f009c5b388: Pull complete
61a291920391: Downloading 133.7MB/152.4MB
61a291920391: Pull complete
c8604ede059a: Pull complete
Digest: sha256:2247f6d47a59e5fa30a27ddc2e183a3e6b05bc045e3d12f8d429532647f61358
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
指定镜像版本
docker pull mysql:5.7
[root@hadoop01 ~]# 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 -f 镜像id
[root@hadoop01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest 2c849dee4ca9 5 weeks ago 859MB
hello-world latest 74cc54e27dc4 4 months ago 10.1kB
mysql 5.7 5107333e08a8 17 months ago 501MB
# 删除镜像
[root@hadoop01 ~]# docker rmi -f 2c849dee4ca9
Untagged: mysql:latest
Untagged: mysql@sha256:2247f6d47a59e5fa30a27ddc2e183a3e6b05bc045e3d12f8d429532647f61358
Deleted: sha256:2c849dee4ca970f8b6239b63474eca214618253551666512234d3c93374c43a8
Deleted: sha256:eaee0bb4ef63e6da9e551cfaba2c0d46afa88606b2785f4d7f15d750c4d5f133
Deleted: sha256:117e216b729ebe3977f71f41b8442bd97c4e5501dd00856bbefbe8e3b1104e75
Deleted: sha256:aae25cfa93b60bff9842e16b85b8dc0c31a1fa68eafb42886571cc21cd8130c2
Deleted: sha256:ef8179479c198821a7e073e8907d21c75a7e51ab8480e8f426424f587b95e94d
Deleted: sha256:1d672b3e12099b445c35faabb031a62d299267f3f1d2a5c373291f897863885d
Deleted: sha256:97337d7553bb5ea7f4fd57b1ea5a9520c380c3ecaa2407a9ae568ff55fdf9a86
Deleted: sha256:660a7750a84470425b0b4955f30e29e06ed811fb554fc74a771d0c3a700c74fe
Deleted: sha256:9381807bb30444bce1b3a0e386bcdbfd94c113de4221c70c1e9e56afc818a0c0
Deleted: sha256:96abca174057a07b83e540a46f8272a543d1660381cbb93be04927ee0e0fcab2
Deleted: sha256:30cef8a088840030a82815ccc19187f78e7b2d5161097876d448122e664daa37
[root@hadoop01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 74cc54e27dc4 4 months ago 10.1kB
mysql 5.7 5107333e08a8 17 months ago 501MB
删除所有镜像
# 删除所有镜像
[root@hadoop01 ~]# docker rmi -f $(docker images -aq)
Untagged: hello-world:latest
Untagged: hello-world@sha256:dd01f97f252193ae3210da231b1dca0cffab4aadb3566692d6730bf93f123a48
Deleted: sha256:74cc54e27dc41bb10dc4b2226072d469509f2f22f1a3ce74f4a59661a1d44602
Untagged: mysql:5.7
Untagged: mysql@sha256:4bc6bc963e6d8443453676cae56536f4b8156d78bae03c0145cbe47c2aad73bb
Deleted: sha256:5107333e08a87b836d48ff7528b1e84b9c86781cc9f1748bbc1b8c42a870d933
Deleted: sha256:37fd5f1492d4e9cb540c52c26655f220568050438f804275e886200c8807ffb4
Deleted: sha256:1105a50d3483cb9f970e70cf5163e3352f0b2fe2ff07c6abcca6f34228e76dc5
Deleted: sha256:94187496c18bb11b78e71017f2774ad3c0a734da9749a46e917c4239504e9322
Deleted: sha256:ae59716eae3be604a4fd43e86fd2ad504cb06c89cc064c73c78eee651e675805
Deleted: sha256:97d26ca29ec287ff4bd09a49602c44cbcabcf3303ddc726b3b94cbe26dfe1c94
Deleted: sha256:27303974d12144264b32b8936ca7c90d72bdba939a9e791010201b3b1717c4c4
Deleted: sha256:4d4483f06dbe01282c10cb9e429a0be826c18c61048f7860dad49ae7f6bac927
Deleted: sha256:3b73a6f6b3298c568dcfb8fa5e96c581a1b5c0ad395b0c38f9addd0c79703124
Deleted: sha256:46446bf265a411a4a13a4adc86f60c9e0479a2e03273c98cafab7bc4151dd2bc
Deleted: sha256:1d5264146b09a27a8fc6801dc239a4962582ed27dd2fbd8ee708463a1857b06b
Deleted: sha256:cff044e186247f93aa52554c96d77143cc92f99b2b55914038d0941fddeb6623
[root@hadoop01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
容器
启动镜像
运行容器之间,需要先下载镜像
docker run [选项] 镜像id/REPOSITORY:TAG
选项:
--name name # 自定义容器名字
-d # 以后台方式运行
-it # 使用交互式方式运行(进入容器)
# 指定容器端口, -p 8080:8080 (将容器端口映射到本地)
-p 主机端口:容器端口
-P # 随机指定端口,-P(P是大写)
-v 主机目录:容器内目录 # 挂载目录
-e 配置环境
# 交互式启动,启动容器,并进入到容器中
# /bin/bash 指定终端
docker run -it centos /bin/bash
显示正在运行的容器
docker ps # 查看当前正在运行的容器
-a # 显示历史上运行过的容器
-n=N # 显示最近创建的 N 个容器
-q # 显示运行容器的id(静默模式)
[root@hadoop01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
45ccaeea4759 2c849dee4ca9 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 3306/tcp, 33060/tcp vigorous_diffie
fdce095b08a8 mysql "docker-entrypoint.s…" 2 minutes ago Exited (1) 2 minutes ago relaxed_murdock
a15940da9e8d mysql "docker-entrypoint.s…" 6 minutes ago Exited (1) 6 minutes ago optimistic_cohen
字段 | 含义 |
---|---|
CONTAINER ID | 容器id(可简写为前 12 位) |
IMAGE | 容器使用的镜像名称及标签 |
COMMAND | 容器启动时执行的命令 |
CREATED | 容器创建时间 |
STATUS | 容器状态(Up = 运行中,Exited = 已停止,Restarting = 重启中) |
PORTS | 容器端口映射情况(宿主端口:容器端口 ) |
NAMES | 容器名称(自动生成或自定义) |
退出容器,容器继续运行
当我们退出容器时,容器就会自动停止
[root@hadoop01 ~]# docker run -it 2c849dee4ca9 /bin/bash
# 输入exit退出会导致容器停止
# 按快捷键 Ctrl + P + Q 退出,则不会停止容器
bash-5.1#
[root@hadoop01 ~]#
启动容器
docker start 容器id/容器NAMES名称
进入容器
新终端打开容器
[root@hadoop01 ~]# docker exec -it 容器id/容器NAMES名称 /bin/bash
bash-5.1#
[root@hadoop01 ~]# docker exec -it 45ccaeea4759 /bin/bash
bash-5.1#
用上次进入的终端进入
[root@hadoop01 ~]# docker attach 45ccaeea4759
bash-5.1#
重启容器
docker restart 容器id/容器NAMES名称
关闭容器
docker stop 容器id/容器NAMES名称
强制停止容器
docker kill 容器id/容器NAMES名称
删除容器
docker rm 容器id/容器NAMES名称 # 删除容器,但不能删除正在运行中的容器
docker rm -f $(docker ps -aq) # 删除所有运行中的容器
端口映射
docker run -d --name 自定义名字 -p 主机端口:docker端口 REPOSITORY名
[root@hadoop01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest be69f2940aaf 5 weeks ago 192MB
mysql latest 2c849dee4ca9 5 weeks ago 859MB
[root@hadoop01 ~]# docker run -d --name nginx2 -p 1235:80 nginx
f66a0b2244446179af6f47ab9d4b99e521fafad2f35bbe7fd25699e6bd1eae45
挂载
容器目录和主机挂载点是同步的,修改挂载点时,容器中的内容会跟着发生变化,反之同理
将主机的目录挂载在docker中,这样就实现服务在docker中运行,数据则存在宿主机中
docker run -v 主机目录:容器内目录 镜像id/REPOSITORY:TAG
挂载多个挂载点
docker run -v 主机目录:容器内目录 -v 主机目录:容器内目录 镜像id/镜像名称:版本号
[root@hadoop01 ~]# docker run -d --name tamcat3 -v /home/ceshi:/home f1805af20fda
[root@hadoop01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3782c8e5e68f f1805af20fda "catalina.sh run" 22 seconds ago Up 21 seconds 8080/tcp tamcat3
[root@hadoop01 ~]# docker exec -it 3782c8e5e68f /bin/bash
root@3782c8e5e68f:/usr/local/tomcat# cd /home/
# 在容器中创建一个文件
root@3782c8e5e68f:/home# touch hello.java
root@3782c8e5e68f:/home# ls
hello.java
# 主机目录
[root@hadoop01 ceshi]# ls
hello.java
当容器被删除,主机上挂载点中的数据不会被删除
# 删除容器
[root@hadoop01 ceshi]# docker rm -f 3782c8e5e68f
3782c8e5e68f
[root@hadoop01 ceshi]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 挂载点中的内容还存在
[root@hadoop01 ceshi]# ls
hello.java
创建一个新容器时,将该容器挂载到有数据的文件夹中,容器会自动将文件夹中的数据同步过去
打包Docker镜像
当自己搭建好的docker环境打包成镜像,方便下次使用
例子:
docker中官方的tomcat访问8080是没有网页的
我们在tomcat中添加了网页,并且打包成镜像,下次使用的时候,访问8080就能访问我们现在添加的网页了
docker commit -a="作者" -m="描述信息" 容器id 自定义镜像名:版本
[root@hadoop01 ~]# docker commit -a="mao-design" -m="ceshi" dd5b86493b26 tomcat2:1.0
sha256:f1805af20fda73196ca4a12df1c73fffd2492bf362176eaac99fa073fc00d603
[root@hadoop01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
# 自己创建的镜像
tomcat2 1.0 f1805af20fda 19 seconds ago 474MB
# 官方镜像
tomcat latest c6c6349a7df2 12 days ago 468MB
[root@hadoop01 ~]# docker run -d --name tomcat12 -p 8080:8080 f1805af20fda
52dbbc78502e7c605f32a012537828da17b7402e7fe83d5d95539809c9b262bb
[root@hadoop01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
52dbbc78502e f1805af20fda "catalina.sh run" 1 second ago Up 1 second 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp tomcat12
将容器中的文件拷贝到主机中
docker cp 容器id:要拷贝的文件路径 宿主机目标路径
# 将容器45ccaeea4759中根目录下的he.txt文件拷贝到宿主机中的/opt目录下
[root@hadoop01 ~]# docker cp 45ccaeea4759:/he.txt /opt/
Successfully copied 1.54kB to /opt/
[root@hadoop01 ~]# ls /opt/
containerd he.txt
容器之间互相同步数据
有三个容器:nginx1 nginx2 nginx3
nginx2 链接 nginx1
nginx3 链接 nginx1
三个容器之间会实时同步数据
当停止 nginx1 ,nginx2 和 nginx3 之间也会实时同步数据
此时又创建一个新容器,该容器没有与上面任意三个容器链接,则该容器不会和上面三个容器实时同步数据
docker run -d -it --volumes-from 同步目标容器 --name nginx2 nginx:latest /bin/bash
nginx3
和nginx2
相互同步
docker run -d -it --volumes-from nginx1 --name nginx2 nginx:latest /bin/bash
volume数据卷
数据路径在宿主机中的 /var/lib/docker/volumes/xxx/_data
中
# 将容器中的 nginx2 文件夹挂载到 /var/lib/docker/volumes/ 中
# 由于是匿名挂载,所以主机中的挂载点是一个一长串随机数的文件夹
docker run -d -p 8083:80 --name nginx_4 -v nginx2 nginx:latest
-v 容器内路径 # 匿名挂载,挂载目录在 /var/lib/docker/volumes/随机码 中
-v 卷名:容器内路径 # 具名挂载,挂载目录在 /var/lib/docker/volumes/卷名 中
-v 宿主机路径:容器内路径 # 指定路径挂载
# 其中 :rw 表示读写权限
docker run -d -p 8083:80 --name nginx_4 -v nginx2:/etc/nginx:rw nginx:latest
命令 | 作用 |
---|---|
docker volume create | 创建数据卷 |
docker volume ls | 列出所有数据卷 |
docker volume inspect | 查看数据卷详细信息 |
docker volume rm | 删除数据卷 |
docker volume prune | 删除所有未使用的数据卷 |
[root@hadoop01 mysql]# docker run -d -p 8082:80 --name nginx_3 -v nginx1:/home nginx:latest
2ff5260425c96771a789c1b205edb67e1200e903a657a024480421cc0a3dafcb
[root@hadoop01 mysql]# docker volume ls
DRIVER VOLUME NAME
local nginx1
[root@hadoop01 mysql]# docker volume inspect nginx1
[
{
"CreatedAt": "2025-05-25T22:16:17+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/nginx1/_data",
"Name": "nginx1",
"Options": null,
"Scope": "local"
}
]
数据库
[root@hadoop01 home]# docker run -d --name mysql_5.7 -p 3306:3306 -v /home/mysql/conf.d:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
e4c5edb2cbd31a62b53cfab9a77600732fcc7e39a151fb6428b4d1c365a09cc0
[root@hadoop01 home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e4c5edb2cbd3 mysql:5.7 "docker-entrypoint.s…" 3 seconds ago Up 3 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql_5.7
更改镜像版本
docker tag 容器id 更改名:版本号
推送镜像
# 登录docker账号
docker login -u docker用户名
docker push 容器名:版本号
查看容器内部的进程信息
docker top 容器id
[root@hadoop01 ~]# docker top 45ccaeea4759
UID PID PPID C STIME TTY TIME CMD
root 18062 18041 0 00:22 pts/0 00:00:00 /bin/bash
显示docker内部服务的日志信息
docker logs 容器id
[root@hadoop01 ~]# docker logs 8e26b4e9eda7
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
查看容器的详细信息
docker inspect
用于获取容器或者镜像的详细配置信息和运行时状态,返回 JSON 格式的完整数据
docker inspect 容器id/容器名
docker inspect nginx_1
Docker的Web管理平台
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer