赞
踩
要求掌握程度:熟练掌握
本文为一位不知名 Cpper 学习Docker容器的学习笔记,不谈原理,只谈使用方法,不喜勿喷。
记录自己的学习过程,与自己赛跑,永远在路上。
如有遗漏或者错误,请评论区理性交流、指正。别杠我,杠就是你对。
在开始 Docker 之前,我先说明一下 Docker 镜像和 Docker 容器是什么。
Docker 镜像是一个描述容器如何运行的的文件,Docker 容器是 Docker 镜像在运行或被终止时的一个阶段。
容器和主机上的其他文件是隔离的。
当我们运行一个 Docker 容器的时候,它会使用一个被隔离出来的文件系统,这个文件系统是由一个 Docker 镜像提供的。Docker 镜像包含了运行应用程序所需要的一切东西 - 所有的依赖、配置、脚本、二进制文件等等。
镜像也包含容器所需要的其他配置项,比如说环境变量、默认运行的命令,以及其他元数据。
Docker 优点:
这里仅介绍 Ubuntu Docker 安装,更多安装方法可参考:Docker菜鸟教程。
直接官方安装 shell 脚本自动安装,大佬想手动安装请随意,具体参考上面的菜鸟教程链接。
curl -fsSL https://test.docker.com -o test-docker.sh
sudo sh test-docker.sh
如果要使用 Docker 作为非 root 用户,则应考虑使用类似以下方式将用户添加到 docker 组:
sudo usermod -aG docker your-user
删除安装包:
sudo apt-get purge docker-ce
删除镜像、容器、配置文件等内容:
sudo rm -rf /var/lib/docker
国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:
- 科大镜像:https://docker.mirrors.ustc.edu.cn/
- 网易:https://hub-mirror.c.163.com/
- 阿里云:https://<你的ID>.mirror.aliyuncs.com
- 七牛云加速器:https://reg-mirror.qiniu.com
其中,阿里云需要自己去官网注册id,不是很推荐。
对于 Ubuntu 16.04+的用户,打开 /etc/docker/daemon.json
写入以下内容(如果文件不存在就新建该文件):
{
"registry-mirrors":[
"https://docker.mirrors.ustc.edu.cn/",
"https://hub-mirror.c.163.com/",
"https://reg-mirror.qiniu.com"
]
}
图-1 Docker文件配置
重启服务:
sudo systemctl daemon-reload
sudo systemctl restart docker
检查加速器是否生效:
手动检查加速器配置是否生效,在命令行执行 docker info
,如果从结果中看到了如下内容,说明配置成功。
docker info
图-2 检查加速是否生效
我们可以从叫做 Docker hub 的 Docker 官方库获得镜像,或者我们也可以制作自己的镜像。
有些人可能不清楚,Docker hub 是一个线上的中心化仓库,Docker 用户们在上面构建、测试、然后保存他们的 Docker 镜像。Docker hub 有数以万计的 Docker 镜像,而且这个数字还在每天增长。
你可以从命令行通过 docker search
命令搜索任意 Docker 镜像。
比如需要搜索基于Ubuntu的镜像时,输入以下指令:
sudo docker search ubuntu
你会得到这样的结果:
图-3 搜索ubuntu结果
如果你想搜索其他任意的应用,比如 Nginx,只需要在docker search
后面添加对应的名称就可以:
sudo docker search Nginx
Docker hub 有各种各样的镜像。你能在 Docker hub 上找到各种已构建好的 Docker 镜像,比如说操作系统、应用,或者多个应用的合体(比如 LAMP 栈)。
如果我们需要下载Ubuntu的镜像,可以使用下面的命令:
sudo docker pull ubuntu
这个命令会默认下载最新的版本 ubuntu:latest
,如果需要指定对应版本,可以在 ubuntu 后面添加对应的版本号(其余镜像同理):
sudo docker pull ubuntu:20.04
运行上述指令会得到下面的结果:
图-4 下载ubuntu 20.04
所有已下载的 Docker 镜像都保存在 /var/lib/docker
路径下。可以使用下面这条指令来查看我们已经下载的全部 Docker 镜像:
sudo docker images
输出结果:
图-5 查看Docker镜像
各个选项说明:
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 Ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
从上面可以看出来,我已经下载了两个 Docker 镜像 - Ubuntu 15.10、Ubuntu 20.04。
现在,我们看一下接下来如何从下载的镜像启动或者运行容器。
Docker容器启动方法有两个:使用 Docker 镜像的标签(TAG) 或者 镜像ID(Image ID)。
标签(TAG) 指的是一个特定的镜像快照,镜像 ID(Image ID) 是那个镜像对应的唯一识别码。
下载选择好的 Docker 镜像后,运行下面的命令来启动 Docker 容器,并且通过它的标签进行连接:
sudo docker run -t -i ubuntu:20.04 /bin/bash
或者
sudo docker run -it ubuntu:20.04 /bin/bash
参数说明:
- -i: 交互式操作。
- -t: 终端。
- ubuntu:20.04: 这是指用 ubuntu 20.04 版本镜像为基础来启动容器。如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
启动容器后,会自动进入容器的 shell(命令行):
图-6 启动Docker容器
基于 Ubuntu 20.04 镜像的容器启动成功。所有的新容器都会被赋予一个名字和唯一的 ID(注意,容器ID不同于 Image ID),图-6中的 Ubuntu 容器 ID 是 c5cfbe7d8553
。一会儿我们会看到从哪找到容器的名字。
现在咱们就可以在容器里面进行工作。当你完成容器内的工作后,你可以回到主机操作系统的终端而不需要关掉容器(客户机)。
另一种启动容器并且连接进去的方式是通过使用镜像 ID,像下面这样:
$ sudo docker run -it c5cfbe7d8553 /bin/bash
这里,
c5cfbe7d8553
- 镜像 ID使用 CTRL+P
然后 CTRL+Q
就可以从运行中的容器脱离(不需要关闭)。
现在,你就回到了你原来的主机的终端窗口。请注意,容器还在后台运行中,我们并没有关掉它。
上面说咱们使用 CTRL+P
然后 CTRL+Q
指令从运行中的容器中脱离出来,咱们也可以直接使用-d
指令在脱离模式(不需要自动连接进去)中启动容器。
sudo docker run -it -d ubuntu:15.10
输出结果为:
4608a616cc12ca83b5755d27e66b8a7a8470c05f946e343643de12c873e5462d
其中前12个字符代表咱们启动容器的容器ID,即为4608a616cc12
。
如果你想进入该容器,可以输入attach
连接指令:
sudo docker attach 4608a616cc12
图-7 连接Docker容器
可以看到,我们成功连接到该Docker容器。
如果我们想查看正在运行中的 Docker 容器,可以输入ps
命令:
sudo docker ps
可以看到刚才启动的两个容器均处于运行状态:
图-8 查看运行Docker
这里,
4608a616cc12
是由镜像 ubuntu:15.10
创建的 Ubuntu 容器的 ID, musing_jackson
是这个容器的名字。c5cfbe7d8553
是由镜像 ubuntu:20.04
创建的 Ubuntu 容器的 ID。并且,admiring_kowalevski
是这个容器的名字。当一个新容器被创建后,会赋给它一个唯一的 ID 和名字,这样我们就能通过它的 ID 和名字来连接它。
注意:容器 ID 和 Docker 镜像 ID 是不同的。
如果需要列出所有可用的(运行或者停止)容器,运行:
sudo docker ps -a
首先,通过 docker ps
命令找到容器的 ID。
sudo docker ps
然后,运行 docker attach
命令连接到运行中的容器。
sudo docker attach <container-id>
比如像下面这样,我要连接到 ID 为 4608a616cc12
的容器:
sudo docker attach 4608a616cc12
你也可以通过使用它的名字连接到一个容器。
sudo docker attach musing_jackson
现在你就登录到这个容器了。
想要从容器脱离,只要按 CTRL+P
然后 CTRL+Q
。
可以使用容器的名字或 ID 来启动,重启,暂停或者终止一个 Docker 容器。
如果你需要启动一个 Docker 容器,需要下面两步:
第一步,通过 sudo docker ps -a
命令找到容器的名字或 ID。
第二步,通过使用 sudo docker start
命令,加上名字或 ID,启动容器:
sudo docker start <container-name>
sudo docker start <container-id>
中间使用空格隔开,能够同时启动多个容器,像下面这样:
sudo docker start <container-id1> <container-id2> <container-id3>
优雅地重启一个运行中的容器,运行:
sudo docker restart --time=30 <container_name_or_id>
其中 --time=30
表明等待30秒,让容器有足够的时间来完成未完成的任务并优雅退出。
暂停一个运行中的容器:
sudo docker pause <container_name_or_id>
把暂停的容器恢复过来:
sudo docker unpause <container_name_or_id>
直到其它容器都停止前,阻塞一个容器:
sudo docker wait <container_name_or_id>
我们可以很容易地通过使用它的名字或 ID 来终止一个容器。
如果你已经在容器的 shell 里了,只需要运行下面的命令就可以非常简单的终止:
exit
你也可以使用下面的命令从 Docker 的主机系统中终止(关闭容器)容器:
sudo docker stop <container_name_or_id>
用空格隔开,你可以退出多个容器,像下面这样。
sudo docker stop <container-id1> <container-id2> <container-id3>
在退出容器之后,通过列出所有运行中容器的命令来查看容器是否被正确关闭:
sudo docker ps
docker stop
命令可以非常优雅的关掉运行中的容器。有时候,你可能卡在一个没有响应的容器,或者你想强制关掉容器。
通过给一个运行中的容器发送 SIGKILL
来强行关闭容器,运行:
sudo docker kill <container-id1>
也许你想测试一个容器,然后当你完成在容器中的工作就把它删掉。如果是这样,通过使用 --rm
标签在关闭后自动删掉容器:
sudo docker run -it --rm ubuntu:15.10
当你从容器中退出,它会自动被删掉。
图-9 退出自动删除Docker
从上面的结果可以看到,我先创建了一个新的 Ubuntu 容器。当我退出这个容器的时候,它就被自动删掉了。docker ps -a
命令的输出结果显示,Ubuntu 容器现在不存在。
我们上面创建容器的时候,没有为它命名,Docker 会自动给它命名为一个随机名字,如图-9中的admiring_kowalevski
。
如果我们想自己为启动的容器定义一个确定的名字,可以使用--name
命令。比如,我们启动一个 Ubuntu 15.10 的容器,将他命名为 ubuntu15:
sudo docker run -it --name ubuntu15 ubuntu:15.10
我们使用sudo docker ps
看一下当前运行的容器列表:
图-10 自定义命名Docker
Docker 不仅仅是下载和使用已存在的容器。你也可以创建自己的自定义 Docker 镜像。
现在我们开始一个 Ubuntu 容器:
sudo docker run -it ubuntu:20.04
现在,你会进入到容器的 shell。
然后,在容器中,你可以安装任何的软件或者做你想做的事情。
比如,我们在容器中安装 Apache Web 服务器,可以输入以下指令:
apt update
apt install apache2
相应的,你可以根据自己的需要安装和测试软件。
完成以后,从容器脱离(不要退出)回到主机系统的 shell。不要终止或者关闭容器。使用 CTRL+P
然后 CTRL+Q
从容器中脱离,这样不会关闭容器。
然后在本机终端输入sudo docker ps
查看运行容器。
最后,创建一个当前运行中的容器的 Docker 镜像,使用命令:
sudo docker commit 77468878bae8 zeroone/ubuntu_apache
其中:
- 77468878bae8 容器ID
- zeroone 创建容器用户名
- ubuntu_apache 用户zeroone创建的Docker镜像名字
输出结果:
sha256:94c59982e88f21ecd95162f967b6516e0a5190c3999fac507b174602dfd54cc6
现在我们查看一下新的 Docker 镜像是否被创建了,使用下面的命令:
sudo docker images
输出结果:
图-11 自定义Docker镜像
从上面给的结果中可以看到,从运行中的容器创建的新 Docker 镜像已经存在于我们的 Docker 主机系统中。
现在你就可以从这个新的 Docker 镜像创建行容器了,用之前的命令:
sudo docker run -it zeroone/ubuntu_apache
进入后,输入apache2 -v
可以看到我们在docker中安装的 Apache。
输出:
Server version: Apache/2.4.41 (Ubuntu)
Server built: 2023-03-08T17:32:54
如果我们不再需要某个容器,需要对其进行删除,可以采用以下操作,这里以上面的 ubuntu_apache
的容器为例。
首先关闭正在运行中的容器,如果不关闭,将无法删除。
用这个命令来看一下运行中的容器:
sudo docker ps
输出:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4bfa1e1ccdf9 zeroone/ubuntu_apache "/bin/bash" 9 minutes ago Up 9 minutes interesting_greider
77468878bae8 ubuntu:20.04 "/bin/bash" 27 minutes ago Up 27 minutes priceless_borg
5474789652a7 ubuntu:20.04 "/bin/bash" 31 minutes ago Up 31 minutes hardcore_sanderson
通过使用它的 ID 来终止运行中的容器:
sudo docker stop 4bfa1e1ccdf9
现在,使用这个命令删除容器:
sudo docker rm 4bfa1e1ccdf9
同样,如果不再需要所有的容器,关闭并删除它们。
一个一个的删除多个容器会是一项繁琐的工作。所以,我们可以把所有停止的容器一次性删掉,运行:
sudo docker container prune
敲 Y
然后回车键,这些容器就被删掉了。
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] Y
Deleted Containers:
c9f2afd8111b3b25a8992b7d31da73848c553e3ca7ea6a68898c6b8cd12b6866
4608a616cc12ca83b5755d27e66b8a7a8470c05f946e343643de12c873e5462d
c5cfbe7d8553284b6c56eb0fdd7cf4f7129ab9f854bbaa7a17b86b869db0f71b
Total reclaimed space: 0B
这个命令仅在最新版中有效。
最后,运行查看容器命令,检查是否都已删除:
sudo docker ps -a
图-12 删除容器
这里因为我 ubuntu:20.04 这两个容器没有停止运行,所以没有删除掉。
注意:删除容器之前,一定要先终止容器!!!
注意:删除 Docker 镜像之前,需要先删除从这些镜像创建的容器,不然会报错,显示该镜像被容器占有!!!
现在继续说,怎么删除镜像,还是以上面的 zeroone/ubuntu_apache
为例。
列出所有下载的 Docker 镜像:
sudo docker images
输出结果:
REPOSITORY TAG IMAGE ID CREATED SIZE
zeroone/ubuntu_apache latest 94c59982e88f 34 minutes ago 229MB
ubuntu 20.04 88bd68917189 6 weeks ago 72.8MB
ubuntu 15.10 9b9cb95443b5 6 years ago 137MB
我们可以根据镜像ID来删除该镜像:
sudo docker rmi 94c59982e88f
输出结果:
Untagged: zeroone/ubuntu_apache:latest
Deleted: sha256:94c59982e88f21ecd95162f967b6516e0a5190c3999fac507b174602dfd54cc6
Deleted: sha256:2ad31f25571bb95aa15df587c937280f9ea3b187809d7042da4bf6fb05d30e14
同样,删除其他所有 Docker 镜像。
删掉所有未运行的容器、所有镜像、构建的缓存、所有网络,运行:
sudo docker system prune -a
使用这个命令的时候要注意,它会删掉所有没有使用的容器、网络、镜像(包括 挂起(dangling)和未使用(unreferenced)的)
图-13 删除镜像
默认情况下,即使当前没有容器在使用磁盘卷(volumes),为防止重要数据被删除,磁盘卷也不会被删除。
如果你想删掉所有东西,包括分配的卷,使用 --volumes
标签。
sudo docker system prune -a --volumes
详情请参考:
后续更新,敬请期待!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。