1. 卸载docker
- 查看是否安装了docker
bash
yum list | grep docker
- 卸载老版本docker,拷贝自官网
bash
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- 卸载新版本
bash
yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
2. 安装
- 阿里的源好像不能用,这是清华的源
bash
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sed -i 's+https://download.docker.com+http://mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
- 启动docker
bash
sudo systemctl start docker
- 停止docker
bash
sudo systemctl stop docker
- 设置docker为自启动
bash
sudo systemctl enable --now docker
3. 配置仓库
- 如果没有daemon.json 文件,创建文件
bash
vim /etc/docker/daemon.json
- 配置
bash
# 写入配置文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.1ms.run"
]
}
EOF
- 重启docker
bash
# 重启docker服务
systemctl daemon-reload && sudo systemctl restart docker
5. 镜像与容器的常用命令
操作类型 | 命令 | 说明 |
---|---|---|
镜像操作 | docker pull [镜像名称]:[标签] |
拉取指定镜像,若不指定标签,默认拉取latest 标签镜像 |
docker images |
列出本地已有的镜像 | |
docker rmi [镜像ID或镜像名称:标签] |
删除指定的镜像,支持镜像ID或镜像名称+标签 | |
容器操作 | docker run [选项] [镜像名称] [命令] |
创建并运行容器,-itd 表示交互、终端、后台运行;--name 可指定容器名称 |
docker ps |
列出当前正在运行的容器 | |
docker ps -a |
列出所有容器,包括已停止的容器 | |
docker inspect [容器ID或容器名称] |
查看容器详情 | |
docker exec -it [容器ID或容器名称] /bin/bash |
进入正在运行的容器并执行指定命令,常搭配/bin/bash 进入容器终端 |
|
docker stop [容器ID或容器名称] |
停止指定的容器 | |
docker start [容器ID或容器名称] |
启动已停止的容器 | |
docker rm [容器ID或容器名称] |
删除指定容器,若容器在运行需先停止;docker rm -f [容器ID或容器名称] 可强制删除 |
|
docker rm $(docker ps -aq) |
删除所有未运行的容器 |
- 创建并运行容器
-d:后台运行
--name:起别名,如果不指定,会随机生成别名
-p 81:80:端口映射
tomcat后面没有跟标签,默认启动latest
bash
docker run -d --name=mytomcat2 -p 6001:8080 tomcat
docker run -d --name=mynginx1 -p 81:80 nginx
- 从容器构建镜像并提交到仓库
- 和ghost系统差不多
bash
# 1. 查看正在运行的容器列表,获取目标容器的CONTAINER ID
docker ps
# 2. 提交容器为镜像(格式:docker commit [容器ID] [镜像名称:标签]),这里的容器是自己修改过后的
docker commit your-container-id your-image-name:latest
# 3. 为镜像添加仓库标签(格式:docker tag [本地镜像] [仓库地址/镜像名称:标签])
docker tag your-image-name:latest your-username/your-repo:v1.0
# 4. 登录Docker仓库(首次推送需要登录)
docker login
# 5. 推送镜像到仓库(格式:docker push [仓库地址/镜像名称:标签])
docker push your-username/your-repo:v1.0

6. 数据卷
- 宿主机目录不存在,容器内目录存在 :启动容器进行挂载时,Docker 会在宿主机上创建对应的目录,并将容器内该目录下的所有文件和子目录复制到宿主机新建的目录中。
- 宿主机目录存在,容器内目录存在 :挂载时,容器内目录会被宿主机目录的内容覆盖。
- 我理解就是给容器内的文件或目录做一个硬连接,连接到宿主机的某个目录或文件,以达到数据持久化的目的
1. 在启动容器时绑定挂载
特点: 允许将宿主机任意目录或文件挂载到容器中,灵活性高。
- 这里省略了run命令的很多其他参数,例如:-p、-d
bash
docker run -v [宿主机路径]:[容器内路径]:[权限] 镜像名 [命令]
示例:
- 挂载目录
bash
docker run -v /home/user/data:/app/data -it ubuntu bash
- 挂载文件
bash
docker run -v /home/user/config.txt:/app/config.txt -it ubuntu bash
2. 命名数据卷
特点: 创建容器时显式指定名称的数据卷。方便管理和识别,即使容器删除,也可通过名称访问、管理数据卷。
命令 | 说明 |
---|---|
docker volume create [数据卷名称] |
创建一个新的数据卷 |
docker volume ls |
列出所有已创建的数据卷 |
docker volume rm [数据卷名称] |
删除指定的数据卷 |
- 创建数据卷
默认会在:/var/lib/docker/volumes/ 下创建my_volume目录
bash
docker volume create my_volume
- 将其挂载到容器内的 /app/data 目录
bash
docker run -v my_volume:/app/data -it ubuntu bash
7. 常用软件
- mysql
- 绑定挂载
bash
docker run -itd \
-p 33061:3306 \
-v /root/mysql/conf:/etc/mysql/conf.d \
-v /root/mysql/data:/var/lib/mysql \
--name='mysql' \
-e MYSQL_ROOT_PASSWORD=123456 \
-e TZ=Asia/Shanghai \
mysql:8.4 \
--lower_case_table_names=1
解释
docker run
:用于运行容器的命令。-itd
:-i
表示交互式操作,-t
为容器分配伪终端,-d
使容器在后台运行。-p 33061:3306
:将宿主机 33061 端口映射到容器内 3306 端口,方便从外部访问容器内 MySQL 服务。-v /root/mysql/conf:/etc/mysql/conf.d
:把宿主机/root/mysql/conf
目录挂载到容器内/etc/mysql/conf.d
目录,用于存放 MySQL 配置文件。-v /root/mysql/data:/var/lib/mysql
:将宿主机/root/mysql/data
目录挂载到容器内/var/lib/mysql
目录,保存数据库数据。--name='mysql'
:为容器命名为mysql
,方便后续管理和识别。-e MYSQL_ROOT_PASSWORD=123456
:设置容器内 MySQL 的 root 用户密码为123456
,创建mysql容器必须的。-e TZ=Asia/Shanghai \
:设置时区mysql:8.4
:指定使用的 MySQL 镜像及版本为 8.4 。--lower_case_table_names=1
:传递给 MySQL 服务的启动参数,设置表名不区分大小写,linux中严格区分大小写,所以设置不区分。
- 命名挂载
- 创建命名数据卷
bash
docker volume create mysql_conf_volume
docker volume create mysql_data_volume
- 启动MySQL容器并挂载命名数据卷
bash
docker run -itd \
-p 33062:3306 \
-v mysql_conf_volume:/etc/mysql/conf.d \
-v mysql_data_volume:/var/lib/mysql \
--name='mysql1' \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.4 \
--lower_case_table_names=1
- tomcat
bash
docker run -itd \
--name=tomcat_8001 \
-v /root/tomcat/8001:/usr/local/tomcat/webapps \
-p 8001:8080 \
tomcat:10.0-jdk17
- nginx
先随便创建一个nginx的容器,并拷贝3个文件夹,拷贝后就删除这个容器
bash
# 配置文件
docker cp nginx:/etc/nginx /root/nginx/conf
# 日志
docker cp nginx:/var/log/nginx /root/nginx/log
# 项目目录
docker cp nginx:/usr/share/nginx/html /root/nginx/html
bash
docker run -itd \
-p 81:80 \
-v /root/nginx/conf/nginx:/etc/nginx \
-v /root/nginx/log:/var/log/nginx \
-v /root/nginx/html:/usr/share/nginx/html \
--name=nginx_81 \
nginx
-v /root/nginx/conf/nginx:/etc/nginx \
:第一步拷贝出来的是一个名为nginx的目录,里面是配置文件,可以到/root/nginx/conf/nginx中查看一下
8. Dockerfile
命令 | 说明 |
---|---|
docker build -t [镜像名称]:[标签] . |
在包含Dockerfile 的目录下,根据Dockerfile 构建镜像,. 表示当前目录 |
通过Dockerfile构建自己的镜像,文件内容像是将手动构建的过程转成代码
- 构建tomcat
bash
# 基于centos镜像构建一个新的镜像
FROM centos:7
# 标记作者
LABEL author="zhaoyun"
# 把当前目录下的文件复制到容器的/user/local目录下
# ADD和COPY都可以复制文件,ADD兼有解压tar包的功能
ADD jdk-17.0.15_linux-aarch64_bin.tar.gz /usr/local
ADD apache-tomcat-10.1.40.tar.gz /usr/local
# 修改解压后目录的名字
RUN mv /usr/local/jdk-17.0.15 /usr/local/jdk
RUN mv /usr/local/apache-tomcat-10.1.40 /usr/local/tomcat
# 声明变量
ENV JAVA_HOME=/usr/local/jdk
ENV CATALINA_HOME=/usr/local/tomcat
# 声明环境变量
ENV CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
ENV PATH=$JAVA_HOME:$CATALINA_HOME/bin:$CATALINA_HOME/lib:$PATH
# 指定工作目录(docker exec -it 进入容器后的目录)
WORKDIR /usr/local/tomcat
# 暴露端口
EXPOSE 8080
# 启动tomcat
CMD ["catalina.sh","run"]
执行构建指令
bash
docker build -t mytomcat:10.1 .
运行镜像,在浏览器的8010端口就可以使用了
bash
docker run -itd --name=tomcat10.1 -p 8010:8080 mytomcat:10.1
-
docker build -t mytomcat:10.1 .
:注意最后的.
,意思就是Dockerfile在当前目录下;构建的镜像名:mytomcat,标签:10.1 -
注意这两句代码
ADD jdk-17.0.15_linux-aarch64_bin.tar.gz /usr/local
、RUN mv /usr/local/jdk-17.0.15 /usr/local/jdk
,ADD是将tar包解压到local目录中,RUN中运行的是更改目录名字的命令,jdk的tar包解压后的名字不是:jdk-17.0.15_linux-aarch64_bin
。tar包解压后的名字是什么需要自己解压看一下,RUN中的命令执行不了改名会报错 -
目录结构:
两个目录不是必须得,这里是解压了两个tao包看解压后名字的。
- 在idea中构建镜像
编辑Dockerfile文件
bash
# OpenJDK 17 镜像作为基础镜像
FROM openjdk:17
# 创建工作目录
RUN mkdir -p /root/app
# 设置工作目录,后续操作都在该目录下进行
WORKDIR /root/app
# 将当前目录下的 target 目录中的 jar 包复制到容器内的 /app 目录下
# 请将 your_application.jar 替换为实际的 JAR 包名称
COPY ./jar/hello.jar /root/app/app.jar
# 暴露容器运行时的端口,根据实际 JAR 应用监听的端口修改
EXPOSE 8080
# 定义容器启动时执行的命令,用于运行 JAR 包并指定配置文件位置
CMD ["java", "-jar", "/root/app/app.jar"]
- 这里的配置比上一个tomcat的配置简单好多,因为tomcat是以centos为基础镜像,需要配置Path等环境变量,这里是以jdk为基础镜像,在基础镜像中已经配置好了环境变量,在本镜像中直接使用就可以了
9. 网络
命令 | 说明 |
---|---|
docker network create [网络名称] |
创建一个新的Docker网络 |
docker network ls |
列出所有已创建的Docker网络 |
docker network connect [网络名称] [容器ID或容器名称] |
将指定容器连接到指定网络 |
dock的网络模式共有4种,这里介绍两种常用的模式
- 默认情况
- 桥接网络(bridge)
- 原理:这是 Docker 默认的网络驱动。当你创建一个新容器时,若不指定网络模式,它会自动连接到桥接网络。Docker 会创建一个名为 docker0 的虚拟网桥,容器通过虚拟网卡连接到该网桥,实现容器之间以及容器与宿主机的通信。
- 特点:容器有独立的 IP 地址,可通过 IP 相互访问。不过,桥接网络是隔离的,不同的桥接网络之间默认无法直接通信。
通俗理解,Docker在启动时会创建一个类似路由器的东西,名为docker0,地址:172.17.0.1,每开一个容器,Docker会给容器分配一个ip地址,例如:172.17.0.2、172.17.0.3,可以通过docker inspect [容器名或ID]
查看,容器直接可以通过此网络互相访问

- 将多个容器划分成一组,类似给网络划分vlan
- 容器之间可以通过自定义的名字互相访问
- 创建自定义桥接网络
bash
docker network create my_custom_network
此命令会创建一个名为 my_custom_network
的自定义桥接网络。
-
将容器连接到自定义网络
创建容器时,通过
--network
参数指定要连接的网络。 -
示例:启动多个容器并连接到自定义网络
bash
# 启动一个 MySQL 容器并连接到自定义网络
docker run -d --name mysql_container --network my_custom_network -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
# 启动一个应用容器并连接到自定义网络
docker run -d --name app_container --network my_custom_network my_app_image
在上述示例中,mysql_container
是 MySQL 数据库容器,app_container
是应用程序容器,它们都连接到了 my_custom_network
网络。
容器间的访问方式
- 通过容器名称访问
在自定义网络中,容器能够使用其他容器的名称作为主机名来进行访问。这是因为 Docker 会自动为每个容器创建 DNS 记录,使得容器间可以通过名称解析 IP 地址。
示例:应用容器访问 MySQL 容器
假设 app_container
是一个需要连接 MySQL 数据库的应用程序,它可以使用 mysql_container
作为主机名来连接数据库。以下是在 app_container
内使用命令行工具连接 MySQL 的示例:
bash
docker exec -it app_container mysql -h mysql_container -u root -p123456
在应用程序代码里,配置数据库连接时也可以使用容器名称:
python
import mysql.connector
mydb = mysql.connector.connect(
host="mysql_container",
user="root",
password="123456",
database="your_database"
)
# 执行数据库操作
- 通过 IP 地址访问
你也可以通过查看容器的 IP 地址,然后使用 IP 地址进行访问。
查看容器 IP 地址
bash
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql_container
上述命令会输出 mysql_container
的 IP 地址。
使用 IP 地址访问
bash
docker exec -it app_container mysql -h <mysql_container_ip> -u root -p123456
将 <mysql_container_ip>
替换为实际的 IP 地址。