目录
- 一、帮助命令
- 二、运行第一个容器:hello-world
- [2.1 运行命令](#2.1 运行命令)
- [2.2 命令执行流程图](#2.2 命令执行流程图)
- 三、镜像相关命令及其基本操作
- [3.1 登录私有镜像仓库](#3.1 登录私有镜像仓库)
- [3.2 拉取镜像](#3.2 拉取镜像)
- [3.3 查看镜像基本信息](#3.3 查看镜像基本信息)
- [3.3.1 docker images 命令查看镜像基本信息](#3.3.1 docker images 命令查看镜像基本信息)
- [(一)、
docker images
命令常用选项](#(一)、docker images命令常用选项)- [
-a
: 显示所有的镜像(包括临时镜像文件)](#-a : 显示所有的镜像(包括临时镜像文件)) - [-q : 只显示镜像ID](#-q : 只显示镜像ID)
- [
--digests
: 显示镜像再要信息](#--digests : 显示镜像再要信息) - [--digests=true | false:列出镜像的数字摘要值](#--digests=true | false:列出镜像的数字摘要值)
- [
--no-trunc
: 显示完整的镜像信息](#--no-trunc : 显示完整的镜像信息)
- [
- [3.4 查看镜像详细信息](#3.4 查看镜像详细信息)
- [3.4.1 使用
docker inspect
命令获取镜像的详细信息](#3.4.1 使用 docker inspect 命令获取镜像的详细信息) - [3.4.2
docker inspect
命令选项](#3.4.2 docker inspect 命令选项)- [-f : 可以使用golang的语言模板语法获取所需信息。](#-f : 可以使用golang的语言模板语法获取所需信息。)
- [3.4.1 使用
- [3.5 为镜像添加tag](#3.5 为镜像添加tag)
- [3.6 查看镜像构建历史](#3.6 查看镜像构建历史)
- [3.7 搜索镜像](#3.7 搜索镜像)
- [3.7.1 docker search 搜索镜像](#3.7.1 docker search 搜索镜像)
- [3.7.2
docker search
命令常用选项](#3.7.2 docker search命令常用选项)- [-f :过滤](#-f :过滤)
- [
-s
:列出搜藏不小于指定值的镜像](#-s :列出搜藏不小于指定值的镜像) - [
--automated
: 只列出 automated build 类型的镜像](#--automated : 只列出 automated build 类型的镜像) - [
--limit
: 限制输出结果](#--limit : 限制输出结果) - [--no-trunc: 不截断输出结果](#--no-trunc: 不截断输出结果)
- [3.8 删除镜像](#3.8 删除镜像)
- [3.8.1 使用docker rmi命令删除镜像](#3.8.1 使用docker rmi命令删除镜像)
- [(一)、docker rmi命令选项](#(一)、docker rmi命令选项)
- [-f : 强制删除。镜像已经运行为容器则无法删除,可以使用-f强制删除。](#-f : 强制删除。镜像已经运行为容器则无法删除,可以使用-f强制删除。)
- [3.8.1 使用docker rmi命令删除镜像](#3.8.1 使用docker rmi命令删除镜像)
- [3.9 清理镜像](#3.9 清理镜像)
*- [
docker image prune
命令选项](#docker image prune命令选项)
- [
- [3.10 推送镜像](#3.10 推送镜像)
- [3.11 构建镜像](#3.11 构建镜像)
- 四、容器常用命令及基本操作
- [4.1
docker ps
查看容器](#4.1 docker ps查看容器)- [4.1.1
docker ps
常用选项](#4.1.1 docker ps常用选项)
- [4.1.1
- [4.2 查看容器日志](#4.2 查看容器日志)
- [4.2.1
docker logs
查看容器日志](#4.2.1 docker logs查看容器日志) - [4.2.2
docker logs
命令选项](#4.2.2 docker logs命令选项)
- [4.2.1
- [4.3 运行容器](#4.3 运行容器)
- [4.3.1 docker run 运行容器](#4.3.1 docker run 运行容器)
- [4.3.2
docker run
命令常用选项](#4.3.2 docker run 命令常用选项)
- [4.5 目录挂载(容器数据卷操作)](#4.5 目录挂载(容器数据卷操作))
- [4.5.1 匿名挂载](#4.5.1 匿名挂载)
- [4.5.2 具名挂载](#4.5.2 具名挂载)
- [4.5.3 指定目录挂载](#4.5.3 指定目录挂载)
- [4.5.4 查看目录挂载关系](#4.5.4 查看目录挂载关系)
- [4.5.5 只读/读写](#4.5.5 只读/读写)
- [4.5.6 volumes-from(继承)](#4.5.6 volumes-from(继承))
- [4.6 退出容器](#4.6 退出容器)
- [4.7 重启容器](#4.7 重启容器)
- [4.8 启动容器](#4.8 启动容器)
- [4.9 停止容器](#4.9 停止容器)
- [4.10 强制停止容器](#4.10 强制停止容器)
- [4.11 刪除已停止的容器](#4.11 刪除已停止的容器)
- [4.12 进入容器](#4.12 进入容器)
- [4.12.1 attach](#4.12.1 attach)
- [4.12.2
exec
(官方推荐使用)](#4.12.2 exec(官方推荐使用)) - [4.12.3 nsenter](#4.12.3 nsenter)
- [4.12.4 ssh](#4.12.4 ssh)
- [4.12.5 创建并进入容器](#4.12.5 创建并进入容器)
- [4.12.6 守护式方式创建容器](#4.12.6 守护式方式创建容器)
- [4.12.7 登录守护式容器方式](#4.12.7 登录守护式容器方式)
- [4.12.8 退出当前容器](#4.12.8 退出当前容器)
- [4.13 停止与启动容器](#4.13 停止与启动容器)
- [4.14 复制文件](#4.14 复制文件)
- [4.14.1 从容器内复制文件到宿主主机](#4.14.1 从容器内复制文件到宿主主机)
- [4.14.2 从宿主机复制文件到容器](#4.14.2 从宿主机复制文件到容器)
- [4.15 删除容器](#4.15 删除容器)
- [4.16 查看容器IP地址](#4.16 查看容器IP地址)
- [4.1
一、帮助命令
docker version
: 查看Docker版本信息docker info
: 查看Docker信息docker --help
: 查看帮助信息
二、运行第一个容器:hello-world
2.1 运行命令
在命令行中输入以下命令并执行:
bash
docker run hello-world
通过运行 hello-world
镜像来验证 Docker Engine
是否已正确安装。
2.2 命令执行流程图
docker run hello-world
命令执行流程图如下。
三、镜像相关命令及其基本操作
官方文档:https://docs.docker.com/reference/
3.1 登录私有镜像仓库
- 命令格式 :
docker login [选项] [镜像仓库URL]
以下以阿里云举例:
bash
sudo docker login --username=你的阿里云用户名 registry.cn-hangzhou.aliyuncs.com/stupid_kid/stupid_kid
3.2 拉取镜像
-
格式:docker pull
[镜像仓库URL]/[命名空间名称]/[仓库名称]:[镜像版本号]
-
示例 :
docker pull docker.io/library/busybox:latest
-
字段说明
URL 命名空间 仓库名称 版本号 docker.io library busybox latest
python
# docker pull docker.io/library/busybox:latest
latest: Pulling from library/busybox
ea97eb0eb3ec: Pull complete
Digest: sha256:bde48e1751173b709090c2539fdf12d6ba64e88ec7a4301591227ce925f3c678
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
- 简化:
docker pull busybox:latest
(不指定则默认仓库)
-
可以直接使用
docker run
,如果本地没有镜像会自动去仓库拉取。python[root@localhost ~ ]# docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 0e03bdcc26d7: Pull complete Digest: sha256:e7c70bb24b462baa86c102610182e3efcb12a04854e8c582838d92970a09f323 Status: Downloaded newer image for hello-world:latest ...
下载的时候,我们可以看到有若干层组成,像 0e03bdcc26d7 这样的字符串是层的唯一 ID(实际上,完整的 ID 包括 256 比特, 64 个十六进制字符组成)。使用 docker pull 命令下载中会获取并输出镜像的各层信息。当不同的镜像包括相同的层的时候,本地仅存一份内容,减小存储空间。
3.3 查看镜像基本信息
3.3.1 docker images 命令查看镜像基本信息
使用docker images
或 docker images ls
命令可以列举本地主机上已有镜像的基本信息。
- 基本用法:
docker images [选项]
/docker images ls [选项]
python
[root@Stupidkid ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 219ee5171f80 2 days ago 1.23MB
hello-world latest bf756fb1ae65 11 months ago 13.3kB
这些镜像都是存储在 Docker 宿主机的 /var/lib/docker 目录下。
- 字段说明
REPOSITORY | TAG | IMAGE ID | CREATED | SIZE |
---|---|---|---|---|
仓库名称 | 版本号(又称镜像标签)(latest:表示最新版本) | 镜像ID | 镜像创建时间到现在 | 镜像文件的体积 |
同一仓库源可以有多个"TAG",代表这个仓库源的不同个版本,我们使用" REPOSITORY:TAG" 来定义不同的镜像
如果你不指定一个镜像的版本标签,例如你只使用"ubuntu","docker"将默认使用"ubuntu:latest"镜像
其中镜像的 ID 信息十分重要,它唯一标识了镜像。在使用镜像 ID 的时候,一般可以使用该 ID 的前若干个字符组成的可区分串来替代完整的 ID。
TAG 信息用于标记来自同一个仓库的不同镜像。TAG 在同一个仓库中是唯一的。
镜像大小信息只是表示了该镜像的逻辑体积大小,实际上由于相同的镜像层本地只会存储一份,物理上占用 的存储空间会小于各镜像逻辑体积之和。
(一)、docker images
命令常用选项
-a
: 显示所有的镜像(包括临时镜像文件)
python
[root@Stupidkid ~]# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 219ee5171f80 2 days ago 1.23MB
hello-world latest bf756fb1ae65 11 months ago 13.3kB
-q : 只显示镜像ID
python
[root@Stupidkid ~]# docker images -q
219ee5171f80
bc9a0695f571
bf756fb1ae65
--digests
: 显示镜像再要信息
python
[root@Stupidkid ~]# docker images --digests
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
busybox latest sha256:bde48e1751173b709090c2539fdf12d6ba64e88ec7a4301591227ce925f3c678 219ee5171f80 2 days ago 1.23MB
nginx latest sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3 bc9a0695f571 11 days ago 133MB
hello-world latest sha256:e7c70bb24b462baa86c102610182e3efcb12a04854e8c582838d92970a09f323 bf756fb1ae65 11 months ago 13.3kB
--digests=true | false:列出镜像的数字摘要值
python
[root@Stupidkid ~]# docker images --digests=true
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
busybox latest sha256:bde48e1751173b709090c2539fdf12d6ba64e88ec7a4301591227ce925f3c678 219ee5171f80 2 days ago 1.23MB
nginx latest sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3 bc9a0695f571 11 days ago 133MB
hello-world latest sha256:e7c70bb24b462baa86c102610182e3efcb12a04854e8c582838d92970a09f323 bf756fb1ae65 11 months ago 13.3kB
[root@Stupidkid ~]# docker images --digests=false
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 219ee5171f80 2 days ago 1.23MB
nginx latest bc9a0695f571 11 days ago 133MB
hello-world latest bf756fb1ae65 11 months ago 13.3kB
--no-trunc
: 显示完整的镜像信息
python
[root@Stupidkid ~]# docker images --no-trunc
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest sha256:219ee5171f8006d1462fa76c12b9b01ab672dbc8b283f186841bf2c3ca8e3c93 2 days ago 1.23MB
nginx latest sha256:bc9a0695f5712dcaaa09a5adc415a3936ccba13fc2587dfd76b1b8aeea3f221c 11 days ago 133MB
hello-world latest sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b 11 months ago 13.3kB
3.4 查看镜像详细信息
3.4.1 使用 docker inspect
命令获取镜像的详细信息
使用 docker inspect
命令获取镜像的详细信息,包括 PID、作者、架构等等。
-
基本格式:
docker inspect [镜像ID] / [镜像名称:版本号]
-
示例:
pythonnginx:latest none [root@Stupidkid ~]# docker inspect nginx:latest [ { "Id": "sha256:bc9a0695f5712dcaaa09a5adc415a3936ccba13fc2587dfd76b1b8aeea3f221c", "RepoTags": [ "nginx:latest" ], "RepoDigests": [ "nginx@sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3" ], "Parent": "", "Comment": "", "Created": "2020-11-25T00:30:19.011398516Z", "Container": "279e6916c4aaaf5d61e468508abd96933f4e48194bd979dc692e0196cde2d59d", ...
3.4.2 docker inspect
命令选项
-f : 可以使用golang的语言模板语法获取所需信息。
python
[root@Stupidkid ~]# docker inspect -f '{{.Id}}' nginx
sha256:bc9a0695f5712dcaaa09a5adc415a3936ccba13fc2587dfd76b1b8aeea3f221c
3.5 为镜像添加tag
为了方便后续工作中使用特定的镜像,还可以使用 docker tag 命令来为本地的镜像添加标签、修改镜像名称和版本号。
-
格式 :
docker tag [原镜像仓库url]/[原镜像命名空间]/[原镜像仓库名称]:[版本号] [新镜像仓库url]/[新镜像命名空间]/[新镜像仓库名称]:[版本号]
或者如下:
bashdocker tag [原镜像仓库url]/[原镜像命名空间]/[原镜像仓库名称]:[版本号] \ [新镜像仓库url]/[新镜像命名空间]/[新镜像仓库名称]:[版本号]
-
示例
python[root@Stupidkid ~]# docker tag nginx:latest registry-vpc.cn-hangzhou.aliyuncs.com/stupid_kid/stupid_kid/nginx:v1 # 修改镜像名与TAG [root@Stupidkid ~]# docker tag nginx:latest nginx_1:v1 [root@Stupidkid ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest 219ee5171f80 2 days ago 1.23MB registry.cn-shanghai.aliyuncs.com/python16-shawn/busybox v1 219ee5171f80 2 days ago 1.23MB nginx latest bc9a0695f571 11 days ago 133MB nginx_1 v1 bc9a0695f571 11 days ago 133MB registry-vpc.cn-hangzhou.aliyuncs.com/stupid_kid/stupid_kid/nginx v1 bc9a0695f571 11 days ago 133MB hello-world latest bf756fb1ae65 11 months ago 13.3kB
修改tag后,源镜像还会存在,ID则为同一个,在删除镜像时若指定的是ID则会删除所有匹配到ID的镜像 ,若指定的是镜像名称:版本
则仅删除指定名称的单个镜像。
3.6 查看镜像构建历史
-
格式 :
docker history [镜像名字:镜像版本号] / [镜像ID]
-
示例:
python[root@Stupidkid ~]# docker history nginx:latest IMAGE CREATED CREATED BY SIZE COMMENT bc9a0695f571 11 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon... 0B <missing> 11 days ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B <missing> 11 days ago /bin/sh -c #(nop) EXPOSE 80 0B <missing> 11 days ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr... 0B <missing> 11 days ago /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7... 1.04kB <missing> 11 days ago /bin/sh -c #(nop) COPY file:08ae525f517706a5... 1.95kB <missing> 11 days ago /bin/sh -c #(nop) COPY file:e7e183879c35719c... 1.2kB <missing> 11 days ago /bin/sh -c set -x && addgroup --system -... 63.6MB <missing> 11 days ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~buster 0B <missing> 11 days ago /bin/sh -c #(nop) ENV NJS_VERSION=0.4.4 0B <missing> 11 days ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.19.5 0B <missing> 2 weeks ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do... 0B <missing> 2 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B <missing> 2 weeks ago /bin/sh -c #(nop) ADD file:d2abb0e4e7ac17737... 69.2MB
3.7 搜索镜像
3.7.1 docker search 搜索镜像
在 docker 中搜索镜像主要使用 Search 子命令,默认只搜索 Docker Hub 官方镜像仓库中的镜像。
-
格式 :
docker search [所搜索的镜像名称] [选项]
-
示例:
python[root@Stupidkid ~]# docker search python NAME DESCRIPTION STARS OFFICIAL AUTOMATED python Python is an interpreted, interactive, objec... 5661 [OK] django Django is a free web application framework, ... 1024 [OK] pypy PyPy is a fast, compliant alternative implem... 256 [OK] nikolaik/python-nodejs Python with Node.js 55 [OK] joyzoursky/python-chromedriver Python with Chromedriver, for running automa... 54 [OK] arm32v7/python Python is an interpreted, interactive, objec... 53 circleci/python Python is an interpreted, interactive, objec... 41 centos/python-35-centos7 Platform for building and running Python 3.5... 38 centos/python-36-centos7 Platform for building and running Python 3.6... 30 hylang Hy is a Lisp dialect that translates express... 28 [OK] arm64v8/python Python is an interpreted, interactive, objec... 24 centos/python-27-centos7 Platform for building and running Python 2.7... 17 bitnami/python Bitnami Python Docker Image 10 [OK] publicisworldwide/python-conda Basic Python environments with Conda. 6 [OK] dockershelf/python Repository for docker images of Python. Test... 5 [OK] clearlinux/python Python programming interpreted language with... 4 d3fk/python_in_bottle Simple python:alpine completed by Bottle+Req... 4 [OK] i386/python Python is an interpreted, interactive, objec... 3 centos/python-34-centos7 Platform for building and running Python 3.4... 2 ppc64le/python Python is an interpreted, interactive, objec... 2 amd64/python Python is an interpreted, interactive, objec... 1 saagie/python Repo for python jobs 0 s390x/python Python is an interpreted, interactive, objec... 0 ccitest/python CircleCI test images for Python 0 [OK] openshift/python-33-centos7 DEPRECATED: A Centos7 based Python v3.3 imag... 0
-
字段说明:
NAME
:镜像名称DESCRIPTION
:镜像描述STARS
:用户评价,反映一个镜像的受欢迎程度(收藏个数)OFFICIAL
:是否为官方构建AUTOMATED
:自动构建,表示该镜像由 Docker Hub 自动构建流程创建的。
3.7.2 docker search
命令常用选项
-f :过滤
python
# 搜索被收藏超过 300 个的并且关键词包括 Python 的镜像
docker search -f stars=300 python
# 搜索官方提供的带有 Redis 关键字的镜像
docker search -f is-official=true redis
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that... 8792 [OK]
-s
:列出搜藏不小于指定值的镜像
- 示例:
docker search python -s 300
--automated
: 只列出 automated build 类型的镜像
- 示例:
docker search python --automated
--limit
: 限制输出结果
--no-trunc: 不截断输出结果
3.8 删除镜像
3.8.1 使用docker rmi命令删除镜像
使用docker rmi
命令,相当于docker image rm
命令。
- 格式 :
docker rmi [镜像名称:版本号] / [镜像ID]
示例:
python
[root@Stupidkid ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 219ee5171f80 2 days ago 1.23MB
registry.cn-shanghai.aliyuncs.com/python16-shawn/busybox v1 219ee5171f80 2 days ago 1.23MB
nginx latest bc9a0695f571 11 days ago 133MB
nginx_1 v1 bc9a0695f571 11 days ago 133MB
registry-vpc.cn-hangzhou.aliyuncs.com/stupid_kid/stupid_kid/nginx v1 bc9a0695f571 11 days ago 133MB
hello-world latest bf756fb1ae65 11 months ago 13.3kB
[root@Stupidkid ~]# docker rmi nginx:v1
Error: No such image: nginx:v1
[root@Stupidkid ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 219ee5171f80 2 days ago 1.23MB
registry.cn-shanghai.aliyuncs.com/python16-shawn/busybox v1 219ee5171f80 2 days ago 1.23MB
nginx latest bc9a0695f571 11 days ago 133MB
nginx_1 v1 bc9a0695f571 11 days ago 133MB
registry-vpc.cn-hangzhou.aliyuncs.com/stupid_kid/stupid_kid/nginx v1 bc9a0695f571 11 days ago 133MB
hello-world latest bf756fb1ae65 11 months ago 13.3kB
(一)、docker rmi命令选项
-f : 强制删除。镜像已经运行为容器则无法删除,可以使用-f强制删除。
示例:删除单个
python
[root@localhost ~ ]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9bf5ef44a314 nginx "/docker-entrypoint...." 51 minutes ago Up 51 minutes 0.0.0.0:32770->80/tcp funny_northcutt
[root@localhost ~ ]# docker rmi nginx:latest
Error response from daemon: conflict: unable to remove repository reference "nginx:latest" (must force) - container b1bc639c450e is using its referenced image bc9a0695f571
[root@localhost ~ ]# docker rmi -f nginx:latest
Untagged: nginx:latest
[root@localhost ~ ]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx_2 v1 2c45f814f15b 38 minutes ago 131MB
<none> <none> bc9a0695f571 7 days ago 133MB
删除多个:
docker rmi -f [镜像名1:TAG] [镜像名2:TAG]...
删除全部:
docker rmi -f $(docker images -qa)
3.9 清理镜像
使用一段时间之后,docker 会产生很多临时镜像文件,以及一些没有被使用的镜像, 我们可以通过 docker image prune 命令来进行清理。
- 格式:docker image prune [选项]
docker image prune
命令选项
- -a:清理所有没有当前使用的镜像,不仅是临时镜像。
- -f: 强制删除。等同于rmi删除。
3.10 推送镜像
push将本地镜像推送到网上的个人的私有仓库中,例如阿里云的私有仓库。
-
格式 :
docker push [镜像仓库URL]/[命名空间名称]/[仓库名称]:[版本号]
-
示例:
-
先登录私有仓库。
pythondocker login --username="登录名,最好纯英文" 仓库URL [root@Stupidkid ~]# docker login --username="兴欣工作室" registry.cn-hangzhou.aliyuncs.com/stupid_kid/stupid_kid Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
-
将镜像改名
python# 私有仓库名最好设置为镜像名,在私有仓库内只能查看版本,而没有镜像名。 docker tag 本地镜像名 [镜像仓库URL]/[命名空间名称]/[仓库名称]:[版本号]
-
推送镜像,push一次只能推送一个镜像。
python[root@Centos7 docker]# docker push registry.cn-hangzhou.aliyuncs.com/alvinos/py15-nginx:1.19.2 The push refers to repository [registry.cn-hangzhou.aliyuncs.com/alvinos/py15-nginx] 908cf8238301: Pushed eabfa4cd2d12: Pushed 60c688e8765e: Pushed f431d0917d41: Pushed 07cab4339852: Pushed 1.19.2: digest: sha256:794275d96b4ab96eeb954728a7bf11156570e8372ecd5ed0cbc7280313a27d19 size: 1362
-
3.11 构建镜像
构建镜像一般有三种情况,基于容器导入、基于本地模板导入、基于 Dockerfile 创建,本节主讲基于容器保存镜像和本地保存镜像文件导入。
1、保存容器为镜像
- 格式:
docker commit [选项] [容器ID] / [容器名称:版本号]
docker commit
命令选项
- -a : 指定作者。
- -m : 简介。
- -p : 保存镜像时,容器暂停运行。
示例:
python
[root@localhost ~ ]# docker commit -a 'chirou' -m 'nginx_demo' -p 50cf6c577510
sha256:94738e2585944aa455e0c3e1bb174fba02dc18ea17135811d1b874ea0beaab7e
[root@localhost ~ ]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 94738e258594 4 seconds ago 133MB
# 使用inspect查看详细信息。
[root@localhost ~ ]# docker inspect 94738e258594 | grep chirou
"Author": "chirou",
[root@localhost ~ ]# docker inspect 94738e258594 | grep nginx_demo
"Comment": "nginx_demo",
2、导入与导出容器
某些时候,需要将容器或镜像保存成文件从一个系统迁移到另外一个系统,此时可以使用 Docker 的导入和导出功能,这也是Docker 自身提供的一个重要特性。导出的文件是一个tar包,可以通过压缩命令进行压缩,然后进行传输。
export
和import
比较
export
export将容器导出到标准输出,可以使用输出重定向或-o选项至文件中。
-
格式:
docker export [容器名或ID] > [文件名称]
-
示例:将nginx容器导出
docker export nginx > export_nginx.tar
import
import 是将export导出的文件导入为镜像,可以自定义导入的镜像名称和版本号。
import虽然可以导入save保存的文件但是导入后无法运行。
-
格式:
docker import [文件名称] [自定义镜像名称]:[版本号]
-
示例:将上面导出的文件导入
python[root@localhost ~ ]# docker import export_nginx.tar import_nginx:v1 87b71baffd0c8e5b2b98884caee97a9d3abcee444e9bad10c865db0daaafa024 [root@localhost ~ ]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE import_nginx v1 87b71baffd0c 44 seconds ago 131MB nginx latest bc9a0695f571 10 days ago 133MB # 通过export导出的文件,使用import导入后无法直接运行。 [root@localhost mnt ]# docker run -d import_nginx:v1 docker: Error response from daemon: No command specified.
可以看到,通过export导出的容器文件,再使用import导入后,SIZE是要比源镜像小的。这是因为export导出的是容器,并没有源镜像的全部内容,比如会丢失构建历史记录和元数据信息等文件,相当于仅保存容器当时的快照状态,这会导致export导出的文件无法直接通过run命令运行,解决方法:
运行时通过-it选项,给容器分配一个伪终端。
python
docker run -dit import_nginx:v1 sh
推荐使用commit来保存容器,然后再使用save保存,能避免上述问题。
3、导入和导出镜像
save和load
save能将镜像完整的保存下来,包括镜像ID和构建历史。一样可用输出重定向或-o选项保存至tar包中,并且save支持将多个镜像保存至一个tar包中。
格式:
bash
docker save [镜像名或ID ...] > [压缩包名称]
docker save -o [压缩包名称] [镜像名称或ID ...]
实例:
bash
# 不指定版本号则默认为latest,表示最新版。
[root@localhost ~ ]# docker save busybox nginx > box_nginx.tar
[root@localhost ~ ]# ll
-rw-r--r-- 1 root root 138553344 12月 5 19:30 box_nginx.tar
load是将save保存的镜像文件载入为镜像。save保存时若使用镜像ID保存镜像,导入时则没有镜像名称,load在导入时也不能自定义镜像名称,可以在导入后使用docker tag命令修改。
格式:
bash
docker load < [压缩包名称]
<相当于-i选项,指定导入的文件,默认是STDIN。
实例:
bash
[root@localhost ~ ]# docker save dc3bacd8b5ea bc9a0695f571 > box_nginx.tar
# 将原镜像删除
[root@localhost ~ ]# docker rmi bc9a0695f571 dc3bacd8b5ea
# 载入镜像
[root@localhost ~ ]# docker load < box_nginx.tar
Loaded image ID: sha256:bc9a0695f5712dcaaa09a5adc415a3936ccba13fc2587dfd76b1b8aeea3f221c
Loaded image ID: sha256:dc3bacd8b5ea796cea5d6070c8f145df9076f26a6bc1c8981fd5b176d37de843
# 此时ID还是原来的,但tag信息都为none
[root@localhost ~ ]# docker images
<none> <none> bc9a0695f571 10 days ago 133MB
<none> <none> dc3bacd8b5ea 11 days ago 1.23MB
四、容器常用命令及基本操作
4.1 docker ps
查看容器
ps:该子命令能查看当前正在运行的容器
示例:
python
[root@localhost ~ ]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b1a13dfe7105 nginx "/docker-entrypoint...." 3 seconds ago Up 2 seconds 0.0.0.0:32774->80/tcp reverent_maxwell
字段说明:
CONTAINER ID | IMAGE | COMMAND | CREATED | STATUS | PORTS | NAMES |
---|---|---|---|---|---|---|
容器 ID | 所属镜像 | 命令 | 创建时间 | 状态 | 端口 | 容器名称 |
4.1.1 docker ps
常用选项
-a: 查看所有容器(包括运行和停止)
python
docker ps -a
-f:查看停止的容器
python
docker ps -f status=exited
-q:静默模式,仅显示ID信息
python
[root@localhost ~ ]# docker ps -aq
b1a13dfe7105
-n:列出最近创建的 n 个容器。
python
docker ps -n 5
-l : 查看最后一次运行的容器
python
docker ps -l
inspect
该命令能够查看该容器详细信息
python
[root@localhost ~ ]# docker inspect b1a13dfe7105
[
{
"Id": "b1a13dfe71056d8c02fb90e52a503bbedc60301f62e9c49604fa86c2258fd310",
"Created": "2020-12-05T12:18:17.241753416Z",
"Path": "/docker-entrypoint.sh",
"Args": [
"nginx",
"-g",
"daemon off;"
。。。省略行。。。
同样支持 -f 选项过滤指定信息。
python
[root@localhost ~ ]# docker inspect -f '{{.Id}}' b1a13dfe7105
b1a13dfe71056d8c02fb90e52a503bbedc60301f62e9c49604fa86c2258fd310
4.2 查看容器日志
4.2.1 docker logs
查看容器日志
- 格式:
docker logs [option] [容器名称或ID]
4.2.2 docker logs
命令选项
- -f:跟踪日志输出。类似tail -f命令。
- --since:显示某个开始时间的所有日志。
- -t:显示时间戳。
- --tail N:仅列出最新N条容器日志。
示例:
python
[root@localhost ~ ]# docker logs b1a13dfe7105
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
显示时间戳:
python
[root@localhost ~ ]# docker logs -t b1a13dfe7105
2020-12-05T12:18:17.500960288Z /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
2020-12-05T12:18:17.500995723Z /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
。。。省略行。。。
仅显示三条日志:
python
# 仅查看3条日志。
[root@localhost ~ ]# docker logs --tail 3 b1a13dfe7105
192.168.112.1 - - [05/Dec/2020:13:46:53 +0000] "GET /favicon.ico HTTP/1.1" 404 153 "http://192.168.112.129:32775/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0" "-"
192.168.112.1 - - [05/Dec/2020:13:46:54 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0" "-"
192.168.112.1 - - [05/Dec/2020:13:46:55 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0" "-"
查看2020年12月5日之后的日志:
python
# 日期格式不能错误。
[root@localhost ~ ]# docker logs --since="2020-12-04" b1a13dfe7105
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
。。。省略行。。。
4.3 运行容器
4.3.1 docker run 运行容器
docker run
能将一个镜像运行为容器。容器当中至少有一个进程运行在前台。
- 格式:
docker run [选项] [镜像名称|镜像ID] [容器启动后内部执行的命令]
4.3.2 docker run
命令常用选项
-d : 以守护进程的方式运行(在 run 后面加上 -d 参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加 -i -t 两个参数,创建容器后就会自动进容器里))
-p : 指定端口映射前者是宿主机端口,后者是容器内的映射端口。可以使用多个 -p 做多个端口映射。
bash
# 格式
docker run -p 宿主主机端口:容器向外暴露的端口 [镜像名称:tag | 镜像ID]
docker run -d -p 8899:80 nginx:1.19.2
-P : 随机端口映射,随机使用宿主机的可用端口与容器内暴露的端口映射。
bash
docker run -d -P nginx:1.19.2
--name: 指定容器的名称(为创建的容器命名),同一台宿主主机上的docker名称不能重复。
bash
docker run -d --name 自定义容器名 -P nginx:1.19.2
--rm:当一个容器停止后,就立即删除。
bash
docker run -d --rm nginx:1.19.2
-i : 表示运行容器
-t : 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端;通常和-i连用
bash
# 运行容器后执行bash命令。
docker run -ditP nginx bash
-e : 在容器内设置一个环境变量。
bash
docker run -d -e NGINX_NAME=nginx nginx:1.19.2
--network 指定网络模式,下篇再讲docker网络。
--link:链接到另一个容器。
-h:指定容器内的主机名。
-v: 映射存储卷,可以映射文件及文件夹。表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个 -v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上;映射后在宿主机文件内的修改都会映射到容器内的文件中。
bash
docker run -d -v 宿主机文件路径:容器内文件路径 nginx:1.19.2
4.5 目录挂载(容器数据卷操作)
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器,而且这个操作是双向绑定的,也就是说容器内的操作也会影响到宿主机,实现备份功能。
但是容器被删除的时候,宿主机的内容并不会被删除。如果多个容器挂载同一个目录,其中一个容器被删除,其他容器的内容也不会受到影响。
容器与宿主机之间的数据卷属于引用的关系,数据卷是从外界挂载到容器内部中的,所以可以脱离容器的生命周期而独立存在,正是由于数据卷的生命周期并不等同于容器的生命周期,在容器退出或者删除以后,数据卷仍然不会受到影响,数据卷的生命周期会一直持续到没有容器使用它为止。
创建容器添加 -v
参数,格式为宿主机目录:容器目录
,例如:
python
docker run -di -v /mydata/docker_centos/data:/usr/local/data --name centos7-01 centos:7
# 多目录挂载
docker run -di -v /宿主机目录:/容器目录 -v /宿主机目录2:/容器目录2 镜像名
目录挂载操作可能会出现权限不足的提示。这是因为 CentOS7 中的安全模块 SELinux 把权限禁掉了,在 docker run 时通过
--privileged=true
给该容器加权限来解决挂载的目录没有权限的问题。
4.5.1 匿名挂载
匿名挂载只需要写容器目录即可,容器外对应的目录会在 /var/lib/docker/volume
中生成。
python
# 匿名挂载
docker run -di -v /usr/local/data --name centos7-02 centos:7
# 查看 volume 数据卷信息
docker volume ls
4.5.2 具名挂载
具名挂载就是给数据卷起了个名字,容器外对应的目录会在 /var/lib/docker/volume
中生成。
python
# 匿名挂载
docker run -di -v docker_centos_data:/usr/local/data --name centos7-03 centos:7
# 查看 volume 数据卷信息
docker volume ls
4.5.3 指定目录挂载
一开始给大家讲解的方式就属于指定目录挂载,这种方式的挂载不会在 /var/lib/docker/volume
目录生成内容。
python
docker run -di -v /mydata/docker_centos/data:/usr/local/data --name centos7-01 centos:7
# 多目录挂载
docker run -di -v /宿主机目录:/容器目录 -v /宿主机目录2:/容器目录2 镜像名
4.5.4 查看目录挂载关系
通过 docker volume inspect 数据卷名称
可以查看该数据卷对应宿主机的目录地址。
python
[root@localhost ~]# docker volume inspect docker_centos_data
[
{
"CreatedAt": "2020-08-13T20:19:51+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/docker_centos_data/_data",
"Name": "docker_centos_data",
"Options": null,
"Scope": "local"
}
]
通过 docker inspect 容器ID或名称
,在返回的 JSON 节点中找到 Mounts
,可以查看详细的数据挂载信息。
4.5.5 只读/读写
python
# 只读。只能通过修改宿主机内容实现对容器的数据管理。
docker run -it -v /宿主机目录:/容器目录:ro 镜像名
# 读写,默认。宿主机和容器可以双向操作数据。
docker run -it -v /宿主机目录:/容器目录:rw 镜像名
4.5.6 volumes-from(继承)
python
# 容器 centos7-01 指定目录挂载
docker run -di -v /mydata/docker_centos/data:/usr/local/data --name centos7-01 centos:7
# 容器 centos7-04 和 centos7-05 相当于继承 centos7-01 容器的挂载目录
docker run -di --volumes-from centos7-01:ro --name centos7-04 centos:7
docker run -di --volumes-from centos7-01:rw --name centos7-05 centos:7
4.6 退出容器
exit
: 容器停止退出Ctrl+P+Q
: 容器不停止退出
4.7 重启容器
当修改了容器内某些配置文件后,可以使用此命令使配置生效
- 格式:
docker restart [容器名称 | 容器ID]
4.8 启动容器
docker start [容器ID / 容器名]
4.9 停止容器
docker stop [容器ID / 容器名]
docker stop -f $(docker ps -qa)
(所有)
4.10 强制停止容器
docker kill [容器ID / 容器名]
4.11 刪除已停止的容器
docker rm [容器ID]
docker rm -f $(docker ps -qa)
4.12 进入容器
在使用容器的过程中,我们难免需要进入容器进行排查问题。下面来介绍进入容器的四种方式。
4.12.1 attach
通过管道,连接容器内PID=1的进程,容器至少有一个进程运行前台。attach 是最早 docker 官方推出的进入容器的命令了,不过使用该命令有一个问题。当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作,当所有窗口退出时,容器结束。
- 格式 :
docker attach [容器名或ID]
4.12.2 exec
(官方推荐使用)
继attach 之后,exec 是官方推出的有一个新的进入容器的命令,这也是目前推荐使用的进入容器的方式。这个命令相当于在容器中执行一个命令。
- 格式 :
docker exec [参数] [容器名或ID] [命令]
示例:
python
[root@localhost ~ ]# docker exec -it reverent_maxwell sh
用这种方式相当于进入该容器,并且在退出时不会将容器也停止。
4.12.3 nsenter
进入容器中,但不进入容器内的进程。Nsenter 是 Linux 提供的命令。需要配合 docker inspect 来使用(早期没有 exec 命令时,企业当中最长用的方式之一),Docker 是用 golang 语言开发,所以它也支持 go 语言的模板语法。
- 配合
docker inspect
来使用 - 格式示例:nsenter --target $( docker inspect -f {{.State.Pid}} nginxv1 ) --mount --uts --ipc --net --pid
4.12.4 ssh
在镜像(或容器) 中安装 SSH Server,这样就能保证多人进入容器且相互之间不受干扰了,相信大家在当前的生产环境中(没有使用 Docker 的情况)也是这样做的。但是使用了 Docker 容器之后不建议使用 ssh 进入到 Docker 容器内。
- 在容器里面安装一个 sshd 服务
4.12.5 创建并进入容器
下面这行命令的意思就是通过镜像 AA 创建一个容器 BB,运行容器并进入容器的 /bin/bash
python
docker run -it --name 容器名称 镜像名称:标签 /bin/bash
注意:Docker 容器运行必须有一个前台进程, 如果没有前台进程执行,容器认为是空闲状态,就会自动退出。
4.12.6 守护式方式创建容器
python
docker run -di --name 容器名称 镜像名称:标签
4.12.7 登录守护式容器方式
bash
docker exec -it 容器名称|容器ID /bin/bash
4.12.8 退出当前容器
bash
exit
4.13 停止与启动容器
python
# 停止容器
docker stop 容器名称|容器ID
# 启动容器
docker start 容器名称|容器ID
4.14 复制文件
复制命令类似于 Linux 系统中的 scp 命令,是将宿主主机上的内容上传到容器中,也可能是将容器中的文件下载到宿主主机中。
4.14.1 从容器内复制文件到宿主主机
- 格式:
docker cp [容器ID:容器内文件路径] 宿主主机路径
示例
python
[root@Stupidkid ~]# docker cp d78575358e04:/usr ./
[root@Stupidkid ~]# ll
总用量 919344
-rw-------. 1 root root 1526 11月 13 20:15 anaconda-ks.cfg
-rw-r--r--. 1 root root 0 12月 6 19:47 export_nginx.tar
-rw-r--r--. 1 root root 2340 12月 6 10:05 pic_spider.py
-rw-r--r--. 1 root root 941396992 12月 4 19:40 python3_django.tar
drwxr-xr-x. 10 root root 105 11月 17 08:00 usr
4.14.2 从宿主机复制文件到容器
-
格式 :
docker cp 宿主主机路径 [容器ID:容器内文件路径]
-
示例:
python[root@Stupidkid ~]# docker cp ./export_nginx.tar d78575358e04:/home [root@Stupidkid ~]# docker exec d78575358e04 ls /home export_nginx.tar
4.15 删除容器
stop命令仅仅是将容器停止,若要删除容器则使用docker rm命令。
格式:
bash
docker rm [option] [镜像名称或ID]
rm能删除已停止的容器,对于正在运行的容器可以使用-f选项强制删除,一般不推荐直接将一个正在运行的容器强制删除。
实例:
bash
# 查看正在运行的容器。
[root@localhost ~ ]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1a9b4ae8766b nginx "/docker-entrypoint...." About an hour ago Up About an hour 0.0.0.0:80->80/tcp pedantic_hopper
# 直接使用rm无法删除。
[root@localhost ~ ]# docker rm 1a9b4ae8766b
Error response from daemon: You cannot remove a running container 1a9b4ae8766b9266f0e5256df1ac56b9647483815f60b447ae9f15d6c3355dec. Stop the container before attempting removal or force remove
# 使用-f选项可以强制删除。
[root@localhost ~ ]# docker rm -f 1a9b4ae8766b
1a9b4ae8766b
使用docker ps -a与rm和stop命令配合,可以达到一个批量处理容器的方式:
bash
# 停止所有正在运行的容器
docker stop $(docker ps)
# 删除所有容器,包括正在运行的容器
docker rm -f $(docker ps -a)
4.16 查看容器IP地址
我们可以通过以下命令查看容器的元信息。
python
docker inspect 容器名称|容器ID
也可以直接执行下面的命令直接输出 IP 地址。
python
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称|容器ID