Docker 学习记录(一)
因为个人学习需要,利用空闲时间学习一下Docker相关内容,主要看的B站上狂神的视频,讲解的十分清晰透彻,因此特此进行学习记录。
一、Docker 中的相关名词解释
镜像(image):
一个模版,可以通过这个模版创建容器服务,通过一个镜像可以创建多个容器(最终的项目运行于容器中)。
容器(Container):
一个或是一组独立运行的应用,通过镜像创建;
有启动、停止、删除等基本命令。
仓库(Repository):
存放镜像的地方,分为共有仓库和私有仓库,Docker Hub默认为国外源,可以通过配置阿里云的镜像加速器。
二、Docker 安装
因为本人使用的电脑为MacOS系统,因此安装的 Docker 为桌面版,直接通过 Docker 官网进行下载即可。如果是使用的服务器需要命令行的下载过程,可以检索一下下载过程,应该有许多相应的资源。
三、配置阿里云镜像加速
注册成为阿里云用户以后,选择容器镜像服务,在镜像工具中选择镜像加速器,就可以看见右侧有个加速器地址,将它复制下来。
打开我们下载好的 Docker for Mac ,等它初始化成功后,点击右上角的小齿轮,进入设置界面,打开右侧边栏的Docker Engine
,在其中添加一个字段registry-mirrors
,值为上面复制的加速器地址,效果如下图所示。
四、Docker 整体流程和原理
4.1 Docker Run 的流程
4.2 Docker 底层原理
Docker 是一个 Client-Server 结构的系统,Docker 的守护进程运行在主机上,通过Socket 从客户端访问,Docker Server 接收到 Docker Client 的指令,就会执行该命令。
Docker具有以下特点:
- 抽象层更少;
- 利用宿主主机的内核,虚拟机需安装Guest OS。
因此必须虚拟机的速度更快。
五、Docker的常用命令
5.1 帮助命令
docker version # 显示 Docker 的版本信息
docker info # 显示 Docker 的系统信息
docker xxx --help # 帮助命令
帮助文档地址:https://docs.docker.com/reference/
5.2 镜像命令
docker images
:查看所有本地的主机上的镜像
~ % docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker/getting-started latest 720f449e5af2 13 months ago 27.2MB
# 解释
>> REPOSITORY:镜像的仓库源
>> TAG :镜像的标签
>> IMAGE ID :镜像的id
>> CREATED :镜像的创建时间
>> SIZE :镜像的大小
# 查看可选项
~ % docker images --help
Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]
List images
Options:
-a, --all # 列出所有镜像
-q, --quiet # 只显示镜像的ID
docker search
:搜索镜像信息
~ % docker search mysql # 查询mysql镜像
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 13694 [OK]
mariadb MariaDB Server is a high performing open sou… 5230 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 722 [OK]
percona Percona Server is a fork of the MySQL relati… 598 [OK]
bitnami/mysql Bitnami MySQL Docker Image 80 [OK]
databack/mysql-backup Back up mysql databases to... anywhere! 79
linuxserver/mysql-workbench 48
ubuntu/mysql MySQL open source fast, stable, multi-thread… 41
...
# 查看可选项
~ % docker search --help
Usage: docker search [OPTIONS] TERM
Search the Docker Hub for images
Options:
-f, --filter filter 过滤条件
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
# 过滤出STARS大于3000的镜像 使用 --filter=STARS=3000
~ % docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 13694 [OK]
mariadb MariaDB Server is a high performing open sou… 5230 [OK]
docker pull
:拉取镜像
# 下载镜像 docker pull 镜像名:tag
~ % docker pull mysql
Using default tag: latest # 如果不写 tag,则默认为 latest
latest: Pulling from library/mysql
12a06ca91af8: Pull complete # 分层下载,docker image 的核心,联合文件系统
1fec1cb1944f: Pull complete
aede38c79379: Pull complete
51b980849561: Pull complete
f503d79ed4bc: Pull complete
6fb44db361f7: Pull complete
943b6dcee7de: Pull complete
911277c1fe4b: Pull complete
a477017d0457: Pull complete
84b5061403a5: Pull complete
5ff27d035d66: Pull complete
Digest: sha256:3d7ae561cf6095f6aca8eb7830e1d14734227b1fb4748092f2be2cfbccf7d614 # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
# 指定版本下载
~ % docker pull mysql:5.7
# 因为电脑芯片不一样,因此此处下载失败,未搜索到arm的版本,可以自行尝试
~ % docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest 7b6f3978ca29 5 weeks ago 550MB
docker/getting-started latest 720f449e5af2 13 months ago 27.2MB
docker rmi
:删除镜像
# 删除我们刚刚下载的 mysql 镜像
~ % docker rmi -f 7b6f3978ca29
Untagged: mysql:latest
Untagged: mysql@sha256:3d7ae561cf6095f6aca8eb7830e1d14734227b1fb4748092f2be2cfbccf7d614
Deleted: sha256:7b6f3978ca2905ae9bc14cfe86ae2f004f8c36561b722a06f64b73001b1898a5
Deleted: sha256:b0d765a548cab4cff3aacc1f5efb2fff41f0bf39f952487effbe8fa6e978979b
Deleted: sha256:c99602fe82b50c593a30ab0f5205bb8ea4820841cfe8b33222ed1afbac9e0dba
Deleted: sha256:6525369564ad174b448e1b845ac3d0f01b690198c056ebc8b39dcf0ca6affb58
Deleted: sha256:d0c38e5af4b7bd949ad8703128b8ea7f69afd24cafe54a2fc4779b1dc20855cd
Deleted: sha256:a46b9598fc64a06c362274a8c3f74a9a232f046917da0243e26a5b93d9cd7d79
Deleted: sha256:293284e8f84e7017e879cf8b4087b22b42642a77017eff856ea38ce69b8ef124
Deleted: sha256:771d067fcad5899cc5726a8bcb3dc7efb05bf7acaa366d2c004017a2d7bf4b7a
Deleted: sha256:1ff72726c717dea4b94b117b2806aaf765399fc8ca6576426c7263b6991c0138
Deleted: sha256:99ef9db9899dcba7d6c3402c52bbd717431b5b51410c5649388d5e752127c354
Deleted: sha256:8047c30bed75790cf803710aa256b21d3e69e8247f2123ccdbb817563a98b7e8
Deleted: sha256:57f5fe95c403b4633698a828dba5a31f8b15ab1636d3b5a233c8356352260522
# 删除命令
docker rmi -f 镜像ID # 删除指定的镜像
docker rmi -f 镜像ID 镜像ID 镜像ID ... # 删除多个镜像
docker rmi -f $(docker images -aq) # 删除全部的镜像
5.3 容器命令
当我们拥有镜像,才能创建对应的容器,因此为了进行简单测试,拉取一个 CentOS 镜像进行相应操作。
~ % docker pull centos
Using default tag: latest
latest: Pulling from library/centos
52f9ef134af7: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
docker run
:新建容器并启动容器的命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# 参数说明
--name="Name" 容器名字,用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口 (常用)
-p 容器端口
容器端口
-P 随机指定端口
--rm 用后就删除
# 测试,启动并进入容器
~ % docker run -it centos /bin/bash
[root@8079b170c601 /]# ls # 查看容器内的内容,此为基础版本
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
# 从容器中退出
[root@8079b170c601 /]# exit
exit
docker ps
:列出所有容器
# docker ps 参数说明
# 列出当前正在运行的容器
-a # 列出当前正在运行的容器 + 带出历史运行过的容器
-n=? # 显示最近创建的容器
-q # 只显示容器的编号
~ % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
~ % docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2534ab7c0e06 centos "/bin/bash" 10 seconds ago Exited (0) 6 seconds ago admiring_hodgkin
0beb28f7c003 docker/getting-started "/docker-entrypoint.…" 4 days ago Exited (0) 4 days ago adoring_kowalevski
- 退出容器
exit # 直接容器停止并退出
ctrl + p + q # 容器不停止退出,Mac系统按键相同
~ % docker ps # 运行容器后退出查看运行中的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cbb965651525 centos "/bin/bash" 33 seconds ago Up 32 seconds kind_matsumoto
- 删除容器
docker rm 容器ID # 删除指定的容器,不能删除正在运行的容器,如果需要强制删除,使用 rm -f
docker rm -f $(docker images -aq) # 删除所有的容器
docker ps -a -q |xargs docker rm # 删除所有的容器
- 启动和停止容器
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制停止当前容器
5.4 其他常用命令
docker run -d 镜像名
:后台启动容器
# 会出现问题,使用 docker ps,发现容器停止了
# docker 容器使用后台运行,必须要有一个前台进程,docker 发现没有应用就会自动停止
# 为了方便后面的演示,这里启动了一个 CentOS 容器
~ % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
35267f0fb66e centos "/bin/bash" 2 minutes ago Up 2 minutes mycentos
docker logs 容器ID
:查看日志
# 可选参数说明
-tf # 显示日志
--tail number # 显示日志条数
# 测试
~ % docker logs -tf 35267f0fb66e
2023-01-18T12:01:10.051402833Z [root@35267f0fb66e /]# clear
2023-01-18T12:01:10.051644625Z bash: clear: command not found
2023-01-18T12:01:14.593637044Z [root@35267f0fb66e /]# exit
2023-01-18T12:01:14.593717419Z exit
docker top 容器ID
:查看容器中的进程信息
# 测试
~ % docker top 35267f0fb66e
UID PID PPID C
root 4358 4332 0
docker inspect 容器ID
:查看镜像的元数据
# 测试
~ % docker inspect 35267f0fb66e
[
{
"Id": "35267f0fb66ef0ab7f540403a96c2fc4daa9f5c23f599061cdffef0a0efc04df",
"Created": "2023-01-18T12:01:04.191507095Z",
"Path": "/bin/bash",
"Args": [],
... # 后面太长了,此处省略后面内容
docker exec -it 容器ID /bin/bash
ordocker attach 容器ID
:进入当前正在运行的容器
# 测试 -- 方法一
~ % docker exec -it 35267f0fb66e /bin/bash
[root@35267f0fb66e /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
[root@35267f0fb66e /]# ps
PID TTY TIME CMD
15 pts/1 00:00:00 bash
30 pts/1 00:00:00 ps
[root@35267f0fb66e /]# exit
exit
# 测试 -- 方法二
~ % docker attach 35267f0fb66e
[root@35267f0fb66e /]# exit
exit
二者的区别:
exec
:进入容器后开启一个新的终端,可以在里面操作(常用)attach
:进入容器正在执行的终端,不会启动新的进程
docker cp 容器ID:容器内文件路径 主机中目标路径
:从容器内拷贝文件到主机上
# 启动该容器
~ % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
35267f0fb66e centos "/bin/bash" 4 hours ago Up 15 minutes mycentos
~ % docker attach 35267f0fb66e
[root@35267f0fb66e /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
[root@35267f0fb66e /]# cd home
[root@35267f0fb66e home]# ls
# 在容器内创建一个文件
[root@35267f0fb66e home]# touch test.java
[root@35267f0fb66e home]# ls
test.java
~ % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
35267f0fb66e centos "/bin/bash" 4 hours ago Up 16 minutes mycentos
# 将文件拷贝出来到主机上
~ % docker cp 35267f0fb66e:/home/test.java ~
~ % ls
test.java
注:拷贝过程容器是否启动都能进行,容器ID是不变的。拷贝是一个手动的过程,未来可以使用 -v 卷的方式,同步主机和容器的目录。
docker stats 容器ID
:查看docker占用内存等信息
# 查看已启用的 CentOS
~ % docker stats 35267f0fb66e
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
35267f0fb66e mycentos 0.01% 4.836MiB / 3.841GiB 0.12% 1.18kB / 0B 6.35MB / 0B 1