Docker

是什么

Docker是一个流行的容器化平台,用于构建、部署和管理应用程序。它允许开发人员将应用程序及其所有依赖项打包到一个称为容器的独立单元中。这个容器可以在任何支持Docker的环境中运行,包括开发人员的个人计算机、测试环境和生产环境。

Docker利用操作系统级虚拟化技术(例如Linux容器)来提供轻量级、可移植和隔离的执行环境。使用Docker,开发人员可以创建一个独立的容器,其中包含应用程序的代码、运行时环境、系统工具和所有依赖项。这个容器可以在任何地方运行,而无需担心环境差异或依赖项冲突。

Docker具有许多优点,包括:

  • 简化应用程序部署:使用Docker可以轻松地在不同环境中部署应用程序,而无需再次配置和安装依赖项。
  • 快速启动和停止:容器可以在几秒钟内启动和停止,提高了开发和测试的效率。
  • 资源隔离:每个容器拥有自己的文件系统、进程空间和网络接口,确保容器之间的应用程序隔离和安全性。
  • 可扩展性:通过使用Docker容器,开发人员可以轻松地扩展应用程序,根据需要添加或删除容器实例。
  • 生态系统支持:Docker拥有丰富的生态系统,提供了许多现成的容器镜像和工具,使开发人员能够快速构建和部署应用程序。

总之,Docker提供了一种简单、灵活和可移植的方式来封装和交付应用程序,帮助开发人员加快开发周期,提高应用程序的可移植性和可伸缩性。

如何安装

官方文档Ubuntu安装

选择你对应的系统,查看安装步骤,这里演示Ubuntu系统

image-20230808144357114

卸载Docker相关的包

1
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done

设置Docker存储库

允许apt通过HTTPS使用存储库

1
2
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg

添加Docker官方GPG密钥(不知道啥意思)

1
2
3
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

设置远程仓库

1
2
3
4
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

更新包索引

1
sudo apt-get update

安装Docker引擎

安装最新版,包含DockercontainerdDocker Compose

1
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

运行一个镜像测试是否安装成功,它将会在控制台打印一段话

1
sudo docker run hello-world

image-20230808150946420

常用命令

服务

1
2
3
4
5
6
7
8
9
10
11
12
# 启动Docker服务
systemctl start docker
# 关闭Docker服务
systemctl stop docker
# 查看Docker服务状态
systemctl status docker
# 重启Docker服务
systemctl restart docker
# 开启Docker服务的开机启动
systemctl enable docker
# 关闭Docker服务的开机启动
systemctl disable docker

镜像

镜像标签,例如Hello-World:0.1,格式为[镜像名]:[标签],不带标签即为最新版本

1
2
3
4
5
6
7
8
# 检索仓库中的镜像
docker search <--limite [限制多少行]> <--filter ["筛选条件"]> [镜像名称]
# 查看本地所有的镜像
docker images
# 删除一个镜像
docker rmi [镜像标签]/[镜像ID]
# 从远程拉取镜像
docker pull [镜像标签]

容器

相同指令的参数可以任意组合使用,这里只演示部分组合

创建容器

1
2
3
4
5
6
7
8
9
10
# 运行一个镜像,并为容器命名,其中命名的=符号可以换为空格
docker run --name=[容器名称] [镜像标签]/[镜像ID]
# 运行一个镜像并为容器指定TCP端口映射,并挂在后台运行
docker run -d -p [本机端口]:[容器端口]/tcp [镜像名称]/[镜像ID]
# 运行一个镜像并创建基本的输入输出流,指定UDP端口映射,并给出一个终端,使用`ctrl+p+q`退出可以保留终端
docker run -it -p [本机端口]:[容器端口]/udp [镜像标签]/[镜像ID] bash
# 运行一个镜像,并映射目录,:rw表示双向绑定,--privileged=true是赋予容器足够高的权限操作本地机器
docker run -d -v [本机目录]:[容器目录]:rw --privileged=true [镜像标签]/[镜像ID]
# 将某个容器的卷共享给此容器
docker run -it --privileged=ture --volumes-from [容器名称]/[容器ID] --name [容器名称] [镜像标签]/[镜像ID]

管理容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 重新运行一个被停掉的容器
docker start [容器名称]/[容器ID]
# 正常关闭一个容器
docker top [容器名称]/[容器ID]
# 强制关闭一个容器
docker kill [容器名称]/[容器ID]
# 删除一个容器
docker rm [容器名称]/[容器ID]
# 将容器打包成镜像
docker commit [容器ID]/[镜像标签]
# 重新进入容器,并开启新的终端,使用`ctrl+p+q`退出可以保留终端
docker exec -it [容器名称]/[容器ID] bash
# 重新进入容器的终端,使用`ctrl+p+q`退出可以保留终端
docker attach -it [容器名称]/[容器ID]

查看容器

1
2
3
4
5
6
# 查看正在运行的容器
docker ps
# 查看所有的容器,包括已经被关闭的容器
docker ps -a
# 查看容器的详细信息
docker inspect [容器名称]/[容器ID]

安装软件

MySQL

挂载数据卷,暴露端口,指定root用户的密码,并在后台运行

1
2
3
4
5
6
7
8
9
docker run -d \
-p 3306:3306 \
--privileged=true \
-v [本机目录]:/var/log/mysql \
-v [本机目录]:/var/lib/mysql \
-v [本机目录]:/etc/mysql/conf.d \
-e MYSQL_ROOT-PASSWORD=[root密码] \
--name [容器名] \
[mysql镜像标签]

Redis

挂载数据卷,暴露端口,启动服务时使用自定义的配置文件,并在后台运行

1
2
3
4
5
6
7
8
docker run -d \
-p 6379:6379 \
--name [容器名] \
--privileged=true \
-v [本机目录].conf:/etc/redis/redis.conf \
-v [本机目录]:/data \
[redis镜像标签] \
redis-server /etc/redis/redis.conf

虚悬镜像

没有名字与标签的镜像,一般在构建镜像或者删除镜像操作不当时出现

1
2
3
4
# 查看所有的虚悬镜像
docker image ls -f dangling=true
# 删除所有的虚悬镜像
docker image prune

Docker网络

目前了解到的Docker网络有(不懂网络…):

  1. 桥接网络
  2. 主机网络
  3. 空白网络
  4. 自定义网络
1
2
3
4
5
6
7
8
9
10
# 查看所有的网络
docker network ls
# 创建网络,默认为桥接
docker network create [网络名称]
# 删除一个网络
docker network rm [网络名称]/[网络ID]
# 查看网络描述
docker network inspect [网络名称]
# 创建容器时指定网络
docker run --name [容器名] -d --network [网络名] -p [本机端口]:[容器端口] [镜像标签]/[镜像ID]

Dockerfile

DockerFile|菜鸟教程

用于制作Docker镜像的文件,基本步骤如下:

  1. 创建Dockerfile文件
  2. 编写Dockerfile的逻辑,并在当前目录下配置需要的文件或目录
  3. 在当前目录下执行docker build -t [新镜像标签] .,注意命令的最后有个.,表示当前目录

扩展

Docker-Compose

官网文档菜鸟教程

1
2
3
4
5
6
7
# 安装
sudo apt-get update
sudo apt-get install docker-compose-plugin
# 查看版本号
docker compose version
# 卸载
sudo apt-get remove docker-compose-plugin

Compose常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
docker-compose -h                           # 查看帮助
docker-compose up # 启动所有docker-compose服务
docker-compose up -d # 启动所有docker-compose服务并后台运行
docker-compose down # 停止并删除容器、网络、卷、镜像。
docker-compose exec [yml里面的服务id] # 进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker-compose ps # 展示当前docker-compose编排过的运行的所有容器
docker-compose top # 展示当前docker-compose编排过的容器进程
docker-compose logs [yml里面的服务id] # 查看容器输出日志
docker-compose config # 检查配置
docker-compose config -q # 检查配置,有问题才有输出
docker-compose restart # 重启服务
docker-compose start # 启动服务
docker-compose stop # 停止服务

yaml配置实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# yaml 配置实例
version: '3'

services:
  microService:
  image: [镜像标签]
  container_name: [容器名]
  ports:
  - "6001:6001"
  volumes:
  - /app/microService:/data
  networks:
  - xxx
  depends_on:
  - redis
  - mysql
  redis:
  image: [镜像标签]
  ports:
  - "6379:6379"
  volumes:
  - /app/redis/redis.conf:/etc/redis/redis.conf
  - /app/redis/data:/data
  networks:
  - [网络名称]
  command: redis-server /etc/redis/redis.conf
 
  mysql:
  image: [镜像标签]
  environment:
  MYSQL_ROOT_PASSWORD: '[root密码]'
  MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
  MYSQL_DATABASE: 'xxx'
  MYSQL_USER: 'xxx'
  MYSQL_PASSWORD: 'xxx'
  ports:
  - "3306:3306"
  volumes:
  - /app/mysql/db:/var/lib/mysql
  - /app/mysql/conf/my.cnf:/etc/my.cnf
  - /app/mysql/init:/docker-entrypoint-initdb.d
  networks:
  - [网络名称]
  command: --default-authentication-plugin-mysql_native_password # 解决外部无法访问

networks:
[网络名称]:

Portainer

Docker轻量级图形化工具,web版,官网在这里

Docker容器监控

CAdvisor+InfluxDB+Grafana,与Portainer相比,这个更为重量级。

参考文章

Docker 配置国内源加速(2023/05/14)

使用cAdvisor+Influxdb+Grafana监控系统