15.4 Docker使用
Docker的操作主要分为从远端仓库获取镜像→实例化容器→对容器修改或编写应用代码→创建Dockerfile→构建镜像→上传远端仓库6个步骤。可以看出,Docker的使用主要是对仓库、镜像、容器三个对象的操作。
15.4.1 仓库操作
目前最大的镜像仓库是Docker Hub,进入Docker Hub网站可检索所需的镜像,例如检索PostgreSQL镜像,如图15-6所示。可以看到,MySQL镜像获取命令是docker pull postgres,最新Tag有13.11-bullseye、13-bullseye、13-bookworm、13等,下载量100K+, Tags下可查看不同的Tag,Tag可理解为镜像版本。
图15-6 PostgreSQL镜像
当我们注册了Docker Hub账号,在创建仓库时可选择私有或公开,如果有新的镜像推送到仓库中,便可像图15-6一样检索查看。
由于从Docker Hub服务器拉取镜像时速度缓慢,甚至出现timeout(超时)的情况,此时可通过配置镜像源来解决。例如,我们设置镜像源为中国科技大学镜像(http://mirrors.ustc.edu.cn/)。打开Docker程序并进入设置界面,在左边菜单栏中选择【Docker Engine】,输入框中添加一句{"registry-mirrors":["https://mirrors.ustc.edu.cn/"]},如图15-7所示。最后,单击应用并重启生效。
图15-7 设置镜像源
如果要添加多个镜像源,需要在方括号里使用逗号隔开。
15.4.2 镜像操作
镜像的常见操作主要有查找镜像、拉取镜像、拉取指定Tag镜像、查看本地镜像、移除镜像和将镜像推送到远端仓库等。
1. 查找镜像
如果要查找镜像,主要有两种方法,一是在镜像仓库中查找,二是通过命令docker search [OPTIONS] TERM在本机中查找,[OPTIONS]是可选参数,可以使用的参数如下:
·-f或--filter:基于给定的条件过滤。例如 -f stars=30表示筛选stars数大于30的镜像。
· --format string:使用Go模板输出格式友好的信息。
· --limit int:限制搜索结果的最大数,默认值是25。
· --no-trunc:不截断输出,完整输出镜像信息。
例如,查找stars大于10的前5个PostgreSQL镜像,命令为docker search –f stars=10 --limit 5 PostgreSQL,执行结果如图15-8所示。
图15-8 查找Postgres镜像
2. 拉取镜像
拉取镜像的命令是docker pull [OPTIONS] NAME[:TAG|@DIGEST],NAME为镜像名称,后面可指定拉取的Tag。[OPTIONS]可选参数如下:
· -a或--all-tags:拉取镜像中所有Tag的镜像文件。
· --disable-content-trust:忽略镜像的校验,默认开启。
· --platform string:如果是多平台,则指定平台。
· -q或--quite:精简输出。
例如,可使用docker pull postgres:latest命令获取Postgres镜像的latest版本,如果不指定Tag则默认为最新的latest版本。如图15-9所示是获取Postgres镜像的最新版本。
图15-9 拉取Postgres镜像
3. 查看本地镜像
查看本地镜像的命令是docker images [OPTIONS] [RESPOSITORY[:TAG]],[OPTIONS]可选参数如下:
· -a或—all:显示所有镜像。
· -q或—quiet:只显示镜像ID。
例如,查看本地镜像,结果如图15-10所示。
图15-10 查看本地镜像
可以看到本地存在一个postgres镜像。
4. 移除镜像
移除镜像的命令是docker rmi [OPTIONS] IMAGE [IMAGE...],IMAGE 可以是镜像ID、镜像名、镜像名:TAG中任意一个,[OPTIONS]可选参数如下:
· -f或--force:强制删除。
· --no-prune:不移除该镜像的过程镜像,默认移除。
例如,删除本地镜像Postgres,执行结果如图15-11所示。
图15-11 删除本地镜像Postgres
移除后再查看本地镜像,可以看到被删除的镜像已经不存在了。
15.4.3 容器操作
容器的常见操作主要有创建容器、启动容器、查看容器状态、终止容器运行、进入容器、删除容器和容器提交为镜像等。
1. 创建容器
创建容器的命令是docker run [OPTIONS] IMAGE [COMMAND] [ARG...],[OPTIONS]常用参数如下:
· -i或--interactive:启动一个可交互的容器,并持续打开标准输入。
· -t或--tty:使用终端关联到容器的标准输入输出上。
· -d或--detach:将容器放置在后台运行。
例如,创建一个PostgreSQL容器,首先使用docker pull postgres命令拉取镜像,然后使用docker run -it --name postgres-test --restart always -e POSTGRES_PASSWORD='postgres' -e ALLOW_IP_PANGE =0.0.0.0/0 -p 5432:5432 -d postgres命令创建容器,如图15-12所示。
图15-12 创建Postgres容器
创建容器用到的参数如下:
· --name:容器名称。
· --restart always:Docker在重启时容器自动启动。
· -e POSTGRES_PASSWORD:设置数据密码。
· -e ALLOW_IP_PANGE:设置允许访问的IP,0.0.0.0/0表示所有。
· -p:映射端口,写法是[宿主机端口:容器端口] ,5432:5432就是将容器的5432端口映射到宿主机的5432端口。外部机器连接时,便可用宿主机IP:5432访问。
当看到一串字符串(容器ID)后,就表示容器创建成功。
2. 查看容器状态
使用命令docker ps [OPTIONS]可查看容器的状态,[OPTIONS]常用参数如下:
· -a或--all:查看所有容器。
· -f或--filter:根据条件进行过滤。
例如,使用命令docker ps -a查看所有容器的状态,结果如图15-13所示。
图15-13 查看容器状态
可以看到,刚才创建的容器ID是9fee9d51dd35,状态是Up 12 minutes的表示启动了12min,名字为postgres-test。
3. 终止容器运行
终止容器运行的命令是docker stop [OPTIONS] CONTAINER [CONTAINER...],[OPTIONS]可选参数如下:
· -s或--signal string:自定义发送至容器的信号,例如-s KILL。
· -t或--time int:在指定的时间后终止容器的运行,时间单位为秒。
例如,使用docker stop postgres-test命令终止postgres-test容器的运行,结果如图15-14所示。
图15-14 终止容器运行
容器终止后,再查看容器状态,可以看到显示为Exited。
4. 启动容器
容器终止后需要再次启动,启动容器的命令是docker start [OPTIONS] CONTAINER [CONTAINER...],例如使用命令docker start postgres-test启动postgres-test容器,结果如图15-15所示。
图15-15 启动容器
从图15-15中可以看到,启动器的容器状态是Exited,启动后的容器状态是Up。
5. 进入容器
如果需要对容器里面的内容进行操作,就需要先进入容器。命令是docker exec [OPTIONS] CONTAINER COMMAND [ARG...],我们经常使用docker exec -it CONTAINER /bin/bash命令进入容器bash,例如使用命令docker exec -it postgres-test /bin/bash进入postgres-test容器,如图15-16所示。
图15-16 进入容器
从图15-16中可以看到,成功进入到容器中,并执行了su postgres命令。
进入容器命令可与创建容器命令结合使用,例如创建容器成功后直接进入容器bash,使用命令docker run -it --name postgres-test --restart always -e POSTGRES_PASSWORD='postgres' -e ALLOW_IP_PANGE=0.0.0.0/0 -p 5432:5432 -d postgres /bin/bash。
进入容器后,输入exit或按快捷键Ctrl+D,可退出容器。
6. 将容器提交为镜像
容器修改后,可通过命令docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]将容器提交为镜像。[OPTIONS]常用参数如下:
· -a或--author string:创建镜像的作者。
· -m或--message string:提交说明或描述。
例如,使用命令docker commit -m="first commit" -a="tynam" postgres-test?将postgres-test容器提交为名为postgres-test的镜像,如图15-17所示。
图15-17 容器提交为镜像
提交镜像后再使用docker images命令可查看本地镜像,从图15-17中可以看到有一个postgres-test的镜像。
7. 删除容器
删除容器的命令是docker rm [OPTIONS] CONTAINER [CONTAINER...],例如,使用命令docker rm postgres-test删除容器postgres-test,如图15-18所示。
图15-18 删除容器
从图15-18中可以看到,删除容器postgres-test后,本地容器中就不再存在postgres-test容器了。
注意,如果容器正在运行是不允许被删除的,只有停止状态的容器才可以删除。