1. Docker 基础命令
1.1 启动 docker
systemctl start docker
1.2 关闭 docker
systemctl stop docker
1.3 重启 docker
systemctl restart docker
1.4 开机启动 docker
systemctl enable docker
1.5 查看 docker 运行状态
systemctl status docker
- 如果在运行中,输入命令后,会看到绿色的
active
:
- 不再运行时,输入命令后,会发现绿色的
active
消失了,还会提示当前的docker
状态是inactive(dead)
(死亡):
1.6 查看 docker 版本信息
docker version
1.7 查看 docker 系统信息,包括镜像和容器数
docker info
1.8 docker 帮助命令
- 如果忘记了某些命令,可以输入如下命令:
docker --help
- 如果忘记了某个特定命令,比如说忘记了拉取命令,则可以输入如下指令:
docker pull --help
2. Docker 镜像命令
2.1 查看自己服务器中 docker 镜像列表
docker images
# 或
docker image ls
- 查看镜像、容器、数据卷所占用的空间:
docker system df
2.2 搜索镜像
docker search [镜像名]
- 比如可以输入这样的命令:
docker search --filter=STARS=9000 mysql
:
2.3 拉取镜像(从 Docker 镜像仓库获取镜像)
docker pull [镜像名]
docker pull [镜像名]:tag
- 不加
tag
(版本号),即默认拉取docker
仓库中该镜像的最新版本,相当于命令docker pull [镜像名]:latest
。比如说拉取最新版的mysql
,则可以输入如下命令:
docker pull mysql
- 加
tag
,则是拉取指定版本。比如说拉取mysql 5.7.30
,则可以输入如下命令:
docker pull mysql:5.7.30
2.4 运行镜像
docker run [镜像名]
docker run [镜像名]:tag
- 例如拉取一个
tomcat
,运行以下命令:
docker run tomcat
可以使用 Ctrl+c
退出。
- 下面用实例解释:几个参数:
# -it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。
# 这里打算进入 bash 执行一些命令并查看返回结果,因此需要交互式终端。
# --rm:这个参数的意思是,容器退出后随之将其删除。默认情况下,除了排障需求,退出的容器并不会立即删除,除非手动 docker rm。
# 这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免浪费空间。
# ubuntu:18.04:这里指用 ubuntu:18.04 镜像为基础来启动容器。
# bash:放在镜像名后的是命令,这里希望有个交互式 Shell,因此用的是 bash。
docker run -it --rm ubuntu:18.04 bash
2.5 删除镜像
- 当前镜像没有被任何容器使用才可以删除。
# 删除一个镜像
docker rmi -f 镜像名/镜像ID
# 删除多个镜像:其镜像ID或镜像用空格隔开即可
docker rmi -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID
# 删除全部镜像:-a 意思为显示全部,-q 意思为只显示ID
docker rmi -f $(docker images -aq)
# 删除所有仓库名为 redis 的镜像
docker image rm $(docker image ls -q redis)
# 删除所有在 mongo:3.2 之前的镜像
docker image rm $(docker image ls -q -f before=mongo:3.2)
- 强制删除镜像:
docker image rm 镜像名/镜像ID
2.6 保存镜像
- 可以将我们的镜像保存为
tar
压缩文件,这样方便镜像转移和保存,然后,可以在任何一台安装了docker
的服务器上加载这个镜像。
docker save 镜像名/镜像ID -o 镜像要保存的位置和名字
例如:docker save tomcat -o /myimg.tar
保存镜像任务执行完毕,我们可以看一下指定位置是否有该 tar
:
2.7 加载镜像
- 任何装
docker
的地方加载镜像保存文件,使其恢复为一个镜像。
docker load -i 镜像保存文件位置
可以先将之前的 tomcat
镜像删除掉,因为一开始就已经保存了:
查看镜像,测试镜像功能是否正常。
我们可以把解压的镜像 run
一下:
2.8 镜像标签
- 有时候,我们需要对一个镜像进行分类或版本迭代操作。比如一个微服务已经打为
docker
标签,但是根据环境进行区分为develop
环境与alpha
环境,这时候,我们就可以使用tag
,来对镜像做一个标签添加,从而进行区分;版本迭代逻辑也一样,根据不同的tag
进行区分。 - 注:
develop
:开发环境。alpha
:用于进行初步测试和验证的环境,常常是在软件开发的早期阶段使用。
app:1.0.0 基础镜像
# 分离为开发环境
app:develop-1.0.0
# 分离为 alpha 环境
app:alpha-1.0.0
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker tag 源镜像名;TAG 想要生成新的镜像名:新的TAG
# 如果省略 TAG,则会为镜像默认打上 latest TAG
docker tag aaa bbb
# 上面的操作等价于下面这行语句
docker tag aaa:latest bbb:latest
举例如下:
# 我们根据镜像 quay.io/minio/minio 添加一个新的镜像,名为 aaa,标签 Tag 设置为 1.2.3
docker tag quay.io/minio/minio:1.2.3 aaa:1.2.3
# 我们根据镜像 app-user:1.0.0 添加一个新的镜像,名为 app-user,标签 Tag 设置为 alpha-1.0.0
docker tag app-user:1.0.0 app-user:alpha-1.0.0
3. Docker 容器命令
注:我是这样理解 docker
容器的:可以将它类比于 C++ 中 new
出来的对象(docker run 镜像
:产生一个该镜像具体容器实例),docker
容器的启动需要镜像的支持。
- 每一个
docker
容器都是独立和安全的应用平台。可以理解为:每一个docker
容器都相当于在我们的服务器上占用资源然后开辟了属于自己的一个空间(也可以理解为服务器)。
这也是 docker
的一大特点,每个容器之间,环境都是隔离的。
我们甚至可以在一个服务器上,使用 docker
镜像,来跑出 n 个 mysql
实例。尽管它们的默认端口都是一样的,但容器间,环境是隔离的,A 容器的 3306 与 B 容器的 3306 毫无关系。
- 默认情况下,我们是无法通过宿主机(安装
docker
的服务器)端口来直接访问容器的,因为docker
容器自己开辟空间的端口与宿主机端口没有联系。 - 如果外部想要访问容器,那必须得让容器中的端口与宿主机的端口建立联系绑定起来,这个概念叫做 容器端口映射。有了端口映射,我们就可以将宿主机端口和容器端口绑定起来,比如我们建立宿主机的 6379 端口与容器
redis
6379 端口绑定起来,那么再访问宿主机 ip:6379 就可以访问到对应容器了。 - 容器端口与服务器端口映射的命令:
-p 宿主机端口:容器端口
3.1 查看正在运行容器列表
docker ps
# 或
docker container ls
3.2 查看所有容器
- 包含正在运行的和已停止的。
docker ps -a
3.3 运行容器
# -it:表示与容器进行交互式启动
# -d:表示可后台运行容器(守护式运行)
# --name:要给运行的容器起的名字
# /bin/bash:交互路径
docker run -it -d --name 要取的别名 镜像名:tag /bin/bash
举例:我们要启动一个 redis
,把它的别名取为 redis001
,并交互运行,命令如下(这里指定版本号为 5.0.5):
# 1. 拉取 redis 镜像
docker pull redis:5.0.5
# 2. 命令启动
docker run -it -d --name redis001 redis:5.0.5 /bin/bash
# 3. 查看已运行容器
docker ps
3.4 停止容器
docker stop 容器名/容器ID
例如:停止之前运行的 redis
容器,就可以输入这样的命令:docker stop redis001
:
3.5 删除容器
# 如果要删除一个运行中的容器,可以添加 -f 参数。Docker 会发送 SIGKILL 信号给容器。
# 删除一个容器
docker rm -f 容器名/容器ID
#删除多个容器:空格隔开要删除的 容器名/容器ID
docker rm -f 容器名/容器ID 容器名/容器ID 容器名/容器ID
# 删除全部容器
docker rm -f $(docker ps -aq)
# 清除所有处于终止状态的容器
docker container prune
3.6 容器端口与服务器端口映射
-p 宿主机端口:容器端口
举例:可以使用前面的 redis
镜像,尝试将 6379 端口映射到服务器的 8888,如果成功的话,那么访问服务器的 8888 端口,就会访问到 docker
中的容器 redis002
。可以输入下面这条命令:
docker run -itd --name redis002 -p 8888:6379 redis:5.0.5 /bin/bash
-p 8888:6379
解析:将容器内部的 6379 端口与docker
宿主机(docker
安装在哪台服务器,哪台服务器就是宿主机)8888 端口进行映射,那通过外部访问宿主机 8888 端口,即可访问到docker
容器 6379 端口了。
# netstat 是控制命令,是一个监控 TCP/IP 网络的非常有用的工具,它可以显示路由器,实际的网络连接以及每一个网络接口设备的状态信息
netstat -untlp
- 容器端口映射的限制:虽然说每个容器之间,环境都是隔离的,但是宿主机每个端口都是一个。8888 端口被
redis002
容器绑定了,那么其它所有的容器都不可以使用 8888 这个端口了。
3.7 进入容器
- 进入容器方式 1:
# 只用 -i 参数时,由于没有分配伪终端,界面没有我们熟悉的 Linux 命令提示符,但命令执行结果仍然仍然可以返回。
# 当 -i -t 参数一起使用时,则可以看到我们熟悉的 Linux 命令提示符。
docker exec -it 容器名/容器ID /bin/bash
举例 1:
docker run -dit ubuntu
docker container ls
docker exec -i ddf bash
docker exec -it ddf bash
举例 2:进入前面的 redis001
容器,就可以输入命令 docker exec -it redis001 /bin/bash
。
可以看到,已经从主机 yangbaqiaun
跳到了容器 ID 对应下的 /data
,已经进入到容器内部了。
- 进入容器方式 2:
docker attach 容器名/容器ID
举例:
docker run -dit ubuntu
docker container ls
docker attach 12e
- 以上两种进入容器的方式,推荐使用第一种
exec
方式。
3.8 从容器内退出到自己的服务器
# 1. 直接退出:未添加-d(持久化运行容器)时,执行此参数容器会被关闭
exit
# 2. 无论是否添加 -d 参数,执行此命令,容器都不会被关闭
从键盘按下:Ctrl + p + q
3.9 启动容器
docker start 容器名/容器ID
3.10 重启容器
docker restart 容器名/容器ID
3.11 kill 容器
docker kill 容器名/容器ID
3.12 容器文件拷贝
- 无论容器是否开启,都可以进行拷贝。
docker cp 容器ID/名称:文件路径 要拷贝到外部的路径 | 要拷贝到外部的路径 容器ID/名称:文件路径
# 从容器内拷出
docker cp 容器ID/名称:容器内路径 容器外路径
# 从外部拷贝文件到容器内
docker cp 容器外路径 容器ID/名称:容器内路径
3.13 查看容器日志
docker logs -f --tail=要查看末尾多少行 默认all 容器ID
3.14 设置开机自动启动容器
- 启动容器时,使用
docker run
命令时,添加参数--restart=always
便表示该容器随docker
服务启动而自动启动。
docker run -itd --name redis002 -p 8888:6379 --restart=always redis:5.0.5 /bin/bash
防止数据丢失的两种方法:
- 方法 1:数据挂载:简单来讲,就是将容器内的数据与外部宿主机文件绑定起来,类似一个双持久化,当容器删除时,宿主机文件数据目录仍在,下次启动容器只要将数据目录指向宿主机数据所在位置即可恢复。
-v 宿主机文件存储位置:容器内文件位置
如此操作,就将容器内指定文件挂载到了宿主机对应位置,-v
命令可以多次使用,即一个容器可以同时挂载多个文件。
-v 宿主机文件存储位置:容器内文件位置 -v 宿主机文件存储位置:容器内文件位置 -v 宿主机文件存储位置:容器内文件位置
举例:
# 运行一个 docker redis 容器 进行 端口映射 两个数据卷挂载 设置开机自启动
docker run -d -p 6379:6379 --name redis505 --restart=always -v /var/lib/redis/data/:/data -v /var/lib/redis/conf/:/usr/local/etc/redis/redis.conf redis:5.0.5 --requirepass "password"
- 方法 2:不想删容器,又想让这个容器设置开机自启动,那么我们修改其启动配置即可。
docker update --restart=always 容器Id/容器名
# 或
docker container update --restart=always 容器Id/容器名
3.15 更换容器名
docker rename 容器ID/容器名 新容器名
3.16 导出和导入
- 导出容器
如果要导出本地某个容器,可以使用 docker export
命令。
举例:
docker container ls -a
docker export ddfc038b5dc2 > ubuntu.tar
这样将导出容器快照到本地文件。
- 导入容器快照
可以使用 docker import
从容器快照文件中再导入为镜像。
举例:
cat ubuntu.tar | docker import - test/ubuntu:v1.0
docker image ls
此外,也可以通过指定 URL 或者某个目录来导入,例如
docker import http://example.com/exampleimage.tgz example/imagerepo
注:用户既可以使用 docker load
来导入镜像存储文件到本地镜像库,也可以使用 docker import
来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
3.17 在容器和主机之间复制文件/文件夹
- 语法格式
# 从容器里面拷文件到宿主机
docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径
举例:docker cp project:/opt/cdc.txt /home/
# 从宿主机拷文件到容器里面
docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径
举例:docker cp /home/ccc.txt project:/opt/
【注意】:不管容器有没有启动,拷贝命令都会生效。如果拷贝的内容有重复,会直接覆盖,不会询问。
另一种:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
# option:-L,保持源目标中的链接
- SRC_PATH 和 DEST_PATH 说明:
- SRC_PATH 指定一个文件,若 DEST_PATH 不存在,创建 DEST_PATH 所需的文件夹,文件正常保存到 DEST_PATH 中。
- 若 DEST_PATH 不存在,并以 / 结尾
错误:目标目录必须存在 - 若 DEST_PATH 存在并且是一个文件,目标被源文件的内容覆盖。
- 若 DEST_PATH 存在并且是目录,使用 SRC_PATH 中的基本名称将文件复制到此目录中。
- SRC_PATH 指定目录,若 DEST_PATH 不存在,将 DEST_PATH 创建为目录,并将源目录的内容复制到该目录中。
- 若 DEST_PATH 存在并且是一个文件
错误:无法将目录复制到文件 - 若 DEST_PATH 存在并且是目录,SRC_PATH 不以
/.
结尾,源目录复制到此目录;SRC_PATH 以/.
结尾,源目录的内容被复制到该目录中。