Docker
1 安装
安装前要先卸载可能冲突的包:
sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc podman-docker containerd runc | cut -f1)卸载 Docker 时,存储在 /var/lib/docker/ 目录下的镜像、容器等不会自动删除。如果要清除所有相关数据:
# 卸载 Docker Engine、CLI、containerd 和 Docker Compose
sudo apt purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
# 删除所有镜像、容器和卷
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
# 删除 source list 和 keyrings
sudo rm /etc/apt/sources.list.d/docker.sources
sudo rm /etc/apt/keyrings/docker.asc安装步骤:
## 1. 设置 Docker 的 apt 仓库
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
## 2. 安装最新版本的 Docker
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
## 3. 运行 hello-world 镜像验证是否安装成功
sudo docker run hello-world2 快速入门
2.1 部署 MySQL
执行以下命令即可安装 MySQL:
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql2.2 镜像和容器
当我们利用 Docker 安装应用时,Docker 会自动搜索并下载应用镜像(image)。镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker 会在运行镜像时创建一个隔离环境,称为容器(container)。
镜像仓库:存储和管理镜像的平台,Docker 官方维护了一个公共仓库:Docker Hub。
2.3 命令解读
docker run:创建并运行一个容器,-d是让容器在后台运行--name mysql:给容器起名字,必须唯一-p 3306:3306:端口映射,宿主机端口:容器内端口-e KEY=VALUE:环境变量mysql:镜像名
镜像名称一般由两个部分组成:[repository]:[tag]
- 其中
repository就是镜像名 tag是镜像版本
在没有指定 tag 时,默认是 latest,代表最新版本的镜像
3 常见命令
docker pull:从镜像仓库拉取镜像到本地docker push:推送本地镜像到镜像仓库docker images:查看本地镜像列表docker rmi:删除本地镜像docker run:创建并运行一个容器docker stop:停止一个容器docker start:启动一个容器docker logs:查看容器日志docker exec:在运行中的容器内部执行命令docker ps:查看运行容器的状态docker rm:删除容器docket build:构建自定义镜像docker save:保存本地镜像为压缩文件docker load:加载镜像压缩文件
示例:
# 1. 拉取 Nginx
docker pull nginx
# 2. 查看本地列表
docker images
# 3. 保存镜像为压缩文件
docker save -o nginx.tar nginx:latest
# 4. 删除镜像
docker rmi nginx:latest
# 5. 加载镜像
docker load -i nginx.tar
# 6. 创建并运行 Nginx 容器
docker run -d --name nginx -p 80:80 nginx
# 7. 查看容器
docker ps
docker ps -a
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 8. 停止容器
docker stop nginx
# 9. 再次启动容器
docker start nginx
# 10. 查看日志
docker logs nginx
docker logs -f nginx
# 11. 进入 Nginx 容器
docker exec -it nginx bash
# 12. 删除容器
docker rm nginx
docker rm nginx -f4 数据卷
数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。
docker volume create:创建数据卷docker volume ls:查看全部数据卷docker volume rm:删除指定数据卷docker volume inspect:查看数据卷详情docker volume prune:清除数据卷
4.1 数据卷挂载
- 在执行
docker run命令时,使用-v 数据卷:容器内目录可以完成数据卷挂载 - 当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
示例:
# 需求:
# - 创建 Nginx 容器,修改容器内的 html 目录下的 index.html 文件内容
# - 将静态资源部署到 nginx 的 html 目录
# 1. 创建 nginx 容器
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
# 2. 查看全部数据卷
docker volume ls
# 3. 查看数据卷详情
docker volume inspect html4.2 本地目录挂载
在执行 docker run 命令时,使用 -v 本地目录:容器内目录 可以完成本地目录挂载。
本地目录必须以 / 或 ./ 开头,如果直接以名称开头,会被识别为数据卷而非本地目录:
-v mysql:/var/lib/mysql:会被识别为一个数据卷叫 mysql。-v ./mysql:/var/lib/mysql:会被识别为当前目录下的 mysql 目录。
示例:
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
-v /root/mysql/conf:/etc/mysql/conf.d \
mysql5 自定义镜像
镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。
5.1 镜像结构
层(Layer):添加安装包、依赖、配置等,每次操作都形成新的一层。
基础镜像(BaseImage):应用依赖的系统函数库、环境、配置、文件等
入口(Entrypoint):镜像运行入口,一般是程序启动的脚本和参数
5.2 Dockerfile
Dockerfile 就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。将来 Docker 可以根据 Dockerfile 帮我们构建镜像。常见指令如下:
| 指令 | 说明 | 示例 |
|---|---|---|
FROM | 指定基础镜像 | FROM centos:6 |
ENV | 设置环境变量,可在后面指令使用 | ENV key value |
COPY | 拷贝本地文件到镜像的指定目录 | COPY ./jre11.tar.gz /tmp |
RUN | 执行 Linux 的 shell 命令,一般是安装过程的命令 | RUN tar -zxvf /tmp/jre11.tar.gz && EXPORTS path=/tmp/jre11:$path |
EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
示例:
# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝 jar 包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]当编写好了 Dockerfile,可以利用下面命令来构建镜像:
docker build -t myImage:1.0 .-t:给镜像起名,格式为repo:tag,不指定tag时,默认为latest.:指定 Dockerfile 所在目录,如果在当前目录,就为.
6 网络
默认情况下,所有容器都是以 bridge 方式连接到 Docker 的一个虚拟网桥上。
加入自定义网络的容器才可以通过容器名互相访问,Docker 的网络操作命令如下:
| 命令 | 说明 |
|---|---|
docker network create | 创建一个网络 |
docker network ls | 查看所有网络 |
docker network rm | 删除指定网络 |
docker network prune | 清除未使用的网络 |
docker network connect | 使指定容器连接加入某网络 |
docker network disconnect | 使指定容器连接离开某网络 |
docker network inspect | 查看网络详细信息 |
示例:
docker network create zhh
# 066dbc62c39cb6558abbcd93e1f6f69421ff5e1e2c9c844a9c4b8a5e4d2767b7
docker network ls
# NETWORK ID NAME DRIVER SCOPE
# c26ce9ed4d92 bridge bridge local
# 3ed15531a5cc host host local
# a4486c6487a5 none null local
# 066dbc62c39c zhh bridge local
ip a
# 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
# link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
# inet 127.0.0.1/8 scope host lo
# valid_lft forever preferred_lft forever
# inet6 ::1/128 scope host noprefixroute
# valid_lft forever preferred_lft forever
# 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
# link/ether 08:00:27:70:a0:55 brd ff:ff:ff:ff:ff:ff
# inet 10.120.100.27/16 metric 100 brd 10.120.255.255 scope global dynamic enp0s3
# valid_lft 14103sec preferred_lft 14103sec
# inet6 2001:250:6009:120:a00:27ff:fe70:a055/64 scope global dynamic mngtmpaddr noprefixroute
# valid_lft 2591999sec preferred_lft 604799sec
# inet6 fe80::a00:27ff:fe70:a055/64 scope link
# valid_lft forever preferred_lft forever
# 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
# link/ether 06:36:d5:83:fc:32 brd ff:ff:ff:ff:ff:ff
# inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
# valid_lft forever preferred_lft forever
# inet6 fe80::436:d5ff:fe83:fc32/64 scope link
# valid_lft forever preferred_lft forever
# 12: br-066dbc62c39c: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
# link/ether da:2b:f3:93:f6:08 brd ff:ff:ff:ff:ff:ff
# inet 172.18.0.1/16 brd 172.18.255.255 scope global br-066dbc62c39c
# valid_lft forever preferred_lft forever
docker network connect zhh mysql
# 在容器创建时就加入 zhh 网络
docker run -d --name dd -p 8080:8080 --network zhh docker-demo