Docker笔记

Docker 官方镜像仓库

Ubuntu 22.04 下 Docker 安装(最全指引)

安装

Ubuntu 20.04为例。

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
# 安装前先卸载操作系统默认安装的 docker
sudo apt-get remove docker docker-engine docker.io containerd runc

# 安装必要支持
sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release

# 使用阿里源
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 阿里 apt 源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 更新源
sudo apt update
sudo apt-get update

# 安装最新版本的 Docker
sudo apt install docker-ce docker-ce-cli containerd.io

# 查看 Docker 版本
sudo docker version

# 查看 docker 镜像
sudo docker images

# 查看 Docker 运行状态
sudo systemctl status docker

要实现远程访问,修改/lib/systemd/system/docker.service文件:

1
2
3
4
5
6
7
8
# 找到 ExecStart 配置,注释并复制一行,在末尾加上 -H tcp://0.0.0.0:2375
# ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375

# 保存退出

systemctl daemon-reload
service docker restart

命令

1
2
3
4
5
6
docker run -d \
--name mysql \
-p 3307:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql

反斜杠代表未换行,所以上面实际是一行命令。每一个Docker命令都以docker开头,run表示创建一个容器并运行,-d是后台运行。--name给容器起名字,名字必须唯一。-p是端口映射,外部无法直接访问到容器的端口,所以需要先访问宿主机的3307端口,再映射到镜像的3306端口。-e是设置容器的环境变量,可以查看文档,时区一般都要改,否则容器内的时间是默认时区。最后的mysql是指定运行的镜像的名字,完整写法是mysql:5.7,后面是版本号,省略默认最新版。

Docker常用命令

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
# 查看所有本地镜像
docker images

# 删除指定的本地镜像
docker rmi {镜像名}

# 创建容器并运行,见上面的例子
docker run -d {镜像名}
docker run -dit {镜像名}

# 运行容器
docker start {容器名}

# 停止容器
docker stop {容器名}

# 销毁容器,需要停止容器才能销毁,或 -f 强制销毁
docker rm {容器名}

# 查看所有容器状态
docker ps
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"

# 进入容器内部操作,-it 代表使用可交互终端的方式,bash 代表使用 bash 命令进行交互。也可以直接跟命令
docker exec -it {容器名} bash
docker exec -it {容器名} mysql -u root -p

# 查看容器日志
docker logs {容器名}
docker logs -f {容器名} # 持续输出日志

# 将指定镜像保存为 saved-image.tar 压缩包
docker save -o saved-image.tar {镜像名}:latest

数据卷

由于镜像中只有必要的环境,多数情况下没有vim,要修改容器中的文件,需要用到数据卷挂载,将容器内的目录和宿主机的目录形成映射关系。

数据卷挂载只能在容器创建时设置。

宿主机的/var/lib/docker/volumes目录下存放所有的数据卷映射,其中/var/lib/docker/volumes/{数据卷名称}/_data中的文件与映射的容器内目录的文件一致,且保持同步。

Docker常用命令

1
2
3
4
5
6
7
8
9
10
11
# 创建数据卷
docker volume create

# 删除指定数据卷
docker volume rm

# 查看所有数据卷
docker volume ls

# 查看某数据卷详情
docker volume inspect

在创建容器时添加-v {数据卷名}:{要映射的容器内目录}

1
2
3
4
5
docker run -d \
--name nginx \
-p 80:80 \
-v nginx:/usr/share/nginx/html
nginx

创建容器时,若挂载了数据卷且数据卷不存在,会自动创建数据卷。